Atualizar o valor de uma label.
Olá.
Sou um pouco noob em programação ainda, vou tentar explicar o meu problema para caso alguém possa me ajudar. Estou criando um programinha no delphi 2010 de controle de estoque. Nele criei um FormPrincipal e um button que chama o FormGerEstoque (é composto por uma dbgrid onde lista os produtos salvos no banco de dados que fiz no access) nesse FormEstoque coloquei um label que exibe a soma dos valores de uma coluna da grid, coloquei para ser ativada no evento onshow. Enfim, o código que criei ate soma corretamente, o problema é que caso eu faça alguma modificação no banco de dados (tipo inserir um novo produto) a label não atualiza o valor, mesmo sendo exibido o novo produto na grid o label continua com o valor inicial, ele muda apenas se eu fechar o programa e inicia-lo novamente.
Queria que esse valor estivesse sempre atualizado quando o FormGerEstoque abrir.
Sou um pouco noob em programação ainda, vou tentar explicar o meu problema para caso alguém possa me ajudar. Estou criando um programinha no delphi 2010 de controle de estoque. Nele criei um FormPrincipal e um button que chama o FormGerEstoque (é composto por uma dbgrid onde lista os produtos salvos no banco de dados que fiz no access) nesse FormEstoque coloquei um label que exibe a soma dos valores de uma coluna da grid, coloquei para ser ativada no evento onshow. Enfim, o código que criei ate soma corretamente, o problema é que caso eu faça alguma modificação no banco de dados (tipo inserir um novo produto) a label não atualiza o valor, mesmo sendo exibido o novo produto na grid o label continua com o valor inicial, ele muda apenas se eu fechar o programa e inicia-lo novamente.
Queria que esse valor estivesse sempre atualizado quando o FormGerEstoque abrir.
procedure TFormGerEstoque.FormShow(Sender: TObject);
Var
SOMA1, SOMA2 :Real;
begin
SOMA1:=0;
SOMA2:=0;
With DM.ADOQuerySomaVC do
begin
DM.ADOQuerySomaVC.DisableControls;
DM.ADOQuerySomaVC.First;
while not DM.ADOQuerySomaVC.EOF do
begin
SOMA1:= (SOMA1 + DM.ADOQuerySomaVC.fieldByName('V_T_COMPRA').AsCurrency);
SOMA2:= (SOMA2 + DM.ADOQuerySomaVC.fieldByName('V_T_VENDA').AsCurrency);
DM.ADOQuerySomaVC.Next;
end;
DM.ADOQuerySomaVC.EnableControls;
lbcompra.Caption:=FormatFloat('R$ #,,,,0.00', SOMA1);
lbvenda.Caption:=FormatFloat('R$ #,,,,0.00', SOMA2);
end;
end;
Firmino
Curtidas 0
Melhor post
Gabriel Baltazar
01/07/2015
Escreva esse código num método separado, calculaTotal por exemplo.
Daí você coloca a chamada desse método no FormShow e após a inclusão de produto por exemplo.
Daí você coloca a chamada desse método no FormShow e após a inclusão de produto por exemplo.
GOSTEI 1
Mais Respostas
Dorivan Sousa
30/06/2015
é como o Baltazar disse mesmo.
cria uma procedure calculaTotal na clausula private da unit
pressiona ctrl+shift+C q o delphi cria a implementacao da procedure. ai é so vc colocar seu codigo nessa procedure
quando vc abrir a query vc chama a procedure calculaTotal,
a sua inclusao é feita diretamente na grid? se for vc precisa ir no objeto que vc ta usando pra acessar os dados (voce falou bd access talvez esteja usando ADO) ai nele vc procura o evento afterpost (depois de confirmar) e chama a procedure calculatotal.
cria uma procedure calculaTotal na clausula private da unit
private
{ Private declarations }
procedure calculaTotal;
public
{ Public declarations }
end;
pressiona ctrl+shift+C q o delphi cria a implementacao da procedure. ai é so vc colocar seu codigo nessa procedure
quando vc abrir a query vc chama a procedure calculaTotal,
a sua inclusao é feita diretamente na grid? se for vc precisa ir no objeto que vc ta usando pra acessar os dados (voce falou bd access talvez esteja usando ADO) ai nele vc procura o evento afterpost (depois de confirmar) e chama a procedure calculatotal.
GOSTEI 1
Firmino
30/06/2015
Boa noite, eu segui essas dicas, mas por fim continuou no mesmo problema. No entanto consegui resolver o problema de uma forma mais simples do que imaginei que seria.
Primeiro eu removi essa AdoQuery, e fiz a conexão diretamente no ADOTable (no caso ADOTableProdutos) e usei o código:
Por fim ficou assim:
Foi boa a dica da procedure, deixou o código mais organizado.
Primeiro eu removi essa AdoQuery, e fiz a conexão diretamente no ADOTable (no caso ADOTableProdutos) e usei o código:
DM.ADOTableProdutos.Refresh;
Por fim ficou assim:
procedure TFormGerEstoque.CalculaTotal;
Var
SOMA1, SOMA2 :Real;
begin
SOMA1:=0;
SOMA2:=0;
//SOMAR AS COLUNAS
With DM.ADOTableProdutos do
begin
DM.ADOTableProdutos.DisableControls;
DM.ADOTableProdutos.First;
while not DM.ADOTableProdutos.EOF do
begin
DM.ADOTableProdutos.Refresh;
SOMA1:= (SOMA1 + DM.ADOTableProdutos.fieldByName('V_T_COMPRA').AsCurrency);
SOMA2:= (SOMA2 + DM.ADOTableProdutos.fieldByName('V_T_VENDA').AsCurrency);
DM.ADOTableProdutos.Next;
end;
DM.ADOTableProdutos.EnableControls;
lbcompra.Caption:=FormatFloat('R$ #,,,,0.00', SOMA1);
lbvenda.Caption:=FormatFloat('R$ #,,,,0.00', SOMA2);
end;
end;Foi boa a dica da procedure, deixou o código mais organizado.
GOSTEI 0