Fórum Loop ate final do banco de dados #604326
06/08/2019
0
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
Curtir tópico
+ 0Post mais votado
07/08/2019
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
Gostei + 1
Mais Posts
06/08/2019
Douglas Wordell
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname('VALOR').Asstring; //Se achar o registro, coloca o valor em vValorFalta 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.
Gostei + 0
07/08/2019
Alexandre
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''VALOR'').Asstring; //Se achar o registro, coloca o valor em vValorFalta 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
Gostei + 0
07/08/2019
Alexandre
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''VALOR'').Asstring; //Se achar o registro, coloca o valor em vValorFalta 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
Gostei + 0
07/08/2019
Alexandre
Percebi um erro de sintaxe aqui:
vvalor:=strtofloat(TableEntradas.FiedldByname(''''VALOR'''').Asstring; //Se achar o registro, coloca o valor em vValorFalta 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
Gostei + 0
08/08/2019
Alexandre
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
Gostei + 0
09/08/2019
Emerson Nascimento
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);Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)