relatorio gerando valor repetidamente
01/04/2020
0
if Edit_Nome.text = '' then
Edit_Nome.text := '**** TODOS OS FUNCIONARIOS ****';
if Edit_Produto.text = '' then
Edit_Produto.text := '**** TODOS OS PRODUTOS ****';
EDL_0308A := TEDL_0308A.create(self);
with EDL_0308A.IBQuery1,SQL do
begin
clear;
close;
Add('SELECT DISTINCT A.CONTROLE controle, B.NOME vendedor, A.desc_valor, A.data');
Add('FROM MOVTO A,');
Add (' vendedores B');
Add('WHERE A.vendedor = B.CODIGO');
Add('AND A.vendedor IS NOT NULL');
if ((Edit_Nome.text <> '**** TODOS OS FUNCIONARIOS ****')and(Edit_Produto.text = '**** TODOS OS PRODUTOS ****')) then
begin
add('and (UPPER(b.NOME)) like :wnome');
ParamByName('wnome').AsString := Edit_Nome.Text ;
end;
EDL_0308A.IBQuery1.open;
while not EDL_0308A.IBQuery1.Eof do
begin
with IBQ_Pesquisa, sql do
begin
Close;
Clear;
Add('SELECT SUM(A.TOTAL)TOTAL FROM MOVITEM A WHERE A.CONTROLE = :WCONTROLE');
ParamByName('WCONTROLE').AsInteger := EDL_0308A.IBQuery1.fieldbyname('controle').AsInteger;
end;
IBQ_Pesquisa.open;
V_DESC := 0 ;
//V_DESC := ((EDL_0308A.IBQuery1.fieldbyname('desc_valor').Value/ IBQ_Pesquisa.fieldbyname('TOTAL').Value));
V_VLR_COMISS := 0;
with IBQuery2,SQL do
begin
clear;
close;
Add(' SELECT DISTINCT A.controle,');
Add(' B.NOME,');
Add(' A.QTDE,');
Add(' A.PRECO preco,');
Add(' B.comissao comissao,');
Add('(A.qtde * A.PRECO) TOTAL_VEND');
Add('FROM MOVITEM A,');
Add(' PRODUTO B');
Add('WHERE A.CODPROD = B.CODIGO');
add('AND B.COMISSAO > 0');
add('AND A.controle = :wcontrole');
ParamByName('wcontrole').Value := EDL_0308A.IBQuery1.fieldbyname('controle').AsInteger;
IBQuery2.open;
while not IBQuery2.Eof do
begin
if V_DESC = null then
V_DESC := 0;
// V_VLR_COMISS := (IBQuery2.fieldbyname('preco').Value - V_DESC) * ((IBQuery2.fieldbyname('comissao').Value) /100);
/////////////////////////////////////////////////////////////////////////////
------------- nessa parte em diante estou jogando para o relatorio os valores
EDL_0308A.QRLabel21.Caption := IBQuery2.FieldByName('controle').AsString;
EDL_0308A.QRL_Nomefunc.Caption := EDL_0308A.IBQuery1.FieldByName('vendedor').AsString;
EDL_0308A.QRL_Nome.Caption := IBQuery2.fieldbyname('nome').Value;
EDL_0308A.QRL_Total.caption := 'R$' + FloatToStrF (V_VLR_COMISS,ffNumber,10,2);
EDL_0308A.v_total := v_total + V_VLR_COMISS;
EDL_0308A.V_Qtde := inttostr(EDL_0308A.IBQuery1.RecordCount);
---------que no caso esta vindo certinho porem la no relatorio ele so me joga um nome varias vezes repetidamente
/////////////////////////////////////////////////////////////////////////////////
IBQuery2.Next;
end;
end;
EDL_0308A.IBQuery1.Next;
end;
if EDL_0308A.IBQuery1.RecordCount > 1 then
begin
EDL_0308A.Preview;
EDL_0308A.Destroy;
end;
end;
end ;
Lucas
Posts
01/04/2020
Lucas
if Edit_Nome.text = '' then
Edit_Nome.text := '**** TODOS OS FUNCIONARIOS ****';
if Edit_Produto.text = '' then
Edit_Produto.text := '**** TODOS OS PRODUTOS ****';
EDL_0308A := TEDL_0308A.create(self);
with EDL_0308A.IBQuery1,SQL do
begin
clear;
close;
Add('SELECT DISTINCT A.CONTROLE controle, B.NOME vendedor, A.desc_valor, A.data');
Add('FROM MOVTO A,');
Add (' vendedores B');
Add('WHERE A.vendedor = B.CODIGO');
Add('AND A.vendedor IS NOT NULL');
if ((Edit_Nome.text <> '**** TODOS OS FUNCIONARIOS ****')and(Edit_Produto.text = '**** TODOS OS PRODUTOS ****')) then
begin
add('and (UPPER(b.NOME)) like :wnome');
ParamByName('wnome').AsString := Edit_Nome.Text ;
end;
EDL_0308A.IBQuery1.open;
while not EDL_0308A.IBQuery1.Eof do
begin
with IBQ_Pesquisa, sql do
begin
Close;
Clear;
Add('SELECT SUM(A.TOTAL)TOTAL FROM MOVITEM A WHERE A.CONTROLE = :WCONTROLE');
ParamByName('WCONTROLE').AsInteger := EDL_0308A.IBQuery1.fieldbyname('controle').AsInteger;
end;
IBQ_Pesquisa.open;
V_DESC := 0 ;
//V_DESC := ((EDL_0308A.IBQuery1.fieldbyname('desc_valor').Value/ IBQ_Pesquisa.fieldbyname('TOTAL').Value));
V_VLR_COMISS := 0;
with IBQuery2,SQL do
begin
clear;
close;
Add(' SELECT DISTINCT A.controle,');
Add(' B.NOME,');
Add(' A.QTDE,');
Add(' A.PRECO preco,');
Add(' B.comissao comissao,');
Add('(A.qtde * A.PRECO) TOTAL_VEND');
Add('FROM MOVITEM A,');
Add(' PRODUTO B');
Add('WHERE A.CODPROD = B.CODIGO');
add('AND B.COMISSAO > 0');
add('AND A.controle = :wcontrole');
ParamByName('wcontrole').Value := EDL_0308A.IBQuery1.fieldbyname('controle').AsInteger;
IBQuery2.open;
while not IBQuery2.Eof do
begin
if V_DESC = null then
V_DESC := 0;
// V_VLR_COMISS := (IBQuery2.fieldbyname('preco').Value - V_DESC) * ((IBQuery2.fieldbyname('comissao').Value) /100);
/////////////////////////////////////////////////////////////////////////////
------------- nessa parte em diante estou jogando para o relatorio os valores
EDL_0308A.QRLabel21.Caption := IBQuery2.FieldByName('controle').AsString;
EDL_0308A.QRL_Nomefunc.Caption := EDL_0308A.IBQuery1.FieldByName('vendedor').AsString;
EDL_0308A.QRL_Nome.Caption := IBQuery2.fieldbyname('nome').Value;
EDL_0308A.QRL_Total.caption := 'R$' + FloatToStrF (V_VLR_COMISS,ffNumber,10,2);
EDL_0308A.v_total := v_total + V_VLR_COMISS;
EDL_0308A.V_Qtde := inttostr(EDL_0308A.IBQuery1.RecordCount);
---------que no caso esta vindo certinho porem la no relatorio ele so me joga um nome varias vezes repetidamente
/////////////////////////////////////////////////////////////////////////////////
IBQuery2.Next;
end;
end;
EDL_0308A.IBQuery1.Next;
end;
if EDL_0308A.IBQuery1.RecordCount > 1 then
begin
EDL_0308A.Preview;
EDL_0308A.Destroy;
end;
end;
end ;
no caso o que ele esta fazendo e pegar o ultimo valor da tabela e jogando uns 20 registros só com o ultimo valor da tabela
01/04/2020
Emerson Nascimento
no teu caso:
- qual a versão do Delphi?
- qual banco de dados e versão?
- como a rotina está sendo executada? você a executa manualmente? ela roda a partir de um evento?
- exemplo de como os dados estão sendo exibidos e como é o resultado correto
de qualquer forma, veja se o exemplo abaixo de ajuda:
begin if Edit_Nome.text = '' then Edit_Nome.text := '**** TODOS OS FUNCIONARIOS ****'; if Edit_Produto.text = '' then Edit_Produto.text := '**** TODOS OS PRODUTOS ****'; lTodosFuncionarios := (Edit_Nome.text = '**** TODOS OS FUNCIONARIOS ****'); lTodosProdutos := (Edit_Produto.text := '**** TODOS OS PRODUTOS ****'); EDL_0308A := TEDL_0308A.create(self); with EDL_0308A.IBQuery1, EDL_0308A.IBQuery1.SQL do begin close; // fecha o dataset clear; // limpa a instrução SQL Add('SELECT M.CONTROLE, V.NOME vendedor, M.desc_valor, M.data'); Add(',P.NOME produto, MI.QTDE, MI.PRECO, P.comissao'); Add('FROM MOVTO M'); Add('INNER JOIN vendedores V ON V.CODIGO = M.vendedor'); Add('INNER JOIN MOVITEM MI ON MI.controle = M.controle'); Add('INNER JOIN PRODUTO P ON P.CODIGO = MI.CODPROD AND P.COMISSAO > 0'); Add('WHERE NOT (M.vendedor IS NULL)'); if not lTodosFuncionarios then Add('and (UPPER(V.NOME)) like '+QuotedStr('%'+UpperCase(Edit_Nome.Text)+'%')); if not lTodosProdutos then Add('and (UPPER(P.NOME)) like '+QuotedStr('%'+UpperCase(Edit_Produto.Text)+'%')); Open; // abre o dataset while not EOF do begin V_CONTROLE := FieldByName('controle').AsInteger; // obtém o valor total do movimento. // dependendo do banco de dados utilizado, // dá pra trazer o total na query anterior, e esta // abaixo sequer existiria. with IBQ_Pesquisa, IBQ_Pesquisa.SQL do begin Close; Clear; Add('SELECT SUM(TOTAL) TOTAL FROM MOVITEM WHERE CONTROLE = :WCONTROLE'); ParamByName('WCONTROLE').AsInteger := V_CONTROLE; Open; V_TOTAL := IBQ_Pesquisa.FieldByName('TOTAL').AsFloat; Close; // fecha o dataset IBQ_Pesquisa, porque não precisamos mais dele aberto end; while not EOF and (V_CONTROLE = FieldByName('controle').AsInteger) do begin // V_DESC := FieldByName('desc_valor').AsFloat / V_TOTAL; V_DESC := 0; // V_VLR_COMISS := (FieldByName('preco').AsFloat - V_DESC) * (FieldByName('comissao').AsFloat / 100); V_VLR_COMISS := 0; ///////////////////////////////////////////////////////////////////////////// ------------- nessa parte em diante estou jogando para o relatorio os valores EDL_0308A.QRLabel21.Caption := FieldByName('controle').AsString; EDL_0308A.QRL_Nomefunc.Caption := FieldByName('vendedor').AsString; EDL_0308A.QRL_Nome.Caption := FieldByName('produto').AsString; EDL_0308A.QRL_Total.caption := 'R$' + FloatToStrF(V_VLR_COMISS,ffNumber,10,2); EDL_0308A.v_total := v_total + V_VLR_COMISS; EDL_0308A.V_Qtde := FieldByName('QTDE').AsString; ---------que no caso esta vindo certinho porem la no relatorio ele so me joga um nome varias vezes repetidamente ///////////////////////////////////////////////////////////////////////////////// Next; // pula para o próximo registro end; end; end; if not EDL_0308A.IBQuery1.IsEmpty then EDL_0308A.Preview; EDL_0308A.Destroy; end;
01/04/2020
Lucas
no teu caso:
- qual a versão do Delphi?
- qual banco de dados e versão?
- como a rotina está sendo executada? você a executa manualmente? ela roda a partir de um evento?
- exemplo de como os dados estão sendo exibidos e como é o resultado correto
de qualquer forma, veja se o exemplo abaixo de ajuda:
begin if Edit_Nome.text = '''' then Edit_Nome.text := ''**** TODOS OS FUNCIONARIOS ****''; if Edit_Produto.text = '''' then Edit_Produto.text := ''**** TODOS OS PRODUTOS ****''; lTodosFuncionarios := (Edit_Nome.text = ''**** TODOS OS FUNCIONARIOS ****''); lTodosProdutos := (Edit_Produto.text := ''**** TODOS OS PRODUTOS ****''); EDL_0308A := TEDL_0308A.create(self); with EDL_0308A.IBQuery1, EDL_0308A.IBQuery1.SQL do begin close; // fecha o dataset clear; // limpa a instrução SQL Add(''SELECT M.CONTROLE, V.NOME vendedor, M.desc_valor, M.data''); Add('',P.NOME produto, MI.QTDE, MI.PRECO, P.comissao''); Add(''FROM MOVTO M''); Add(''INNER JOIN vendedores V ON V.CODIGO = M.vendedor''); Add(''INNER JOIN MOVITEM MI ON MI.controle = M.controle''); Add(''INNER JOIN PRODUTO P ON P.CODIGO = MI.CODPROD AND P.COMISSAO > 0''); Add(''WHERE NOT (M.vendedor IS NULL)''); if not lTodosFuncionarios then Add(''and (UPPER(V.NOME)) like ''+QuotedStr(''%''+UpperCase(Edit_Nome.Text)+''%'')); if not lTodosProdutos then Add(''and (UPPER(P.NOME)) like ''+QuotedStr(''%''+UpperCase(Edit_Produto.Text)+''%'')); Open; // abre o dataset while not EOF do begin V_CONTROLE := FieldByName(''controle'').AsInteger; // obtém o valor total do movimento. // dependendo do banco de dados utilizado, // dá pra trazer o total na query anterior, e esta // abaixo sequer existiria. with IBQ_Pesquisa, IBQ_Pesquisa.SQL do begin Close; Clear; Add(''SELECT SUM(TOTAL) TOTAL FROM MOVITEM WHERE CONTROLE = :WCONTROLE''); ParamByName(''WCONTROLE'').AsInteger := V_CONTROLE; Open; V_TOTAL := IBQ_Pesquisa.FieldByName(''TOTAL'').AsFloat; Close; // fecha o dataset IBQ_Pesquisa, porque não precisamos mais dele aberto end; while not EOF and (V_CONTROLE = FieldByName(''controle'').AsInteger) do begin // V_DESC := FieldByName(''desc_valor'').AsFloat / V_TOTAL; V_DESC := 0; // V_VLR_COMISS := (FieldByName(''preco'').AsFloat - V_DESC) * (FieldByName(''comissao'').AsFloat / 100); V_VLR_COMISS := 0; ///////////////////////////////////////////////////////////////////////////// ------------- nessa parte em diante estou jogando para o relatorio os valores EDL_0308A.QRLabel21.Caption := FieldByName(''controle'').AsString; EDL_0308A.QRL_Nomefunc.Caption := FieldByName(''vendedor'').AsString; EDL_0308A.QRL_Nome.Caption := FieldByName(''produto'').AsString; EDL_0308A.QRL_Total.caption := ''R$'' + FloatToStrF(V_VLR_COMISS,ffNumber,10,2); EDL_0308A.v_total := v_total + V_VLR_COMISS; EDL_0308A.V_Qtde := FieldByName(''QTDE'').AsString; ---------que no caso esta vindo certinho porem la no relatorio ele so me joga um nome varias vezes repetidamente ///////////////////////////////////////////////////////////////////////////////// Next; // pula para o próximo registro end; end; end; if not EDL_0308A.IBQuery1.IsEmpty then EDL_0308A.Preview; EDL_0308A.Destroy; end;
uma dica: sempre postar uma dúvida, coloque o máximo de informações para que possa obter ajuda o mais personalizada possível.
no teu caso:
- qual a versão do Delphi? delphi 7
- qual banco de dados e versão? firebird 2.5
- como a rotina está sendo executada? você a executa manualmente? ela roda a partir de um evento? em click do botão quando clicar passar filtro e dessa tela msm jogar os valores para QRLabel da tela de relatorio
- exemplo de como os dados estão sendo exibidos e como é o resultado correto
02/04/2020
Lucas
no teu caso:
- qual a versão do Delphi?
- qual banco de dados e versão?
- como a rotina está sendo executada? você a executa manualmente? ela roda a partir de um evento?
- exemplo de como os dados estão sendo exibidos e como é o resultado correto
de qualquer forma, veja se o exemplo abaixo de ajuda:
begin if Edit_Nome.text = '' then Edit_Nome.text := '**** TODOS OS FUNCIONARIOS ****'; if Edit_Produto.text = '' then Edit_Produto.text := '**** TODOS OS PRODUTOS ****'; lTodosFuncionarios := (Edit_Nome.text = '**** TODOS OS FUNCIONARIOS ****'); lTodosProdutos := (Edit_Produto.text := '**** TODOS OS PRODUTOS ****'); EDL_0308A := TEDL_0308A.create(self); with EDL_0308A.IBQuery1, EDL_0308A.IBQuery1.SQL do begin close; // fecha o dataset clear; // limpa a instrução SQL Add('SELECT M.CONTROLE, V.NOME vendedor, M.desc_valor, M.data'); Add(',P.NOME produto, MI.QTDE, MI.PRECO, P.comissao'); Add('FROM MOVTO M'); Add('INNER JOIN vendedores V ON V.CODIGO = M.vendedor'); Add('INNER JOIN MOVITEM MI ON MI.controle = M.controle'); Add('INNER JOIN PRODUTO P ON P.CODIGO = MI.CODPROD AND P.COMISSAO > 0'); Add('WHERE NOT (M.vendedor IS NULL)'); if not lTodosFuncionarios then Add('and (UPPER(V.NOME)) like '+QuotedStr('%'+UpperCase(Edit_Nome.Text)+'%')); if not lTodosProdutos then Add('and (UPPER(P.NOME)) like '+QuotedStr('%'+UpperCase(Edit_Produto.Text)+'%')); Open; // abre o dataset while not EOF do begin V_CONTROLE := FieldByName('controle').AsInteger; // obtém o valor total do movimento. // dependendo do banco de dados utilizado, // dá pra trazer o total na query anterior, e esta // abaixo sequer existiria. with IBQ_Pesquisa, IBQ_Pesquisa.SQL do begin Close; Clear; Add('SELECT SUM(TOTAL) TOTAL FROM MOVITEM WHERE CONTROLE = :WCONTROLE'); ParamByName('WCONTROLE').AsInteger := V_CONTROLE; Open; V_TOTAL := IBQ_Pesquisa.FieldByName('TOTAL').AsFloat; Close; // fecha o dataset IBQ_Pesquisa, porque não precisamos mais dele aberto end; while not EOF and (V_CONTROLE = FieldByName('controle').AsInteger) do begin // V_DESC := FieldByName('desc_valor').AsFloat / V_TOTAL; V_DESC := 0; // V_VLR_COMISS := (FieldByName('preco').AsFloat - V_DESC) * (FieldByName('comissao').AsFloat / 100); V_VLR_COMISS := 0; ///////////////////////////////////////////////////////////////////////////// ------------- nessa parte em diante estou jogando para o relatorio os valores EDL_0308A.QRLabel21.Caption := FieldByName('controle').AsString; EDL_0308A.QRL_Nomefunc.Caption := FieldByName('vendedor').AsString; EDL_0308A.QRL_Nome.Caption := FieldByName('produto').AsString; EDL_0308A.QRL_Total.caption := 'R$' + FloatToStrF(V_VLR_COMISS,ffNumber,10,2); EDL_0308A.v_total := v_total + V_VLR_COMISS; EDL_0308A.V_Qtde := FieldByName('QTDE').AsString; ---------que no caso esta vindo certinho porem la no relatorio ele so me joga um nome varias vezes repetidamente ///////////////////////////////////////////////////////////////////////////////// Next; // pula para o próximo registro end; end; end; if not EDL_0308A.IBQuery1.IsEmpty then EDL_0308A.Preview; EDL_0308A.Destroy; end;
não rolou não ainda continua o msm problema de jogar varios registro com o nome do ultimo registro da tabela do banco
03/04/2020
Emerson Nascimento
pelo nome dos componentes (QRLabel21) é um relatório em QuickReport?
05/04/2020
Lucas
pelo nome dos componentes (QRLabel21) é um relatório em QuickReport?
ja solucionei o problema brigado a todos
Clique aqui para fazer login e interagir na Comunidade :)