Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renanbg

[Resolvido] Gerar relatorio com dados de 2 tables

Recommended Posts

Bom dia amigos.

 

Estou com um sistema em delphi 6, nele uso tables, datasources e querys.

 

Tenho 2 tables: tbduplicatas e tbvencidas. Elas possuem a mesma extrutura

 

Preciso gerar um relatorio que me traga os dados das duas tables

 

Atualmente faço a pesquisa apenas na tbduplicatas com o codigo abaixo

 

frmrelduplicatas.Query1.Close;
  frmrelduplicatas.Query1.SQL.Clear;
  frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';
  frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
  frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
  frmrelduplicatas.Query1.Prepare;
  frmrelduplicatas.Query1.Open;

Mudei esse codigo para:

 

frmrelduplicatas.Query1.Close;
  frmrelduplicatas.Query1.SQL.Clear;
  frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas, tbvencidas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';
  frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
  frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
  frmrelduplicatas.Query1.Prepare;
  frmrelduplicatas.Query1.Open;

Mas ele me traz 8 registros exatamente iguais

 

Onde estou errando?

 

Grato pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como estar tabelas não tem ligação de chaves entre elas, use o comando UNION ALL para assim conseguir trazer a informação das duas tabelas:

 

frmrelduplicatas.Query1.Close;
frmrelduplicatas.Query1.SQL.Clear;
frmrelduplicatas.Query1.SQL.Add('SELECT campo1, campo2');
frmrelduplicatas.Query1.SQL.Add('FROM tbduplicatas');
frmrelduplicatas.Query1.SQL.Add('WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"');

frmrelduplicatas.Query1.SQL.Add('UNION ALL');

frmrelduplicatas.Query1.SQL.Add('SELECT campo1, campo2');
frmrelduplicatas.Query1.SQL.Add('from tbvencidas');
frmrelduplicatas.Query1.SQL.Add('WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"');

frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
frmrelduplicatas.Query1.Prepare;
frmrelduplicatas.Query1.Open;

Cuide somente que a lista de campos no select deve de ser a mesma no union do select abaixo... ou seja, seguir a mesma ordem e tipo de campo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem sei que te dizer marcio, você salvou o meu dia :D

 

Testei em um dos relatorios aqui e deu 100% certo...

 

A tarde farei os demais relatorios

 

Muito obrigado por toda a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum...me esqueci de te perguntar

 

como nunca usei esse union como eu faço para usar o order by nesse codigo?

 

uso nos 2 select? ou apenas em 1 ?

 

queria ordenar por Num_doc

Compartilhar este post


Link para o post
Compartilhar em outros sites

O orderby precisa ser a última linha, pode colocar o nome do campo, mas caso de erro, coloque o número do campo, ou seja, digamos que tenha o seguinte SQL:

 

select tabela.campo1, tabela.campo2, tabela.campo3
from tabela

E deseja ordenar pelo campo2, pode fazer:

 

select tabela.campo1, tabela.campo2, tabela.campo3
from tabela
order by tabela.campo2

Mas caso de erro, pode tb fazer:

 

select tabela.campo1, tabela.campo2, tabela.campo3
from tabela
order by 2

Ou seja, o 2 representa o campo2, pois ele é o segundo campo no SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim:

 

frmrelduplicatas.Query1.Close;
frmrelduplicatas.Query1.SQL.Clear;
frmrelduplicatas.Query1.SQL.Add('SELECT Estabelecimento, Cedente, Data_doc, Num_doc, Valor, Vencimento');
frmrelduplicatas.Query1.SQL.Add('FROM tbduplicatas');
frmrelduplicatas.Query1.SQL.Add('WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"');
frmrelduplicatas.Query1.SQL.Add('UNION ALL');
frmrelduplicatas.Query1.SQL.Add('SELECT Estabelecimento, Cedente, Data_doc, Num_doc, Valor, Vencimento');
frmrelduplicatas.Query1.SQL.Add('from tbvencidas');
frmrelduplicatas.Query1.SQL.Add('WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"');
frmrelduplicatas.Query1.SQL.Add('order by Num_doc');
frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
frmrelduplicatas.Query1.Prepare;
frmrelduplicatas.Query1.Open;

não deu erro, mas tbm não ordenou, veja como ficou

 

Imagem Postada

 

então troquei a linha como mostra abaixo

 

frmrelduplicatas.Query1.SQL.Add('order by tbduplicatas.Num_doc');

tbm n deu erro, mas o resultado foi o mesmo da imagem acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não me engano o campo num_doc seu é do tipo STRING, e como ele sendo texto ele esta ordenando de forma correta, seguindo a tabela ASCII verá que esta certo... Deveria de ser integer, então iria ficar seqüêncial...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.