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