Consulta muito complicada

Delphi

21/08/2010

Pessoal tem com um problema em uam consulta dinamica para impressão de relatorio um cliente me pediu uma relatorio no qual ele possa selecionar 5 clientes e imprimir esse 5 clientes estou fazendo dessa forma....



conform imagem mostrada acima eu adiciono os dados neste ListBox posso adicionar o quanto de clientes eu quizer e depois no periodo fazer a impressão dos clientes... mas nao esta dano certo o codigo para fazer a consulta e impressão é este:


sempre q eu add a um paceinte no listbox ele vai para o mensabox e fala que não tem dados para impressão...

Function TF_ExamesPeriodo.Validacao : Boolean;
var
 sItem,
 sSerie,
 sPavienteDe,
 sPacienteA: String;
 iCount : Integer;
Begin
  Result := False;

  if lstb_paciente.Items.Count > 0 then
  begin
    sFiltroPaciente := TStringList.Create;
    for iCount := 0 to lstb_paciente.Items.Count - 1 do
    begin
      sItem   := lstb_paciente.Items.Strings[iCount];
     //  sSerie  := Copy(sItem,Pos('[',sItem)+1,3);
     //  Delete(sSerie,Pos(' ',sSerie),1);
     //  Delete(sSerie,Pos(']',sSerie),1);
      Delete(sItem,1,Pos('[',sItem));
      sPavienteDe := Copy(sItem,Pos('[',sItem)+1,10);
      Delete(sItem,1,Pos('[',sItem));
      sPacienteA  := Copy(sItem,Pos('[',sItem)+1,10);
      sFiltroPaciente.Add('AND ((c_paciente BETWEEN '+sPavienteDe+' AND '+sPacienteA+'))');
    end;
  end;
  With DM1.Rel Do
  Begin
    Close;
    SQL.Clear;
    SQL.Add( ' Select * ' );
    SQL.Add( ' From  Pacexa  ' );
    SQL.Add( ' Where Data >= :P00 ' );
    SQL.Add( '   And Data <= :P01 ' );
    SQL.Add( '   And C_Paciente >= :P02 ' );
    SQL.Add( '   And C_Paciente <= :P03 ' );
    SQL.Add( ' Order by Data');
    Params[00].AsDate   := EdData1.Date;
    Params[01].AsDate   := EdData2.Date;
    Params[02].AsString := paciente_de.Text;
    Params[03].AsString := paciente_a.Text;
    Open;

    if not (sFiltroPaciente = nil) then
     begin
      SQL.Add(sFiltroPaciente.Text);
      sFiltroPaciente.Free;
      sFiltroPaciente := nil;
     end;

    If IsEmpty Then
    Begin
      MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0);
      Exit;
    End;
    DM1.Empresa.Close;
    DM1.Empresa.Open;
  End;
  Result := True;
End;
Laelson Fagundes

Laelson Fagundes

Curtidas 0

Respostas

Laelson Fagundes

Laelson Fagundes

21/08/2010

Pessoal tem com um problema em uam consulta dinamica para impressão de relatorio um cliente me pediu uma relatorio no qual ele possa selecionar 5 clientes e imprimir esse 5 clientes estou fazendo dessa forma....



conform imagem mostrada acima eu adiciono os dados neste ListBox posso adicionar o quanto de clientes eu quizer e depois no periodo fazer a impressão dos clientes... mas nao esta dano certo o codigo para fazer a consulta e impressão é este:


sempre q eu add a um paceinte no listbox ele vai para o mensabox e fala que não tem dados para impressão...

Function TF_ExamesPeriodo.Validacao : Boolean;
var
 sItem,
 sSerie,
 sPavienteDe,
 sPacienteA: String;
 iCount : Integer;
Begin
  Result := False;

  if lstb_paciente.Items.Count > 0 then
  begin
    sFiltroPaciente := TStringList.Create;
    for iCount := 0 to lstb_paciente.Items.Count - 1 do
    begin
      sItem   := lstb_paciente.Items.Strings[iCount];
     //  sSerie  := Copy(sItem,Pos('[',sItem)+1,3);
     //  Delete(sSerie,Pos(' ',sSerie),1);
     //  Delete(sSerie,Pos(']',sSerie),1);
      Delete(sItem,1,Pos('[',sItem));
      sPavienteDe := Copy(sItem,Pos('[',sItem)+1,10);
      Delete(sItem,1,Pos('[',sItem));
      sPacienteA  := Copy(sItem,Pos('[',sItem)+1,10);
      sFiltroPaciente.Add('AND ((c_paciente BETWEEN '+sPavienteDe+' AND '+sPacienteA+'))');
    end;
  end;
  With DM1.Rel Do
  Begin
    Close;
    SQL.Clear;
    SQL.Add( ' Select * ' );
    SQL.Add( ' From  Pacexa  ' );
    SQL.Add( ' Where Data >= :P00 ' );
    SQL.Add( '   And Data <= :P01 ' );
    SQL.Add( ' Order by Data');
    Params[00].AsDate   := EdData1.Date;
    Params[01].AsDate   := EdData2.Date;
     Open;

    if not (sFiltroPaciente = nil) then
     begin
      SQL.Add(sFiltroPaciente.Text);
      sFiltroPaciente.Free;
      sFiltroPaciente := nil;
     end;

    If IsEmpty Then
    Begin
      MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0);
      Exit;
    End;
    DM1.Empresa.Close;
    DM1.Empresa.Open;
  End;
  Result := True;
End;
GOSTEI 0
William Galleti

William Galleti

21/08/2010

