Atualizar o valor de uma label.

Delphi

30/06/2015

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.

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

Firmino

Curtidas 0

Melhor post

Gabriel Baltazar

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.
GOSTEI 1

Mais Respostas

Dorivan Sousa

Dorivan Sousa

30/06/2015

é como o Baltazar disse mesmo.

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

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:
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
POSTAR