Fórum Loop ate final do banco de dados #604326

06/08/2019

0

Olá pessoal.
Tenho essa procedure para ler campos do BDE com criterios em Campos edit

procedure somar; //Click Botão
begin
vsomavalor:=0; //Zerar Var
TableEntradas.Open; // Abrir Tabela
TableEntradas.First //ir para o promeoiro registro
while not(TableEntradas.Eof)do //Enquanto não chegar o fim da tabela. fazer...
begin
if (TableEntradas.locate('MES;ANO;ITEM',VararrayOf([EditMes.Text, EditAno.Text, EditItem.Text]),[]))then //MES, ANO, ITEM, ex:mes 01, ano:2019, Item: Mercado //Na tabela há MES, ANO, ITEM e VALOR....
begin
vvalor:=strtofloat(TableEntradas.FiedldByname('VALOR').Asstring; //Se achar o registro, coloca o valor em vValor
vsomaValor:=vsomaValor+Vvalor; Vai somando todos os regiostros do MES e ANO (ex 01/2019) com ITEM "Mercado" e pega o campo VALOR desse registro
TableEntradas.Next; //......Não está indo para o registro seguinte...

****Deveria fazer um loop e e ir somando todos os valores correspondentes ao campo Item, no mesmo mes e ano encontrados.
Não funciona

Podem, ajudar. Com SQL, não consegui
Alexandre

Alexandre

Responder

Post mais votado

07/08/2019

não tem como funcionar. você está entrando no while e depois fica procurando um registro (locate).
quando você faz tablescan, você deve somente comparar o conteúdo desejado. assim:
function somar;
var
	vvalor, vsomavalor: double;
begin
	vsomavalor := 0; //Zerar Var

	TableEntradas.Open; // Ao abrir já estará no primeiro registro
	while not TableEntradas.Eof do // Enquanto não chegar o fim da tabela. fazer...
	begin
		if (TableEntradas.FieldByName('MES').AsString = EditMes.Text) and
		   (TableEntradas.FieldByName('ANO').AsString = EditAno.Text) and
		   (TableEntradas.FieldByName('ITEM').AsString = EditItem.Text) then
		begin
			vvalor := strtofloat(TableEntradas.FiedldByname('VALOR').Asstring); // Coloca o valor em vValor
			vsomaValor := vsomaValor + Vvalor; // Vai somando todos os valores
		end;
		TableEntradas.Next; // Vai para o registro seguinte...
	end;
	result := vsomaValor;
	TableEntradas.Close; // Fecha 
end;

daí, pra usar, basta fazer:
EditTotal.text := floattostr( somar );

Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 1

Mais Posts

06/08/2019

Douglas Wordell

Aponta algum erro ou apenas não soma?
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname('VALOR').Asstring; //Se achar o registro, coloca o valor em vValor

Falta fechar um parêntesis, fora que o campo já poderia ser AsFloat, não poderia?
Mas penso que o maior problema seja querer fazer um loop em toda tabela e também usar o locate, se for fazer um loop não usa o locate, compara os campos que você precisa.
Mas também poderia fazer um filtro diferente, quais campos tem na sua tabela? É interessante adicionar mais dados para que o pessoal consiga ajudar.
Responder

Gostei + 0

07/08/2019

Alexandre

Aponta algum erro ou apenas não soma?
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''VALOR'').Asstring; //Se achar o registro, coloca o valor em vValor

Falta fechar um parêntesis, fora que o campo já poderia ser AsFloat, não poderia?
Mas penso que o maior problema seja querer fazer um loop em toda tabela e também usar o locate, se for fazer um loop não usa o locate, compara os campos que você precisa.
Mas também poderia fazer um filtro diferente, quais campos tem na sua tabela? É interessante adicionar mais dados para que o pessoal consiga ajudar.


Aponta erro. Preciso declarar essa funcão, assim como declaro procedures normais.
Mas não é a mesma coisa. Vi varios exemplos de declaração de funcão na internet e não roda aqui.
Vou lá em private e declaro a função function soma (vars, etc)

No evento Onclick do botão, chamo a funcão Soma.
Dá erro
Responder

Gostei + 0

07/08/2019

Alexandre

