Atualizar uma tabela após atualizar outra???

MySQL

Delphi

23/08/2018

Boa noite pessoal, estou quebrando a cabeça em uma questão aqui faz dois dias, já pesquisei em vários Fóruns e vídeo aulas mais sem sucesso.

O Problema é o Seguinte.

Tenho duas tabelas (contas_a_pagar) e (conta_a_pagar detalhes), em uma delas tenho um atualizo via "FORM" as contas com valores total da mesma, na outra atualizo "Botão Gerar Parcelas" e utilizo para gerar as parcelas.
A Parte 1 que uso para gerar parcelas e inserir na minha tabela "contas_a_pagar_detalhe" esta funcionando normalmente e usei o comando abaixo:

procedure Tfrm_ContasAPagar.BitBtn_GerarParcaela_MovClick(Sender: TObject);
var
 qend, qend1 : TZQuery;
 LongintVar, i : Integer;
 DataConta : TDate;
 DataUltParcela : TDate;
begin
 qend := TZQuery.Create(nil);
 qend.Connection := dm.Conect;

 qend1 := TZQuery.Create(nil);
 qend1.Connection := dm.Conect;

 qend.SQL.Clear;
 qend.SQL.Add(' SELECT ID, CENTRODECUSTO, VALORTOTAL '+#10+
              ' FROM CONTAS_A_PAGAR WHERE ID = '''+
 dm.qContasaPagar.FieldByName('id').asstring +''' ');
 qend.Open;

 qend1.SQL.Clear;
 qend1.SQL.Add('SELECT IDCONTA FROM CONTAS_A_PAGAR_DETALHE '+
 'WHERE IDCONTA = '''+ qend.FieldByName('ID').AsString +''' ');
 qend1.Open;

   LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
   DataConta := StrToDate(edt_Data_CP.text);
 try
  if LongintVar = 1 then
   begin
     Messagedlg('Este Pagamento não tem Parcelas a Ser Geradas!',mtinformation,[mbok],0);
     exit;
   end
   else
 if qend1.RecordCount > 0 then
  begin
   Messagedlg('As Parcelas Já Foram Geradas Anteriormente!',mtinformation,[mbok],0);
   exit;
  end
  else
  begin
  LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
  for I := 1 to LongintVar do
    begin
     qend1.SQL.Clear;
     qend1.SQL.Add(' INSERT INTO CONTAS_A_PAGAR_DETALHE      '+#10+
                  ' (CENTRODECUSTO, IDCONTA, VALOR, JUROS,   '+#10+
                  '  DESCONTOS, DATAVENCIMENTO, PARCELA, VALORDEVEDOR)     ');
     qend1.SQL.Add(' VALUES                                  ');
     qend1.SQL.Add(' (:P1, :P2, :P3, :P4, :P5, :P6, :P7, :P8)     ');

     qend1.ParamByName('P1').asString    :=
                                     qend.FieldByName('CENTRODECUSTO').asString;

     qend1.ParamByName('P2').asString    := qend.FieldByName('ID').asString;

     qend1.ParamByName('P3').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;

     qend1.ParamByName('P4').asString    := '0';
     qend1.ParamByName('P5').asString    := '0';
     qend1.ParamByName('P6').asDate      := incMonth(DataConta, i);
     qend1.ParamByName('P7').AsString   := IntToStr(i)+'/'+ IntToStr(LongintVar);
     qend1.ParamByName('P8').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;
     qend1.ExecSQL;
     end;
  end;

  except
   On E: Exception do
   raise Exception.Create(E.Message);

  end;
      ShowMessage('Foram Geradas ' + IntToStr(LongintVar) + ' Parcela(s) com Sucesso');
end; 


A Segunda Parte que é para atualizar meu campo "DatavUltParcela" na minha tabela conforme a "contas_a_pagar" é que mora o problema.

Segue o comando que estou usando para ela.

 begin
       qend.SQL.Clear;
       qend.SQL.Add(' UPDATE CONTAS_A_PAGAR SET  (DATAVULTPARCELA)        '+#10+
       ' WHERE ID = '''+ qend1.FieldByName('IDCONTA').AsString +'''       ');
       qend.SQL.Add(' VALUES                                              ');
       qend.SQL.Add(' (:CP1)                                              ');
       qend.ParamByName('CP1').asDate      := incMonth(DataConta, i);
       qend.ExecSQL;
       end;


Será que estou fazendo algo de errado?

Segue o código Completo do codigo:

procedure Tfrm_ContasAPagar.BitBtn_GerarParcaela_MovClick(Sender: TObject);
var
 qend, qend1 : TZQuery;
 LongintVar, i : Integer;
 DataConta : TDate;
 DataUltParcela : TDate;
begin
 qend := TZQuery.Create(nil);
 qend.Connection := dm.Conect;

 qend1 := TZQuery.Create(nil);
 qend1.Connection := dm.Conect;

 qend.SQL.Clear;
 qend.SQL.Add(' SELECT ID, CENTRODECUSTO, VALORTOTAL '+#10+
              ' FROM CONTAS_A_PAGAR WHERE ID = '''+
 dm.qContasaPagar.FieldByName('id').asstring +''' ');
 qend.Open;

 qend1.SQL.Clear;
 qend1.SQL.Add('SELECT IDCONTA FROM CONTAS_A_PAGAR_DETALHE '+
 'WHERE IDCONTA = '''+ qend.FieldByName('ID').AsString +''' ');
 qend1.Open;

   LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
   DataConta := StrToDate(edt_Data_CP.text);
 try
  if LongintVar = 1 then
   begin
     Messagedlg('Este Pagamento não tem Parcelas a Ser Geradas!',mtinformation,[mbok],0);
     exit;
   end
   else
 if qend1.RecordCount > 0 then
  begin
   Messagedlg('As Parcelas Já Foram Geradas Anteriormente!',mtinformation,[mbok],0);
   exit;
  end
  else
  begin
  LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
  for I := 1 to LongintVar do
    begin
     qend1.SQL.Clear;
     qend1.SQL.Add(' INSERT INTO CONTAS_A_PAGAR_DETALHE      '+#10+
                  ' (CENTRODECUSTO, IDCONTA, VALOR, JUROS,   '+#10+
                  '  DESCONTOS, DATAVENCIMENTO, PARCELA, VALORDEVEDOR)     ');
     qend1.SQL.Add(' VALUES                                  ');
     qend1.SQL.Add(' (:P1, :P2, :P3, :P4, :P5, :P6, :P7, :P8)     ');

     qend1.ParamByName('P1').asString    :=
                                     qend.FieldByName('CENTRODECUSTO').asString;

     qend1.ParamByName('P2').asString    := qend.FieldByName('ID').asString;

     qend1.ParamByName('P3').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;

     qend1.ParamByName('P4').asString    := '0';
     qend1.ParamByName('P5').asString    := '0';
     qend1.ParamByName('P6').asDate      := incMonth(DataConta, i);
     qend1.ParamByName('P7').AsString   := IntToStr(i)+'/'+ IntToStr(LongintVar);
     qend1.ParamByName('P8').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;
     qend1.ExecSQL;
     end;

     begin
      LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
      for I := 1 to LongintVar do
      begin
       qend.SQL.Clear;
       qend.SQL.Add(' UPDATE CONTAS_A_PAGAR SET  (DATAVULTPARCELA)        '+#10+
       ' WHERE ID = '''+ qend1.FieldByName('IDCONTA').AsString +'''       ');
       qend.SQL.Add(' VALUES                                              ');
       qend.SQL.Add(' (:CP1)                                              ');
       qend.ParamByName('CP1').asDate      := incMonth(DataConta, i);
       qend.ExecSQL;
       end;
    end;



  end;

  except
   On E: Exception do
   raise Exception.Create(E.Message);

  end;
      ShowMessage('Foram Geradas ' + IntToStr(LongintVar) + ' Parcela(s) com Sucesso');
end;


Estou trabalhando com banco de dados Mysql.

Será que estou colocando a segunda parte no lugar errado? Falta algo? ou o Procedimento é errado?

Alguém pode me ajudar por favor?

Estou iniciando meus trabalhos com Delphi Tokio 10.2 e ainda sou um pouco leigo no assunto!!!

Desde já agradeço a todos que ajudarem ou pelo menos tentarem.
Marcelo Mousinho

Marcelo Mousinho

Curtidas 0

Melhor post

Fernando Duwe

Fernando Duwe

24/08/2018

Oi Marcelo,

O erro está na estrutura do seu Update, segue a maneira correta:

begin
	qend.SQL.Clear;
	qend.SQL.Add(' UPDATE CONTAS_A_PAGAR ');
	qend.SQL.Add(' SET DATAVULTPARCELA = :CP1 ');
	qend.SQL.Add(' WHERE ID = :IDCONTA ');
	qend.ParamByName('IDCONTA').AsInteger := qend1.FieldByName('IDCONTA').AsInteger;
	qend.ParamByName('CP1').AsDate 		  := incMonth(DataConta, i);
	qend.ExecSQL;
end;
GOSTEI 2

Mais Respostas

Marcelo Mousinho

Marcelo Mousinho

23/08/2018

Man esta dando o mesmo erro!!! o que será?<br />
<br />
O Erro é "Field Not Found IDCONTA", porque será que ele não esta enxergando?
GOSTEI 0
Marcelo Mousinho

Marcelo Mousinho

23/08/2018

Mudei seu código para puxar direto da DM, não esta dando mais erro, porém não esta atualizando a outra tabela.

qend.SQL.Clear;
      qend.SQL.Add(' UPDATE CONTAS_A_PAGAR ');
      qend.SQL.Add(' SET DATAVULTPARCELA = :CP1 ');
      qend.SQL.Add(' WHERE ID = :IDCONTA ');
      qend.ParamByName('IDCONTA').AsInteger := dm.qparcelasIDConta.Value;
      qend.ParamByName('CP1').AsDate        := incMonth(DataConta, i);
      qend.ExecSQL;
GOSTEI 0
Marcelo Mousinho

Marcelo Mousinho

23/08/2018

Pessoal, consegui resolver aqui!!!

Montei uma SQL para atualizar com um c o campo fantasma que já havia na segunda tabela (DataRecebimento), este campo se tornou a data da ultima parcela com o comando MAX() de acordo com ID e IDCONTA.

Segue o código:

procedure Tfrm_ContasAPagar.BitBtn_GerarParcaela_MovClick(Sender: TObject);
var
 qend, qend1 : TZQuery;
 LongintVar, i : Integer;
 LongintVar2, i2 : Integer;
 DataConta : TDate;
 DataUltParcela : TDate;
begin
 qend := TZQuery.Create(nil);
 qend.Connection := dm.Conect;

 qend1 := TZQuery.Create(nil);
 qend1.Connection := dm.Conect;

 qend.SQL.Clear;
 qend.SQL.Add(' SELECT ID, CENTRODECUSTO, VALORTOTAL '+#10+
              ' FROM CONTAS_A_PAGAR WHERE ID = '''+
 dm.qContasaPagar.FieldByName('id').asstring +''' ');
 qend.Open;

 qend1.SQL.Clear;
 qend1.SQL.Add('SELECT IDCONTA FROM CONTAS_A_PAGAR_DETALHE '+
 'WHERE IDCONTA = '''+ qend.FieldByName('ID').AsString +''' ');
 qend1.Open;

   LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
   DataConta := StrToDate(edt_Data_CP.text);


 try

  if qend1.RecordCount > 0 then
  begin
   Messagedlg('As Parcelas Já Foram Geradas Anteriormente!',mtinformation,[mbok],0);
   exit;
  end
  else
  begin
  LongintVar := StrToInt(edt_QtdParcelas_CP.Text);
  for I := 1 to LongintVar do
    begin
     qend1.SQL.Clear;
     qend1.SQL.Add(' INSERT INTO CONTAS_A_PAGAR_DETALHE      '+#10+
                  ' (CENTRODECUSTO, IDCONTA, VALOR, JUROS,   '+#10+
                  '  DESCONTOS, DATAVENCIMENTO, PARCELA, VALORDEVEDOR)     ');
     qend1.SQL.Add(' VALUES                                  ');
     qend1.SQL.Add(' (:P1, :P2, :P3, :P4, :P5, :P6, :P7, :P8)     ');

     qend1.ParamByName('P1').asString    :=
                                     qend.FieldByName('CENTRODECUSTO').asString;

     qend1.ParamByName('P2').asString    := qend.FieldByName('ID').asString;

     qend1.ParamByName('P3').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;

     qend1.ParamByName('P4').asString    := '0';
     qend1.ParamByName('P5').asString    := '0';

     if LongintVar = 1 then
     begin
      qend1.ParamByName('P6').asDate      := DataConta;
     end
     else
     qend1.ParamByName('P6').asDate      := incMonth(DataConta, i-1);
     qend1.ParamByName('P7').AsString   := IntToStr(i)+'/'+ IntToStr(LongintVar);
     qend1.ParamByName('P8').AsCurrency
                           := qend.FieldByName('VALORTOTAL').Value / LongintVar;
     qend1.ExecSQL;
     end;

  end;

  except
   On E: Exception do
   raise Exception.Create(E.Message);

  end;

     if LongintVar = 1 then
   begin
     ShowMessage('Foi Gerada ' + IntToStr(LongintVar) + ' Parcela com Sucesso');
     BitBtn_PesquisarCP.Click;
   end
   else
     ShowMessage('Foram Geradas ' + IntToStr(LongintVar) + ' Parcela(s) com Sucesso');
     BitBtn_PesquisarCP.Click;
end;
GOSTEI 1
POSTAR