Autoincremento no Firebird

29/11/2004

0

Caros colegas,

Finalmente decidi refazer meus programas usando o Firebird. E... de cara já estou enfrentando um problema.

Tenho uma trigger e um generator para gerar o codigo sequencial de um produto, que é disparado quando clico no botão insert que tenho no form. Tudo funciona bem , com uma única exceção. E só consigo ver o numero gerado para o código, quando saio do programa e abro novamente. Alguém tem idéa do que pode ser???

//Generator

Create Generator Gen_Contas;


//Trigger

CREATE TRIGGER TGCONTAS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.Cta_codigo is null) then
new.cta_codigo = gen_id(gen_contas, 1);
end


e também já coloquei o required do TField para False.

Não estou entendendo porque isto está acontecendo.

Tenho que executar algum outro código em algum evento??


Obrigado

dli


Responder

Posts

29/11/2004

Gandalf.nho

Qual o componente de acesso aos dados que você usa?


Responder

29/11/2004

Aersoftware

Amigo, enfrentei esse mesmo problema um tempo atras e fui muito bem ajudado pelo pessoal aqui do fórum..

No meu caso, eu uso o dbExpress como componente de acesso, usando um SQLDataSet+Provider+ClientDataSet+DataSource..

No evento OnNewRecord, do ClientDataSet, eu uso a seguinte rotinha, pra pegar o valor do gerador e colocar no campo de código..

  SQLstmt := ´select gen_id(GEN_NomeDaTabela_ID, 1) ´+
             ´as VALOR from RDB$DATABASE;´;
  ResultSet := nil;
  try
    ConexaoFb.Execute(SQLstmt, nil, @ResultSet);
    if Assigned(ResultSet) then
      ClientNacionaisPkCod_RevNac.AsInteger :=
        ResultSet.FieldByName(´VALOR´).AsInteger;
    finally
      ResultSet.Free;
    end;


Espero ter ajudado...



Allan Elias Ramos :wink:


Responder

29/11/2004

Aersoftware

Há, faltou um pedacinho do código, o completo esta abaixo..


var
  ResultSet : TCustomSQLDataSet;
  SQLstmt : string;

begin
  SQLstmt := ´select gen_id(GEN_TBREVNACIONAIS_ID, 1) ´+
             ´as VALOR from RDB$DATABASE;´;
  ResultSet := nil;
  try
    ConexaoFb.Execute(SQLstmt, nil, @ResultSet);
    if Assigned(ResultSet) then
      ClientNacionaisPkCod_RevNac.AsInteger :=
        ResultSet.FieldByName(´VALOR´).AsInteger;
    finally
      ResultSet.Free;
    end;

end;




Allan Elias Ramos :wink:


Responder

29/11/2004

Dli

Obrigado por sua resposta.

Coloquei o seguinte codigo, mas ainda dá erro dizendo que Cta_Codigo não existe. Podes verificar o código abaixo?

Uso as mesmas conexões que você, portanto tenho:

BDados: ConexaoBD
Dataset: ClientDataset1
SQl: SQLDataset1
DS: Datasource1

Um abraço.

dli


Responder

29/11/2004

Aersoftware

No caso dos seus componentes, ficaria assim o código..

var
  ResultSet : TCustomSQLDataSet;
  SQLstmt : string;

begin
  SQLstmt := ´select gen_id(GEN_NomeDaTabela_ID, 1) ´+
             ´as VALOR from RDB$DATABASE;´;
  ResultSet := nil;
  try
    ConexaoBD.Execute(SQLstmt, nil, @ResultSet);
    if Assigned(ResultSet) then
      ClientDataSet1Cta_Codigo.AsInteger :=
        ResultSet.FieldByName(´VALOR´).AsInteger;
    finally
      ResultSet.Free;
    end;

end;




Allan Elias Ramos :wink:


Responder

30/11/2004

Dli

Valeu pela ajuda amigo,

Vou testar amanhã , na empresa e espero que funcione.

Agora, acho incrivel que todo mundo fale que é simples fazer uma trigger de auto-incremento. Será que só nós tivemos este problema? Pois pelo que estou vendo este problema deve ser comum . Só que ninguém fala ou diz o caminho das pedras.

Estou preocupado, pois recém começei a programar com firebird e já estou tendo dificuldades , com coisas que são tão banais no Paradox.


sds,

dli


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar