Atualizar uma tabela após atualizar outra???
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:
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.
Será que estou fazendo algo de errado?
Segue o código Completo do codigo:
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.
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
Curtidas 0
Melhor post
Fernando Duwe
24/08/2018
Oi Marcelo,
O erro está na estrutura do seu Update, segue a maneira correta:
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
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?
<br />
O Erro é "Field Not Found IDCONTA", porque será que ele não esta enxergando?
GOSTEI 0
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
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:
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