Aponta algum erro ou apenas não soma?
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''VALOR'').Asstring; //Se achar o registro, coloca o valor em vValor

Falta fechar um parêntesis, fora que o campo já poderia ser AsFloat, não poderia?
Mas penso que o maior problema seja querer fazer um loop em toda tabela e também usar o locate, se for fazer um loop não usa o locate, compara os campos que você precisa.
Mas também poderia fazer um filtro diferente, quais campos tem na sua tabela? É interessante adicionar mais dados para que o pessoal consiga ajudar.


Ah sim... vi isso tb, já fechei esse parenteses no final, mas o erro não está dando aí.
É a declaração da função (como deve ser declarada) e como decve sser chamada no onclick do notão
Responder

Gostei + 0

07/08/2019

Alexandre

Aponta algum erro ou apenas não soma?
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''''VALOR'''').Asstring; //Se achar o registro, coloca o valor em vValor

Falta fechar um parêntesis, fora que o campo já poderia ser AsFloat, não poderia?
Mas penso que o maior problema seja querer fazer um loop em toda tabela e também usar o locate, se for fazer um loop não usa o locate, compara os campos que você precisa.
Mas também poderia fazer um filtro diferente, quais campos tem na sua tabela? É interessante adicionar mais dados para que o pessoal consiga ajudar.


Ah sim... vi isso tb, já fechei esse parenteses no final, mas o erro não está dando aí.
É a declaração da função (como deve ser declarada) e como decve sser chamada no onclick do notão
Responder

Gostei + 0

08/08/2019

Alexandre

Olá pessoal.
Bom dia...

Agradeço muito as dicas dadas.
Eu estou usando Maquina virtual por conta de programas antigos como o Delphi.
Ai fica uma complicação copiar para vcs. da maquina virtual para o PC, nem estou conseguindo copiar no pendrive.
Aumentei a tela e o menu sumiu. Volto ao normal e nada feito.

MAS VAMOS LÁ..... PROBLEMA RESOLVIDO E COMPARTILHO AQUI, AINDA AGRADECENDO A ATENÇÃO DOS GRANDES AMIGOS DO FORUM
Consigo somar somente os valores dos itens conforme selecionado, Mes, Ano e Item. A soma vai para um edit

vvalor:=0;
vsomavalor:=0;
vmes:='';
vano:='';
vitem:='';
TableEntradas.Open;
TableEntradas.first;

while not (TableEntradas.EOF)do
begin
vmes:=trim(tableentradas.fieldByName('MES').asstring);
vano:=trim(tableentradas.fieldByName('ANO').asstring);
vitem:=trim(tableentradas.fieldByName('ITEM').asstring);

if(vmes=Edmes.text)and(vano=Edano.Text)and(vitem=ComboItem.text)then
begin
vsoma:=vasoma+vvalor;
EdSoma.text:=flottostr(vsoma);
TableEntradas.Next;
end
else
begin
vsoma:=vsoma;
EdSoma.text:=flottostr(vsoma);
TableEntradas.Next;
end;
end;

Obs: Estava dando pau na var item (vitem). Ela ficava diferente do EditItem......vitem 'SALARIO ' e o Edit 'SALARIO'
Ai esse espaço atrapalhava e uma var com o mesmo nome do campo edit, não era visto como o conteudo da var.
Ai o comando trim resolveu a parada.

Agradeço a todos pela ajuda e tenham um bom final de semana


Responder

Gostei + 0

09/08/2019

Emerson Nascimento

simplifique teu código. você pode atribuir o conteúdo ao Edit somente após efetuar todos os cálculos.
	vsoma := 0;

	TableEntradas.Open;

	while not TableEntradas.EOF do
	begin
		vmes := trim(tableentradas.fieldByName('MES').asstring);
		vano := trim(tableentradas.fieldByName('ANO').asstring);
		vitem := trim(tableentradas.fieldByName('ITEM').asstring);

		if (vmes=Edmes.text) and (vano=Edano.Text) and (vitem=ComboItem.text) then
			vsoma := vsoma + tableentradas.fieldByName('VALOR').asfloat;

		TableEntradas.Next;
	end;

	EdSoma.text := floattostr(vsoma);

Responder

Gostei + 0

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

Aceitar