Consulta muito complicada
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;
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
Curtidas 0
Respostas
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;
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
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!
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
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...
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
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;
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
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...
sendo que posso fazer a consulta no litbox com 3 ou mais dados para ser impresso...
GOSTEI 0
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+')');
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
21/08/2010
EMERSON obrigadão cara parabens deu certinho...
vlw abraçoss
vlw abraçoss
GOSTEI 0