Query não atualiza. Preciso fechar e abrir o programa toda vez

Delphi

01/08/2018

Olá amigos. Estou com um problema queimando meus neurônios.
Estou fazendo um programinha de gestão financeira para uma pequena igreja.
Como o movimento é muito pequeno e não exige muito do banco de dados, utilizo Access conectado com ADO.
No formulário tenho um combobox com os seguintes itens: dízimos, ofertas e total.
Logo abaixo tenho um label, que deve me retornar a soma das entradas do mês corrente, do campo selecionado no combobox.
Inseri no próprio formulário uma adoquery para cada item: dízimos, ofertas e total, e um dbtext (não visível) para cada adoquery que recebe o campo Expr1, Expr2 e Expr3, respectivamente.

No evento onchange do combobox, coloquei o seguinte código:
procedure TFinanceiro.ComboBox1Change(Sender: TObject);
  var
  num1, num2, num3: real;
begin
  Label25.Caption := '''';
  AdoQuery1.Close;
  AdoQuery2.Close;
  AdoQuery3.Close;
    AdoQuery1.SQL.Clear;
    AdoQuery1.SQL.Add(''Select Sum(Valor) as Expr1'');
    AdoQuery1.SQL.Add(''from entradas'');
    AdoQuery1.SQL.Add(''where Month(DtLanc) = Month(Date()) and year(DtLanc) = Year(Date()) and IdLancamento IN (1)'');
    AdoQuery2.SQL.Clear;
    AdoQuery2.SQL.Add(''Select Sum(Valor) as Expr2'');
    AdoQuery2.SQL.Add(''from entradas'');
    AdoQuery2.SQL.Add(''where Month(DtLanc) = Month(Date()) and year(DtLanc) = Year(Date()) and IdLancamento IN (2)'');
    AdoQuery3.SQL.Clear;
    AdoQuery3.SQL.Add(''Select Sum(Valor) as Expr3'');
    AdoQuery3.SQL.Add(''from entradas'');
    AdoQuery3.SQL.Add(''where Month(DtLanc) = Month(Date()) and year(DtLanc) = Year(Date()) and IdLancamento IN (3)'');
  AdoQuery1.Open;
  AdoQuery2.Open;
  AdoQuery3.Open;
If Combobox1.Text = ''Total Geral de Entradas'' Then
  begin
    if Dbtext3.Caption = '''' then
    label25.Caption := ''R$0,00'' else
    num3 := StrToFloat(DbText14.Caption);
    Label25.Caption := FloatToStrF(num3, ffcurrency, 8,2);
  end;
If Combobox1.Text = ''Dízimos'' Then
  begin
    if Dbtext1.Caption = '''' then
    label25.caption := ''R$0,00'' else
    num1 := StrToFloat(DbText1.Caption);
    Label25.Caption := FloatToStrF(num1, ffcurrency, 8,2);
    end;
If Combobox1.Text = ''Ofertas'' Then
  begin
    if Dbtext2.Caption = '''' then
    label25.caption := ''R$0,00'' else
    num2 := StrToFloat(DbText2.Caption);
    Label25.Caption := FloatToStrF(num2, ffcurrency, 8,2);
    end;
End;

Pois bem, quando seleciono, por exemplo, Dízimos, na combobox, ele retorna no label 25 a soma de todos os dízimos que entraram no mês. Se seleciono, ofertas, o label muda para a soma das ofertas. Funciona tudo perfeito.

O problema é quando eu edito ou adiciono um novo lançamento.

Meu código para isso é:
procedure TFinanceiro.Button7Click(Sender: TObject);
  var
  data: string;
begin
  data := FormatDateTime(''DD/MM/YYYY'', DateTimePicker1.Date);
  dbedit2.Text := data;
  dbnavigator1.BtnClick(nbpost);
  Combobox1.Text := ''Selecione a Opção'';


Depois de clicar e salvar o lançamento, se eu volto no combobox1 e seleciono qualquer campo, o label sempre aparece zerado. Ou seja, ele não me retorna mais os totais. O mesmo ocorre após excluir um registro. Aí eu preciso sair do programa e entrar de novo, e quando faço isso, lá estão os valores atualizados.

Já tentei inserir um close e um open na tabela após o insert, já tentei o mesmo com a conexão, e nada. Aliás, acredito que não deveria ser necessário algo assim, pois o evento onchange do combobox vai sempre fechar e abrir as adoquery, logo os valores deveriam atualizar. Enfim... não sei o que fazer para ele atualizar sem eu ter que fechar e abrir o programa.

Se alguém puder dar uma força...
Edilson Santiago

Edilson Santiago

Curtidas 0

Melhor post

Luiz Vichiatto

Luiz Vichiatto

01/08/2018

Quem está atualizando:
DbText14.Caption;
DbText1.Caption;
DbText2.Caption;

se a execução da query é quem tem que atualizar estes campos, verifique a ligação dos componentes, algum deles não deve estar ativo.

acho que fica melhor assim
If Combobox1.Text = ''Total Geral de Entradas'' Then
  begin
    if Dbtext3.Caption = '''' then
    label25.Caption := ''R$0,00'' else
    num3 := ADOQuery1.FieldByName('Expr1').AsCurrency;
    Label25.Caption := FloatToStrF(num3, ffcurrency, 8,2);
  end;
//Substitua para os demais códigos conforme necessário
//ADOQuery1.FieldByName('Expr2').AsCurrency;
//ADOQuery1.FieldByName('Expr3').AsCurrency;





GOSTEI 1

Mais Respostas

Edilson Santiago

Edilson Santiago

01/08/2018

obs.: No código aí em cima tem aspas sobrando pra todo lado, mas no delphi ta certo. Copiei lá e colei aqui, e na hora de salvar, o fórum acrescentou...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2018

Veja se depois de salvar/excluir você não está deixando de fechar a transação (Commit).
Algo como:
if ADOQueryX.Connection.InTransaction then
      ADOQueryX.Connection.CommitTrans;
GOSTEI 1
POSTAR