diminuir o generator se o insert der um erro

Firebird

20/07/2006

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.


Emersonsj

Emersonsj

Curtidas 0

Respostas

Rodolpho123

Rodolpho123

20/07/2006

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.


GOSTEI 0
Emersonsj

Emersonsj

20/07/2006

Obrigado Rodolpho pela dica.


GOSTEI 0
POSTAR