Master Sources em relatório
Pessoal, estou precisando fazer um relatorio, que imagino que tenho que utilizar um master source, mas não estou conseguindo:As tabelas:Tenho tabelas de entrada e saida:Entrada produto Pai (Entrada_pai) com cód. data e cliente, esta relacionada com Tabela Entrada Produto (Entrada_produto) que contem a quantia.Da mesma forma Saida Pai com cód. data e cliente, relacionada com Saida Pai Produtos, onde estão os produtos.
Nesse caso, ja utilizo master source nas 2 tabelas entrada e nas 2 tabelas saida.
Bom agora, que não sei como fazer: No relatório tenho que colocar, tanto a entrada quanto a saida do produto. Ou seja, na data que tenha registro da entrada vai no relatorio, e na data com saida, também apareça no relatório.
Estou usando Quick report. com ADOtable e ADOquery.Ja tentei utilizar master source para isso, mas não consegui. Tentei com campo virtual, tb não consegui, pq ele registra apenas o 1º registro.
Não sei se fui claro, se alguem tiver alguma idéia, põe aeeeeeeeeeeeeeeeeeeee!!!valew
Nesse caso, ja utilizo master source nas 2 tabelas entrada e nas 2 tabelas saida.
Bom agora, que não sei como fazer: No relatório tenho que colocar, tanto a entrada quanto a saida do produto. Ou seja, na data que tenha registro da entrada vai no relatorio, e na data com saida, também apareça no relatório.
Estou usando Quick report. com ADOtable e ADOquery.Ja tentei utilizar master source para isso, mas não consegui. Tentei com campo virtual, tb não consegui, pq ele registra apenas o 1º registro.
Não sei se fui claro, se alguem tiver alguma idéia, põe aeeeeeeeeeeeeeeeeeeee!!!valew
Maiquelnet
Curtidas 0
Respostas
Eriley Barbosa
25/08/2010
Acho que não precisa Master Source, no seu ADOquery na propriedade SQL, coloque este código:
SELECT
'Entrada' "MOVIMENTO",
COD, DATA, CLIENTE
FROM
ENTRADA_PRODUTO
UNION ALL
SELECT
'Saída' "MOVIMENTO",
COD, DATA, CLIENTE
FROM
SAIDA_PRODUTO
Veja que você tem 2 selects unidos por um union all, se tiver alguma condição (Where, and) deve ser colocado para os dois selects.
GOSTEI 0
Maiquelnet
25/08/2010
Acho que não precisa Master Source, no seu ADOquery na propriedade SQL, coloque este código:
SELECT
...
SAIDA_PRODUTO
...
SELECT
...
SAIDA_PRODUTO
...
Bueno!!!Tentei como vc disse, mas axo que não dara certo. Primeiro deu o erro: Não foi encontrado o valor XXX na ADOQuery... o que achei estranho... e Segundo, utilizarei apenas 2 tabelas.
O código q usai foi mais ou menos isso:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select codigo_entrada_med, Quantia_entrada from entrada_med union all');ADOQuery.SQL.Add('select cod_saida, Quantia_saida from saida_med');ADOQuery.Open;QuickRep.Preview;Da maneira que estava tentando era:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select * from saida_pai, saida_med, entrada_pai, medicamento where');ADOQuery.SQL.Add('saida_pai.Cod_saida_pai=saida_med.cod_saida_filho_pai and');ADOQuery.SQL.Add('saida_med.medicamento=medicamento.cod_med and');ADOQuery.SQL.Add('saida_med.medicamento=:Texto0 and');ADOQuery.SQL.Add('saida_pai.Data_saida>=:Data1 and');ADOQuery.SQL.Add('saida_pai.Data_saida<=:Data2 order by saida_pai.Data_saida');ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;Mas o que pude perceber, é que usando o Union All, ele estaria trabalhando com 2 Tabelas, e precisaria Trabalhar com 4 Tabelas.
Para ser mais claro, coloquei uma print do modelo ER do banco com os dados que preciso grifados...
Oqe seria mais adequado? Apenas SQL na query, Master Source, ou teria alguma outra alternativa para isto?E agradeço a ajuda dos companheiros!!!!!Ateh...
GOSTEI 0
Pietro Braga
25/08/2010
Olá amigo... que tipo de data é o campo saida_med.medicamento?
Se entendi bem, primeiro na consulta você diz que ele deve ser igual a um campo medicamento.cod_med, que suponho seja Integer em segudia informa que deve também ser igual ao a Var Texto0. Não virá daí o problema?
Desculpe se falei alguma besteira...
Se entendi bem, primeiro na consulta você diz que ele deve ser igual a um campo medicamento.cod_med, que suponho seja Integer em segudia informa que deve também ser igual ao a Var Texto0. Não virá daí o problema?
Desculpe se falei alguma besteira...
GOSTEI 0
Pietro Braga
25/08/2010
Perdão, acho que entendi o que é o campo saida_med.medicamento. Ja tive problemas com consultas envolvendo datas no firebird, pois o separador das datas deveria ser um '.' . ele está gerando algum erro ou não retorna nenhum dado?
tente isso:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select * from saida_pai, saida_med, entrada_pai, medicamento where');ADOQuery.SQL.Add('saida_pai.Cod_saida_pai=saida_med.cod_saida_filho_pai and');ADOQuery.SQL.Add('saida_med.medicamento=medicamento.cod_med and');ADOQuery.SQL.Add('saida_med.medicamento=:Texto0 and');ADOQuery.SQL.Add('saida_pai.Data_saida Between :Data1 and :Data2);
ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;
Fiz essa função para formatar a data.
function FormataData(Str:String): String; stdcall; export;
Var
x : Integer;
Begin
For x := 1 to Length(Str) do
if (Pos(Str[x],#47)<>0) or (Pos(Str[x],#45) <> 0) Then
Str[x]:= #46;
Result := Str;
end;
tente isso:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select * from saida_pai, saida_med, entrada_pai, medicamento where');ADOQuery.SQL.Add('saida_pai.Cod_saida_pai=saida_med.cod_saida_filho_pai and');ADOQuery.SQL.Add('saida_med.medicamento=medicamento.cod_med and');ADOQuery.SQL.Add('saida_med.medicamento=:Texto0 and');ADOQuery.SQL.Add('saida_pai.Data_saida Between :Data1 and :Data2);
ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;
Fiz essa função para formatar a data.
function FormataData(Str:String): String; stdcall; export;
Var
x : Integer;
Begin
For x := 1 to Length(Str) do
if (Pos(Str[x],#47)<>0) or (Pos(Str[x],#45) <> 0) Then
Str[x]:= #46;
Result := Str;
end;
GOSTEI 0
Maiquelnet
25/08/2010
Olá amigo... que tipo de data é o campo saida_med.medicamento?
Se entendi bem, primeiro na consulta você diz que ele deve ser igual a um campo medicamento.cod_med, que suponho seja Integer em segudia informa que deve também ser igual ao a Var Texto0. Não virá daí o problema?
Desculpe se falei alguma besteira...
Se entendi bem, primeiro na consulta você diz que ele deve ser igual a um campo medicamento.cod_med, que suponho seja Integer em segudia informa que deve também ser igual ao a Var Texto0. Não virá daí o problema?
Desculpe se falei alguma besteira...
buenoo campo saida_med.medicamento é integer mesmo...vc pensou certo mesmo... é que eu to procurando pelo código do medicamento, pois assim eu evito mais relacionamentos ou campos virtuais...
GOSTEI 0
Maiquelnet
25/08/2010
Perdão, acho que entendi o que é o campo saida_med.medicamento. Ja tive problemas com consultas...
Result := Str;
end;
Result := Str;
end;
Mas o problema é que o caso não é erro de retorno, etcc.....eu consigo fazer este relatório utilizando apenas 2 tabelas... exemplo: a saida_pai com saida_medicamento...
só que quando tento com 4 tabelas complica... isso pq as datas ficam na tabela_pai, mas os dados dos medicamentos nas tabelas_filho, ou seja, tabela_med....
Dae eu preciso lista no relatório tanto a entrada do medicamento, quanto a saida do medicamento.
alguma coisa tipo.
MEDICAMENTO --------- DATA ENTRADA -- QUANTIA ENTRADA --------- DATA SAIDA --- QUANTIA SAIDAPropanolol 01/02/2010 100 ------ --------Propanolol 05/02/2010 20----------------------------------------Estoque = 80 comprimidos.
Ae preciso relacionar as 4 tabelas que postei acima... a questão de tipo das variaves ta tudo certo, oque me faltou mesmo foi bagage pra fazer esse relatório...e estou usando quick report... não sei se tem outra ferramenta mais adequada pra isso... ou se só pelo SQL eu consigo filtrar estes dados...um camarada acima, me citou sobre o 'UNION ALL', mas não consegui fazer... e imaginei que esse comando fosse pra apenas 2 tabelas...Sera que por data source , data field eu consigo?ou isso não é pra mim, mesmo? eheh
GOSTEI 0
Eriley Barbosa
25/08/2010
Pelo que passou o que você quer é isso:
MEDICAMENTO --------- DATA ENTRADA -- QUANTIA ENTRADA --------- DATA SAIDA --- QUANTIA SAIDA
Propanolol 01/02/2010 100 ------ --------
Propanolol 05/02/2010 20
----------------------------------------
Estoque = 80 comprimidos.
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add(' MEDICAMENTO M ,');
ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' ENTRADA_MED EM,');
ADOQuery.SQL.Add(' SAIDA_PAI S ,');
ADOQuery.SQL.Add(' SAIDA_MED SM');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO = M.COD_MED');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND EM.MEDICAMENTO = M.COD_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview; Só o totalizador que tem que ser feito no braço, mas vamos por partes, vamos fazer exibir dados no relatório e depois fazemos o totalizador. Leia meu artigo, pode ser de seu interesse, ou repasse a outras pessoas: https://www.devmedia.com.br/post-17935-Criando-uma-barra-de-ferramentas-para-aplicacoes-MDI-com-as-operacoes-de-navegacao-incluir-excluir-salvar-e-cancelar.html
Bueno!!! Tentei como vc disse, mas axo que não dara certo. Primeiro deu o erro: Não foi encontrado o valor XXX na ADOQuery... o que achei estranho... e Segundo, utilizarei apenas 2 tabelas.
O código q usai foi mais ou menos isso:
Da maneira que estava tentando era:
Nesse caso estava usando 1 AdoQuery e 1 AdoTable, relacionados pelo Master Source, Field.
Mas o que pude perceber, é que usando o Union All, ele estaria trabalhando com 2 Tabelas, e precisaria Trabalhar com 4 Tabelas.
Para ser mais claro, coloquei uma print do modelo ER do banco com os dados que preciso grifados...
Oqe seria mais adequado? Apenas SQL na query, Master Source, ou teria alguma outra alternativa para isto? E agradeço a ajuda dos companheiros!!!!! Ateh...
Propanolol 01/02/2010 100 ------ --------
Propanolol 05/02/2010 20
----------------------------------------
Estoque = 80 comprimidos.
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add(' MEDICAMENTO M ,');
ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' ENTRADA_MED EM,');
ADOQuery.SQL.Add(' SAIDA_PAI S ,');
ADOQuery.SQL.Add(' SAIDA_MED SM');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO = M.COD_MED');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND EM.MEDICAMENTO = M.COD_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview; Só o totalizador que tem que ser feito no braço, mas vamos por partes, vamos fazer exibir dados no relatório e depois fazemos o totalizador. Leia meu artigo, pode ser de seu interesse, ou repasse a outras pessoas: https://www.devmedia.com.br/post-17935-Criando-uma-barra-de-ferramentas-para-aplicacoes-MDI-com-as-operacoes-de-navegacao-incluir-excluir-salvar-e-cancelar.html
Acho que não precisa Master Source, no seu ADOquery na propriedade SQL, coloque este código:
SELECT
...
SAIDA_PRODUTO
...
SELECT
...
SAIDA_PRODUTO
...
Bueno!!! Tentei como vc disse, mas axo que não dara certo. Primeiro deu o erro: Não foi encontrado o valor XXX na ADOQuery... o que achei estranho... e Segundo, utilizarei apenas 2 tabelas.
O código q usai foi mais ou menos isso:
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select codigo_entrada_med, Quantia_entrada from entrada_med union all');
ADOQuery.SQL.Add('select cod_saida, Quantia_saida from saida_med');
ADOQuery.Open;
QuickRep.Preview;
Da maneira que estava tentando era:
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select * from saida_pai, saida_med, entrada_pai, medicamento where');
ADOQuery.SQL.Add('saida_pai.Cod_saida_pai=saida_med.cod_saida_filho_pai and');
ADOQuery.SQL.Add('saida_med.medicamento=medicamento.cod_med and');
ADOQuery.SQL.Add('saida_med.medicamento=:Texto0 and');
ADOQuery.SQL.Add('saida_pai.Data_saida>=:Data1 and');
ADOQuery.SQL.Add('saida_pai.Data_saida<=:Data2 order by saida_pai.Data_saida');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview;
Mas o que pude perceber, é que usando o Union All, ele estaria trabalhando com 2 Tabelas, e precisaria Trabalhar com 4 Tabelas.
Para ser mais claro, coloquei uma print do modelo ER do banco com os dados que preciso grifados...
Oqe seria mais adequado? Apenas SQL na query, Master Source, ou teria alguma outra alternativa para isto? E agradeço a ajuda dos companheiros!!!!! Ateh...
GOSTEI 0
Eriley Barbosa
25/08/2010
Leia o meu artigo, pode lhe interessar, divulgue-o:
https://www.devmedia.com.br/post-17935-Criando-uma-barra-de-ferramentas-para-aplicacoes-MDI-com-as-operacoes-de-navegacao-incluir-excluir-salvar-e-cancelar.html
GOSTEI 0
Maiquelnet
25/08/2010
Leia o meu artigo, pode lhe interessar, divulgue-o:
https://www.devmedia.com.br/post-17935-Criando-uma-barra-de-ferramentas-para-aplicacoes-MDI-com-as-operacoes-de-navegacao-incluir-excluir-salvar-e-cancelar.html
https://www.devmedia.com.br/post-17935-Criando-uma-barra-de-ferramentas-para-aplicacoes-MDI-com-as-operacoes-de-navegacao-incluir-excluir-salvar-e-cancelar.html
eriley, tentei o seu código...não esta dando erro, mas também não esta apresentando resultados...fiz algumas modificações:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('SELECT MEDICAMENTO.cod_med, SAIDA_PAI.Data_saida, SAIDA_MED.medicamento, SAIDA_MED.quantia_saida,');ADOQuery.SQL.Add(' ENTRADA_PAI.Data_entrada, ENTRADA_MED.Medicamento, ENTRADA_MED.Quantia_entrada,');ADOQuery.SQL.Add(' SAIDA_PAI.Cod_saida_pai, SAIDA_MED.cod_saida, ENTRADA_PAI.Cod_entra_pai, ENTRADA_MED.codigo_entrada_med');
ADOQuery.SQL.Add('FROM SAIDA_PAI, SAIDA_MED, ENTRADA_PAI, ENTRADA_MED, MEDICAMENTO');
ADOQuery.SQL.Add('WHERE SAIDA_PAI.Cod_saida_pai=SAIDA_MED.cod_saida_filho_pai');ADOQuery.SQL.Add('AND ENTRADA_PAI.Cod_entra_pai=ENTRADA_MED.codigo_entrada_med');ADOQuery.SQL.Add('AND MEDICAMENTO.cod_med=saida_med.medicamento');ADOQuery.SQL.Add('AND MEDICAMENTO.cod_med=entrada_med.medicamento');ADOQuery.SQL.Add('AND MEDICAMENTO.cod_med=:Texto0');ADOQuery.SQL.Add('AND SAIDA_PAI.Data_saida>=:Data1');ADOQuery.SQL.Add('AND SAIDA_PAI.Data_saida<=:Data2');ADOQuery.SQL.Add('ORDER BY SAIDA_PAI.data_saida');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;Então... inicialmente ele seleciona os campos em questão... depois ele faz os relacionamentos e por fim filtra pelo código do medicamento e pelas datas...
Desta forma o relatório sai em branco, como se nenhum valor foi aceito pelas condições... só q os valores estão cadastrados, Então fiz o teste de tirar a linha abaixo:
ADOQuery.SQL.Add('AND ENTRADA_PAI.Cod_entra_pai=ENTRADA_MED.codigo_entrada_med');E desta forma ele lista todas as saidas de medicamentos... um pouco duplicado, mas apresenta os resultados...nesta condição cheguei na seguinte dúvida:
Será que nenhum valor passou no código, por causa das data de entrada e data saida???Ou seja, só se a data de entrada e saida for igual, não sendo ele não aprenseta??
sempre com esse problema de usar 4 ou 5 tabelas, como neste caso!!!!
GOSTEI 0
Eriley Barbosa
25/08/2010
Para mim o problema está nestas duas linhas:
ADOQuery.SQL.Add('AND SAIDA_PAI.Data_saida>=:Data1');
ADOQuery.SQL.Add('AND SAIDA_PAI.Data_saida<=:Data2');
Pois para ser apresentado o medicamento ele tem que ter saído no período, se ele tiver entrado não vai aparecer, póis, você procura pela saída.
Já se você fizer o contrario procurar pela entrada:
ADOQuery.SQL.Add('AND ENTRADA_PAI.Data_entrada>=:Data1');
ADOQuery.SQL.Add('AND ENTRADA_PAI.Data_entrada<=:Data2');
Serão listados os medicamentos que tiverão entrada e a data de saida será preenchida somente se tiver saído o medicamento.
O certo seria você ter 3 querys no seu relatório:
Uma listando os medicamentos, outra listando as entradas e outra listando as saídas, dai no relatório, você faria assim:
1 banda Detail para listar os medicamentos;
1 banda childband para listar as entradas;
1 banda childband para listar as saídas
GOSTEI 0
Eriley Barbosa
25/08/2010
Ah, esqueci, não retire aquela linha, pois, talvez sem ela os registros estejam sendo duplicados, tente faser um left join naquela linha.
GOSTEI 0
Maiquelnet
25/08/2010
O certo seria você ter 3 querys no seu relatório:
Uma listando os medicamentos, outra listando as entradas e outra listando as saídas, dai no relatório, você faria assim:
1 banda Detail para listar os medicamentos;
1 banda childband para listar as entradas;
1 banda childband para listar as saídas
Ok, estou tentando fazer aki como vc me passou, só q estou com umas dúvidas:
Primeiro mudei o relatório, coloquei:1 Banda detail ligada a medicamento (Dataset: AdoQuery1);
1 childband para as entradas, (LinkBand: BandDetail1) e os QRDBText ligados ao AdoQuery2) entrada_pai e entrada_med.
1 childband para as saidas. (LinkBand: BandDetail1) e os QRDBText ligados ao AdoQuery3) saida_pai e saida_med.
O quick report o DataSet esta no AdoQuery1, que é medicamentos. Sera q esta certo??????????????????
Primeiro tentei fazer um teste só para ver. Mas no código coloquei apenas: Aki não sabia como fazer!!!!!
ADOQuery1.SQL.Add('select cod_med from medicamento');ADOQuery1.SQL.Add('where cod_med=:Texto0');
ADOQuery2.SQL.Add('select * from entrada_pai, entrada_med');
ADOQuery3.SQL.Add('select * from saida_pai, saida_med');
ADOQuery1.Parameters[0].Value:=DBEdit1.Text;QuickRep1.Preview;fiz um teste, até porque nunca tinha usado mais querys em um mesmo relatório!!!Mas não apareceu nada no relatório.Tudo em branco!!!
GOSTEI 0
Eriley Barbosa
25/08/2010
O linkband da childband2 tem que apontar para childband1.
Adoquery2 e AdoQuery3, tem que receber por parametro o codigo do medicamento da Adoquery1 e as datas de entrada e saida, senão não tem sentido o relatório. Na Adoquery1 ta faltando o nome do medicamento.
Faça isso no beforeprint da childband1 e da childband2 ou no afterscroll da adoquery1.
No código que passou não tem o open das querys antes do preview.
Cade o Adoquery1.open, Adoquery2.open e Adoquery3.open?
Por isso seu relatório saiu em branco.
Faça as alterações que passei e retorne se houver algum erro.
ADOQuery1.SQL.Add('select cod_med from medicamento');
ADOQuery1.SQL.Add('where cod_med=:Texto0');
ADOQuery2.SQL.Add('select * from entrada_pai, entrada_med');
ADOQuery3.SQL.Add('select * from saida_pai, saida_med');
ADOQuery1.Parameters[0].Value:=DBEdit1.Text;
QuickRep1.Preview;
GOSTEI 0
Maiquelnet
25/08/2010
O linkband da childband2 tem que apontar para childband1....
Faça as alterações que passei e retorne se houver algum erro.
Faça as alterações que passei e retorne se houver algum erro.
tentei inúmeras vezes, com várias e várias alterações... mas nenhuma foi bem sucedida...Primeiro: fiz com 1 detail e 2 childs... usando 3 querys!!! Utilizando os códigos acima... corrigidos!!O resultado saia apenas o Detail... e nada nos childs.
Então, mudei... coloquei na query1 já o filtro que eu utilizaria na query2, ou seja,
ADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select * from entrada_pai, entrada_med, medicamento');ADOQuery1.SQL.Add('where entrada_pai.cod_entra_pai=entrada_med.codigo_entrada_med');ADOQuery1.SQL.Add('and medicamento.cod_med=entrada_med.medicamento');ADOQuery1.SQL.Add('and medicamento.cod_med=:Texto0');ADOQuery1.Parameters[0].Value:=DBEdit1.Text;ADOQuery1.Open;QuickRep.Preview;No QR utilizei 1 Detail e 1 ChildBand... Os dados da Childband não apareciam... mas o Detail sim, ou seja, se tivessem 4 registros na childband... o Detail aparecia 4 vezes, só os dados da child não apresentavam!!! Sendo que linkei a child ao detail...
Então mudei!!! Coloquei um QRGroup Footer e 1 Detail... Utilizando o mesmo código acima...Assim funcionou... No Groupfooter o nome do medicamento, e no Detail as datas e as quantidade entrada... Assim funciona! Mas é como se fosse um relatório de entrada de medicamentos!!!
Mas ainda faltava as saidas!!!!!Dae sim... tentei de inúmeras vezes, sem sucesso!!!!Utilizando 2 querys...a 1ª query selecionava as entradas... a 2ª as saidas!! A 1ª query (DetailBand) linkada no Group e a 2ª Query (ChildBand) linkada na (DetailBand)
ADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select * from entrada_pai, entrada_med, medicamento');ADOQuery1.SQL.Add('where entrada_pai.cod_entra_pai=entrada_med.codigo_entrada_med');ADOQuery1.SQL.Add('and medicamento.cod_med=entrada_med.medicamento');ADOQuery1.SQL.Add('and medicamento.cod_med=:Texto0');
ADOQuery2.Close;ADOQuery2.SQL.Clear;ADOQuery2.SQL.Add('select * from saida_pai, saida_med, medicamento');ADOQuery2.SQL.Add('where saida_pai.Cod_saida_pai=saida_med.cod_saida_filho_pai');ADOQuery2.SQL.Add('and medicamento.cod_med=saida_med.medicamento');ADOQuery2.SQL.Add('and medicamento.cod_med=:Texto0');
ADOQuery1.Parameters[0].Value:=DBEdit1.Text;ADOQuery2.Parameters[0].Value:=DBEdit1.Text;ADOQuery1.Open;ADOQuery2.Open;
QuickRep.Preview;Tambem fiz outros testes: linkar as 2 childsband na group... tb 2 childs na detail... A child1 no detail e a chil2 na child 1... A child1 no group e child2 no child1...Quando se usava o agrupamento pelo BandDetail ele lista apenas o Detail e nada nos childs! Como descrevi no início...Quando usava agrupamento pelo Group ele apresentava apenas 1 registro... Acho que o primeiro só!!!
Como não estava conseguindo... pensei em fazer apenas 1 Query com uma consulta aninhada!!!Filtrava as entradas e depois as aninhava as saidas na mesma query... só que dae essa query vai trabalhar com 5 tabelas... imagino que vai ficar bastante pesado!!!!!alguma idéia?
GOSTEI 0
Eriley Barbosa
25/08/2010
A group só exibe um registro por vez, a childband exibe 1 registro para cada detalhe e não uma lista, como a detail.
Tem que tentar fazer funcionar com aquele select que te passei, aquele que você tirou uma linha para fazer funcionar, lembra,?
Tente fazer os relacionamentos com Left Join, de uma pesquisada na internet por left join no sql, eu poderia fazer isso para você, mas teria de ter suas 5 tabelas para fazer isso.
Você teria de me passar o script com a criação das tabelas e o insert dos dados.
Você ta usando Access ou SQL Server?
Se estiver usando sql server podemos fazer com stored procedure, com tabela temporaria.
GOSTEI 0
Maiquelnet
25/08/2010
A group só exibe um registro por...
Pois é... quando usei um cabeçalho com o group do medicamento XXXX, os detail por exemplo de saída apareciam... e uma child para as entradas.... as saidas apareciam, mas os de entrada saiam em branco!!!! e nesse teria 1 ou 2 registros cadastrados apenas para fazer o teste!!! Imaginei q estava bem perto... só faltava algum detalhe... mas não descobri!!
O banco é em Access... usei pra facilitar... é um programa pequeno...
vou tentar bolar um sql com left join, então!!! só q não sou muito fera em sql... mas vou dar uma estudada!! depois posto aqui...só uma dúvida... no caso o left join vai listar todas movimentações do medicamento... entrada e saida... quando há ele lista e quando não há movimentação sai a linha em branco!!! seria + ou - isto?dae eu usaria 2 childs e 1 detail? isto?
e obrigado mais uma vez, por ta dedicando esse tempo pra um novato q nem eu... heheheateh!!!
GOSTEI 0
Eriley Barbosa
25/08/2010
Sim é isso que faz o left, se fizer 1 sql para as entradas e 1 para as saídas seria uma detail para as entradas e 1 child para as saidas, se fizer em 1 só sql será apenas uma detail, tentei fazer em 1 só roda ai e ve se deu?
Pelo que passou o que você quer é isso:
MEDICAMENTO --------- DATA ENTRADA -- QUANTIA ENTRADA --------- DATA SAIDA --- QUANTIA SAIDA
Propanolol 01/02/2010 100 ------ --------
Propanolol 05/02/2010 20
----------------------------------------
Estoque = 80 comprimidos. ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO M LEFTJOIN ENTRADA_MED EM');
ADOQuery.SQL.Add(' ON M.COD_MED = EM.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED SM');
ADOQuery.SQL.Add(' ON M.COD_MED = SM.MEDICAMENTO');
ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' SAIDA_PAI S ');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (E.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND E.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview;
MEDICAMENTO --------- DATA ENTRADA -- QUANTIA ENTRADA --------- DATA SAIDA --- QUANTIA SAIDA
Propanolol 01/02/2010 100 ------ --------
Propanolol 05/02/2010 20
----------------------------------------
Estoque = 80 comprimidos. ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO M LEFTJOIN ENTRADA_MED EM');
ADOQuery.SQL.Add(' ON M.COD_MED = EM.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED SM');
ADOQuery.SQL.Add(' ON M.COD_MED = SM.MEDICAMENTO');
ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' SAIDA_PAI S ');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (E.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND E.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview;
GOSTEI 0
Maiquelnet
25/08/2010
Sim é isso que faz...QuickRep.Preview;
Esta dando o seguinte erro: Erro de sintaxe (operador faltando) na expressão de consulta'Medicamento.COD_MED = Entrada_med.MEDICAMENTOLEFT JOIN SAIDA_MED.MedicamentoON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTOENTRADA_PAI'
Como meu sql é básicão... já me perdi nas linhas... o código q ajeitei foi esse:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('SELECT');ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');ADOQuery.SQL.Add('FROM');ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED.medicamento');ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTO');ADOQuery.SQL.Add(' ENTRADA_PAI ,');ADOQuery.SQL.Add(' SAIDA_PAI ');ADOQuery.SQL.Add('WHERE');ADOQuery.SQL.Add(' Saida_pai.COD_SAIDA_PAI = Saida_Med.COD_SAIDA');ADOQuery.SQL.Add('AND Entrada_pai.COD_ENTRADA_PAI = Entrada_Med.CODIGO_ENTRADA_MED');ADOQuery.SQL.Add('AND Saida_Med.MEDICAMENTO =:Texto0');ADOQuery.SQL.Add('AND ((Saida_pai.DATA_SAIDA >=:Data1');ADOQuery.SQL.Add('AND Saida_pai.DATA_SAIDA <=:Data2)');ADOQuery.SQL.Add('OR (Entrada_pai.DATA_ENTRADA >=:Data3');ADOQuery.SQL.Add('AND Entrada_pai.DATA_ENTRADA <=:Data4))'); ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;GOSTEI 0
Eriley Barbosa
25/08/2010
Vamos pegar esta parte abaixo:
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');
ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');
ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');
//Veja que sua tabela se chama Saida_med
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED.medicamento');
// Veja que você colocou no join Saida_medicamento
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTO');
//Veja que terminou os joins com Medicamento então na linha acima vai uma virgula antes de fecharem as aspas
ADOQuery.SQL.Add(' ENTRADA_PAI ,');
ADOQuery.SQL.Add(' SAIDA_PAI ');
Logo tem que ficar assim:
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');
ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');
ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED.medicamento');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = SAIDA_MED.MEDICAMENTO,');
ADOQuery.SQL.Add(' ENTRADA_PAI ,');
ADOQuery.SQL.Add(' SAIDA_PAI ');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' Saida_pai.COD_SAIDA_PAI = Saida_Med.COD_SAIDA');
ADOQuery.SQL.Add('AND Entrada_pai.COD_ENTRADA_PAI = Entrada_Med.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND Saida_Med.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((Saida_pai.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND Saida_pai.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (Entrada_pai.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND Entrada_pai.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview;
GOSTEI 0
Maiquelnet
25/08/2010
Ainda continua o erro!
Na verdade só o que mudou foi que o campo depois da virgula não apareceu mais!
Diz que falta um operador
'Medicamento.COD_MED = Entrada_med.MEDICAMENTO
LEFT JOIN SAIDA_MED.Medicamento
ON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTO'
Seria a esta a parte do erro:
Não consegui entender esta parte do código... no inicio a junção é de MEDICAMENTO com ENTRADA_MED (2 tabelas), na parte ON, esta o relacionamento de MEDICAMENTO.cod_med com ENTRADA_MED.medicamento.
Após, isto, o letf join esta fazendo junção com uma tabela e seu campo (SAIDA_MED.medicamento), esta correto? e na parte ON, esta fazendo o relacionamento, MEDICAMENTO.cod_med com SAIDA_MED.medicamento.
Na verdade só o que mudou foi que o campo depois da virgula não apareceu mais!
Diz que falta um operador
'Medicamento.COD_MED = Entrada_med.MEDICAMENTO
LEFT JOIN SAIDA_MED.Medicamento
ON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTO'
Seria a esta a parte do erro:
ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED.medicamento');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = SAIDA_MED.MEDICAMENTO,');
Não consegui entender esta parte do código... no inicio a junção é de MEDICAMENTO com ENTRADA_MED (2 tabelas), na parte ON, esta o relacionamento de MEDICAMENTO.cod_med com ENTRADA_MED.medicamento.
Após, isto, o letf join esta fazendo junção com uma tabela e seu campo (SAIDA_MED.medicamento), esta correto? e na parte ON, esta fazendo o relacionamento, MEDICAMENTO.cod_med com SAIDA_MED.medicamento.
GOSTEI 0
Eriley Barbosa
25/08/2010
Eu esqueci de corrigir um erro seu e que é primario em muitos iniciantes e que você poderia ter corrigido, no left join com saida_med, você colocou tabela.nomedocampo, sendo que no left join só vai nome de tabela:
Vamos pegar esta parte abaixo:
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');
ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');
ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');
//Veja que sua tabela se chama Saida_med
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED.medicamento');
// Veja que você colocou no join SAIDA_MED.medicamento'
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Saida_medicamento.MEDICAMENTO');
//Veja que terminou os joins com Medicamento então na linha acima vai uma virgula antes de fecharem as aspas
ADOQuery.SQL.Add(' ENTRADA_PAI ,');
ADOQuery.SQL.Add(' SAIDA_PAI ');
Logo tem que ficar assim:
#Código
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');
ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');
ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM');
ADOQuery.SQL.Add('MEDICAMENTO LEFT JOIN ENTRADA_MED ');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED');
ADOQuery.SQL.Add(' ON Medicamento.COD_MED = SAIDA_MED.MEDICAMENTO,');
ADOQuery.SQL.Add(' ENTRADA_PAI ,');
ADOQuery.SQL.Add(' SAIDA_PAI ');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' Saida_pai.COD_SAIDA_PAI = Saida_Med.COD_SAIDA');
ADOQuery.SQL.Add('AND Entrada_pai.COD_ENTRADA_PAI = Entrada_Med.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND Saida_Med.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((Saida_pai.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND Saida_pai.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (Entrada_pai.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND Entrada_pai.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview;
GOSTEI 0
Maiquelnet
25/08/2010
Eu...
o erro insiste em acontecer... da mesma forma ele acusa um erro de sintaxe!!! (falta de operador)existia uns campos do relacionamento que não estavam sendo selecionados pelo select, eu acrescentei, e fiz as correções, mas o erro ainda persiste:
Erro de sintaxe:'Medicamento.COD_MED = Entrada_med.MEDICAMENTOLETF JOIN SAIDA_MEDON Medicamento.COD_MED = SAIDA_MED.MEDICAMENTO'
O código é este:
ADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('SELECT');ADOQuery.SQL.Add(' Medicamento.cod_med, Medicamento.Descricao,');ADOQuery.SQL.Add(' Entrada_pai.DATA_ENTRADA ,');ADOQuery.SQL.Add(' Entrada_pai.COD_ENTRA_PAI ,');ADOQuery.SQL.Add(' Entrada_med.QUANTIA_ENTRADA ,');ADOQuery.SQL.Add(' Entrada_med.MEDICAMENTO ,');ADOQuery.SQL.Add(' Entrada_med.CODIGO_ENTRADA_MED ,');ADOQuery.SQL.Add(' Saida_pai.DATA_SAIDA ,');ADOQuery.SQL.Add(' Saida_pai.COD_SAIDA_PAI ,');ADOQuery.SQL.Add(' Saida_med.MEDICAMENTO ,');ADOQuery.SQL.Add(' Saida_Med.COD_SAIDA ,');ADOQuery.SQL.Add(' Saida_med.QUANTIA_SAIDA');ADOQuery.SQL.Add('FROM');ADOQuery.SQL.Add('ENTRADA_MED LEFT JOIN MEDICAMENTO ');ADOQuery.SQL.Add(' ON Medicamento.COD_MED = Entrada_med.MEDICAMENTO'); //linhasADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED'); //doADOQuery.SQL.Add(' ON Medicamento.COD_MED = SAIDA_MED.MEDICAMENTO,'); //erroADOQuery.SQL.Add(' ENTRADA_PAI ,');ADOQuery.SQL.Add(' SAIDA_PAI ');ADOQuery.SQL.Add('WHERE');ADOQuery.SQL.Add(' Saida_pai.COD_SAIDA_PAI = Saida_Med.COD_SAIDA');ADOQuery.SQL.Add('AND Entrada_pai.COD_ENTRADA_PAI = Entrada_Med.CODIGO_ENTRADA_MED');ADOQuery.SQL.Add('AND Saida_Med.MEDICAMENTO =:Texto0');ADOQuery.SQL.Add('AND ((Saida_pai.DATA_SAIDA >=:Data1');ADOQuery.SQL.Add('AND Saida_pai.DATA_SAIDA <=:Data2)');ADOQuery.SQL.Add('OR (Entrada_pai.DATA_ENTRADA >=:Data3');ADOQuery.SQL.Add('AND Entrada_pai.DATA_ENTRADA <=:Data4))');ADOQuery.SQL.Add('ORDER BY Saida_pai.DATA_SAIDA');ADOQuery.Parameters[0].Value:=DBEdit1.Text;ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);ADOQuery.Open;QuickRep.Preview;Sendo que, revisei várias vezes, os campos selecionados e os relacionamentos estão corretos, só que na parte do left join que não tenho certeza.
GOSTEI 0
Eriley Barbosa
25/08/2010
veja um exemplo de left join, com varias tabelas;
SELECT
c.*,
PC.*,
PC.descricao_computador AS descricao_pc,
ctt.*,
prf.*,
at.*,
f.*
FROM clientes c
LEFT JOIN computadores PC ON c.id_cliente = PC.id_cliente
LEFT JOIN contatos ctt ON c.id_cliente = ctt.id_cliente
LEFT JOIN perifericos prf ON c.id_cliente = prf.id_cliente
LEFT JOIN atendimentos at ON c.id_cliente = at.id_cliente
LEFT JOIN funcionarios f ON at.id_funcionario = f.id_funcionario tente assim: ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM'); ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' SAIDA_PAI S ,');
ADOQuery.SQL.Add('MEDICAMENTO M'); ADOQuery.SQL.Add('LEFTJOIN ENTRADA_MED EM');
ADOQuery.SQL.Add(' ON M.COD_MED = EM.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED SM');
ADOQuery.SQL.Add(' ON M.COD_MED = SM.MEDICAMENTO');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (E.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND E.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview; Se não conseguir mande seus fontes e banco de dados para o meu email
c.*,
PC.*,
PC.descricao_computador AS descricao_pc,
ctt.*,
prf.*,
at.*,
f.*
FROM clientes c
LEFT JOIN computadores PC ON c.id_cliente = PC.id_cliente
LEFT JOIN contatos ctt ON c.id_cliente = ctt.id_cliente
LEFT JOIN perifericos prf ON c.id_cliente = prf.id_cliente
LEFT JOIN atendimentos at ON c.id_cliente = at.id_cliente
LEFT JOIN funcionarios f ON at.id_funcionario = f.id_funcionario tente assim: ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT');
ADOQuery.SQL.Add(' M.DESCRICAO MEDICAMENTO,');
ADOQuery.SQL.Add(' E.DATA_ENTRADA ,');
ADOQuery.SQL.Add(' EM.QUANTIA_ENTRADA ,');
ADOQuery.SQL.Add(' S.DATA_SAIDA ,');
ADOQuery.SQL.Add(' SM.QUANTIA_SAIDA');
ADOQuery.SQL.Add('FROM'); ADOQuery.SQL.Add(' ENTRADA_PAI E ,');
ADOQuery.SQL.Add(' SAIDA_PAI S ,');
ADOQuery.SQL.Add('MEDICAMENTO M'); ADOQuery.SQL.Add('LEFTJOIN ENTRADA_MED EM');
ADOQuery.SQL.Add(' ON M.COD_MED = EM.MEDICAMENTO');
ADOQuery.SQL.Add(' LEFT JOIN SAIDA_MED SM');
ADOQuery.SQL.Add(' ON M.COD_MED = SM.MEDICAMENTO');
ADOQuery.SQL.Add('WHERE');
ADOQuery.SQL.Add(' S.COD_SAIDA_PAI = SM.COD_SAIDA');
ADOQuery.SQL.Add('AND E.COD_ENTRADA_PAI = EM.CODIGO_ENTRADA_MED');
ADOQuery.SQL.Add('AND SM.MEDICAMENTO =:Texto0');
ADOQuery.SQL.Add('AND ((S.DATA_SAIDA >=:Data1');
ADOQuery.SQL.Add('AND S.DATA_SAIDA <=:Data2)');
ADOQuery.SQL.Add('OR (E.DATA_ENTRADA >=:Data3');
ADOQuery.SQL.Add('AND E.DATA_ENTRADA <=:Data4))');
ADOQuery.SQL.Add('ORDER BY S.DATA_SAIDA');
ADOQuery.Parameters[0].Value:=DBEdit1.Text;
ADOQuery.Parameters[1].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[2].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Parameters[3].value:=DateTimeToStr(DateTimePicker1.Date);
ADOQuery.Parameters[4].Value:=DateTimeToStr(DateTimePicker2.Date);
ADOQuery.Open;
QuickRep.Preview; Se não conseguir mande seus fontes e banco de dados para o meu email
GOSTEI 0