ja que voce esta tratando o codigo do paciente como string, acho que deve usar o complemento QuoteStr();
Exemplo:
Function TF_ExamesPeriodo.Validacao : Boolean;var sItem, sSerie, sPavienteDe, sPacienteA: String; iCount : Integer;Begin  Result := False;
  if lstb_paciente.Items.Count > 0 then  begin    sFiltroPaciente := TStringList.Create;    for iCount := 0 to lstb_paciente.Items.Count - 1 do    begin      sItem   := lstb_paciente.Items.Strings[iCount];     //  sSerie  := Copy(sItem,Pos('[',sItem)+1,3);     //  Delete(sSerie,Pos(' ',sSerie),1);     //  Delete(sSerie,Pos(']',sSerie),1);      Delete(sItem,1,Pos('[',sItem));      sPavienteDe := Copy(sItem,Pos('[',sItem)+1,10);      Delete(sItem,1,Pos('[',sItem));      sPacienteA  := Copy(sItem,Pos('[',sItem)+1,10);      sFiltroPaciente.Add('AND ((c_paciente BETWEEN '+QuotedStr(sPavienteDe)+' AND '+QuotedStr(sPacienteA)a+'))');    end;  end;  With DM1.Rel Do  Begin    Close;    SQL.Clear;    SQL.Add( ' Select * ' );    SQL.Add( ' From  Pacexa  ' );    SQL.Add( ' Where Data >= :P00 ' );    SQL.Add( '   And Data <= :P01 ' );    SQL.Add( ' Order by Data');    Params[00].AsDate   := EdData1.Date;    Params[01].AsDate   := EdData2.Date;     Open;
    if not (sFiltroPaciente = nil) then     begin      SQL.Add(sFiltroPaciente.Text);      sFiltroPaciente.Free;      sFiltroPaciente := nil;     end;
    If IsEmpty Then    Begin      MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0);      Exit;    End;    DM1.Empresa.Close;    DM1.Empresa.Open;  End;  Result := True;End;
Espero ter ajudado!
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

21/08/2010

Ainda continua pulando direto para a MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0);

se tiver uma outra forma de fazer a consulta e depois imprimir oq eu quero com uam seleção é bem vindo...

estou fazendo umas pesquizas mas nao encontrei nada ainda e estou batanhando nesse ai...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/08/2010

a consulta está errada e o código que procura pelo intervalo de pacientes também está errado.

creio que o correto seja isso:

Function TF_ExamesPeriodo.Validacao: Boolean;
var
 sItem,
 sSerie,
 sPacienteDe, sPacienteAte: String;
 iCount : Integer;
 sFiltroPaciente: TStringList;
Begin
  Result := False;

  try
    sFiltroPaciente := TStringList.Create;

    if lstb_paciente.Items.Count > 0 then
    begin
      for iCount := 0 to lstb_paciente.Items.Count - 1 do
      begin
        sItem   := lstb_paciente.Items.Strings[iCount];
        Delete(sItem,1,Pos('[',sItem));
        sPacienteDe := Copy(sItem,1,Pos(']',sItem)-1);
        Delete(sItem,1,Pos('[',sItem));
        sPacienteAte  := Copy(sItem,1,Pos(']',sItem)-1);
        sFiltroPaciente.Add(' AND (c_paciente BETWEEN '+ sPacienteDe +' AND '+ sPacienteAte +')');
      end;
    end;

    with DM1.Rel Do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select * ');
      SQL.Add('From Pacexa ');
      SQL.Add('Where (Data between :P00 and :P01) ' );

      // se foi adicionado algum paciente, faço o filtro
      if sFiltroPaciente <> nil then
        SQL.Add(sFiltroPaciente.Text);

      SQL.Add('Order by Data');

      // preencho os parametros fixos
      Params[00].AsDate := EdData1.Date;
      Params[01].AsDate := EdData2.Date;
      Open;

      if IsEmpty Then
        MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0)
      else
        Result := True;
    end;
  finally
    FreeAndNil(sFiltroPaciente);
  end;
end;


GOSTEI 0
Laelson Fagundes

Laelson Fagundes

21/08/2010

Emerson funcionou a consulta certinha porem ele so me executa se tiver um item no ListBox se tiver 2 ou mais ele da a mensagem que MessageDlg('Dados não encontrados para o relatório.', MtInformation,[MbOk],0)


sendo que posso fazer a consulta no litbox com 3 ou mais dados para ser impresso...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/08/2010

basta alterar o trecho no qual o filtro é montado:

sCondicao := '';
for iCount := 0 to lstb_paciente.Items.Count - 1 do
begin
  sItem   := lstb_paciente.Items.Strings[iCount];
  Delete(sItem,1,Pos('[',sItem));
  sPacienteDe := Copy(sItem,1,Pos(']',sItem)-1);
  Delete(sItem,1,Pos('[',sItem));
  sPacienteAte  := Copy(sItem,1,Pos(']',sItem)-1);
  if iCount > 0 then sCondicao := ' OR ';
  sFiltroPaciente.Add(sCondicao+'(c_paciente BETWEEN '+ sPacienteDe +' AND '+ sPacienteAte +')');
end;



e também o trecho onde o filtro será utilizado:

// se foi adicionado algum paciente, faço o filtro
if sFiltroPaciente <> nil then
  SQL.Add(' AND ('+sFiltroPaciente.Text+')');

GOSTEI 0
Laelson Fagundes

Laelson Fagundes

21/08/2010

EMERSON obrigadão cara parabens deu certinho...

vlw abraçoss
GOSTEI 0
POSTAR