Autoincremento no Firebird
29/11/2004
0
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
Dli
Posts
29/11/2004
Aersoftware
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:
29/11/2004
Aersoftware
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:
29/11/2004
Dli
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
29/11/2004
Aersoftware
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:
30/11/2004
Dli
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
Clique aqui para fazer login e interagir na Comunidade :)