Fórum diminuir o generator se o insert der um erro #56585
20/07/2006
0
Por gentileza gostaria de esclarecer um dúvida sobre subtrair um generator caso o insert der errado conforme o código especificado abaixo.
esse código é só um exemplo para servir de referência a minha dúvida
procedure TfrmContaPagar.BtGravaClick(Sender: TObject);
var
id_contapagto : Integer;
id_itemcontapagto : Integer;
TD : TTransactionDesc;
begin
Perform(WM_NEXTDLGCTL, 0, 0);
If Not Consistencia Then
Abort;
With DmGps2 Do
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SQLConexao.StartTransaction(TD);
Try
id_contapagto := NovoGenerator(´gen_es_id_contapagto´);
tabela cabeçalho
Query1.CommandText := ´ insert into es_contapagto ´+
´ (cpt_id_contapagto, ´+
´ cpt_nota, ´+
´ cpt_id_fornece, ´+
´ cpt_dtemissao, ´+
´ cpt_historico, ´+
´ cpt_status) ´+
´ values (´+ QuotedStr(IntToStr(id_contapagto))+´,´
+ QuotedStr(edNota.Text)+´,´
+ QuotedStr(edCodFornece.Text)+´,´
+ QuotedStr((DateToStr(dtEmissao.Date))+´,´
+ QuotedStr(mObservacao.Text)+´,´
+ QuotedStr(´A´)+´)´;
Query1.ExecSQL;
Tabela detalhe do cabeçalho
Query2.First;
While Not Query2.Eof Do
begin
id_itemcontapagto := NovoGenerator (´gen_es_id_itemcontapagto´);
Query3.CommandText := ´ insert into es_itemcontapagto ´+
´ (icpt_id_itemcontapagto, ´+
´ icpt_id_contapagto, ´+
´ icpt_dtvencto, ´+
´ icpt_dtprazofin, ´+
´ icpt_valor, ´+
´ icpt_juros) ´+
´ values (´+ QuotedStr(IntToStr(id_itemcontapagto))+´,´
+ QuotedStr(IntToStr(id_contapagto))+´,´
+ QuotedStr(DateToStr(DataVencto.AsDateTime)))+´,´
+ QuotedStr(DateToStr(DataProzoFin.AsDateTime))+´,´
+ QuotedStr(SQLMoeda(VALOR.Value))+´,´
+ QuotedStr(´0´)+´)´;
Query3.ExecSQL;
Query2.Next;
end;
SQLConexao.Commit(TD);
Except
On E: Exception Do
begin
SQLConexao.Rollback(TD);
raise;
end;
end;
end; {With DmGps2 Do}
end;
Continuando percebe que no inicio do código é gerado um generator atribuido para a var id_contapagto que é especificada no insert do es_contapagto e no es_itemcontapagto, vamos supor que já tem um registro 1 o proximo seria o 2 caso o insert desse algum erro ele cairia no Except dando um Rollback tem como e voltar o generator no valor anterior que seria o 1, e se estiver em uma rede essa situação poça complicar na hora que outros usuário for incluir outros registros será que o firebird controla este recurso direito.
Desculpa se eu não fui muito claro e já agradeço a todos que sempre estão disposto ajudar.
esse código é só um exemplo para servir de referência a minha dúvida
procedure TfrmContaPagar.BtGravaClick(Sender: TObject);
var
id_contapagto : Integer;
id_itemcontapagto : Integer;
TD : TTransactionDesc;
begin
Perform(WM_NEXTDLGCTL, 0, 0);
If Not Consistencia Then
Abort;
With DmGps2 Do
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SQLConexao.StartTransaction(TD);
Try
id_contapagto := NovoGenerator(´gen_es_id_contapagto´);
tabela cabeçalho
Query1.CommandText := ´ insert into es_contapagto ´+
´ (cpt_id_contapagto, ´+
´ cpt_nota, ´+
´ cpt_id_fornece, ´+
´ cpt_dtemissao, ´+
´ cpt_historico, ´+
´ cpt_status) ´+
´ values (´+ QuotedStr(IntToStr(id_contapagto))+´,´
+ QuotedStr(edNota.Text)+´,´
+ QuotedStr(edCodFornece.Text)+´,´
+ QuotedStr((DateToStr(dtEmissao.Date))+´,´
+ QuotedStr(mObservacao.Text)+´,´
+ QuotedStr(´A´)+´)´;
Query1.ExecSQL;
Tabela detalhe do cabeçalho
Query2.First;
While Not Query2.Eof Do
begin
id_itemcontapagto := NovoGenerator (´gen_es_id_itemcontapagto´);
Query3.CommandText := ´ insert into es_itemcontapagto ´+
´ (icpt_id_itemcontapagto, ´+
´ icpt_id_contapagto, ´+
´ icpt_dtvencto, ´+
´ icpt_dtprazofin, ´+
´ icpt_valor, ´+
´ icpt_juros) ´+
´ values (´+ QuotedStr(IntToStr(id_itemcontapagto))+´,´
+ QuotedStr(IntToStr(id_contapagto))+´,´
+ QuotedStr(DateToStr(DataVencto.AsDateTime)))+´,´
+ QuotedStr(DateToStr(DataProzoFin.AsDateTime))+´,´
+ QuotedStr(SQLMoeda(VALOR.Value))+´,´
+ QuotedStr(´0´)+´)´;
Query3.ExecSQL;
Query2.Next;
end;
SQLConexao.Commit(TD);
Except
On E: Exception Do
begin
SQLConexao.Rollback(TD);
raise;
end;
end;
end; {With DmGps2 Do}
end;
Continuando percebe que no inicio do código é gerado um generator atribuido para a var id_contapagto que é especificada no insert do es_contapagto e no es_itemcontapagto, vamos supor que já tem um registro 1 o proximo seria o 2 caso o insert desse algum erro ele cairia no Except dando um Rollback tem como e voltar o generator no valor anterior que seria o 1, e se estiver em uma rede essa situação poça complicar na hora que outros usuário for incluir outros registros será que o firebird controla este recurso direito.
Desculpa se eu não fui muito claro e já agradeço a todos que sempre estão disposto ajudar.
Emersonsj
Curtir tópico
+ 0
Responder
Posts
20/07/2006
Rodolpho123
Esse seu campo chave tem realmente a necessidade de ser sequencial? Se não for, vc não precisa se preocupar com o insert do detalhe pois de der erro vai caír no [b:1bb5bd437d]except[/b:1bb5bd437d] e executar o [b:1bb5bd437d]Rollback[/b:1bb5bd437d].
Sinceridade, não faz muito sentido vc querer voltar uma numeração de generator, ainda mais para tratamentos de campos-chave. E se vc ainda assim necessitar de ter um campoi sequencial, aconselho a vc criar uma coluna serparada e sem fazer parte da chave primária.
Sinceridade, não faz muito sentido vc querer voltar uma numeração de generator, ainda mais para tratamentos de campos-chave. E se vc ainda assim necessitar de ter um campoi sequencial, aconselho a vc criar uma coluna serparada e sem fazer parte da chave primária.
Responder
Gostei + 0
20/07/2006
Emersonsj
Obrigado Rodolpho pela dica.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)