relatorio gerando valor repetidamente

01/04/2020

0

aalguem da uma ajuda na tela onde estou gerando o relatorio estou jogando esse codigo

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

Lucas

Responder

Posts

01/04/2020

Lucas

aalguem da uma ajuda na tela onde estou gerando o relatorio estou jogando esse codigo

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
Responder

01/04/2020

Emerson Nascimento

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?
- 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;


Responder

01/04/2020

Lucas

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?
- 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
Responder

02/04/2020

Lucas

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?
- 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
Responder

03/04/2020

Emerson Nascimento

o que é TEDL_0308A? é um relatório?
pelo nome dos componentes (QRLabel21) é um relatório em QuickReport?

Responder

05/04/2020

Lucas

o que é TEDL_0308A? é um relatório?
pelo nome dos componentes (QRLabel21) é um relatório em QuickReport?


ja solucionei o problema brigado a todos
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar