Renanbg 1 Denunciar post Postado Julho 18, 2008 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
marcio.theis 3 Denunciar post Postado Julho 18, 2008 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
Renanbg 1 Denunciar post Postado Julho 18, 2008 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
marcio.theis 3 Denunciar post Postado Julho 18, 2008 beleza... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Julho 18, 2008 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
marcio.theis 3 Denunciar post Postado Julho 18, 2008 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
Renanbg 1 Denunciar post Postado Julho 18, 2008 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 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
marcio.theis 3 Denunciar post Postado Julho 18, 2008 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
Renanbg 1 Denunciar post Postado Julho 18, 2008 Exato...fiz então ordenado por cedente e deu certo Obrigado Marcio Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Julho 18, 2008 beleza :D Compartilhar este post Link para o post Compartilhar em outros sites