Atualizar uma tabela após atualizar outra???
23/08/2018
0
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
Post mais votado
24/08/2018
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;
Fernando Duwe
Mais Posts
24/08/2018
Marcelo Mousinho
<br />
O Erro é "Field Not Found IDCONTA", porque será que ele não esta enxergando?
24/08/2018
Marcelo Mousinho
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;
25/08/2018
Marcelo Mousinho
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;
Clique aqui para fazer login e interagir na Comunidade :)