DBExpress: Obter AutoInc após o Post
Pessoal,
estou usando o DBX/UIB com Firebird 1.5
seto o TField ´CODIGO´ do DataSet para AutoInc,
está funcionando corretamente, ao dar Post, ApplyUpdates...... o banco gera o autoinc corretamente....
MAS...... e agora, se eu precisar, logo após o Post, ter na mão qual foi o código autoinc gerado, para usar, por exemplo, num registro DETALHE..... oq devo fazer.
Qualquer dica será bem vinda!!!!!!
Bye
estou usando o DBX/UIB com Firebird 1.5
seto o TField ´CODIGO´ do DataSet para AutoInc,
está funcionando corretamente, ao dar Post, ApplyUpdates...... o banco gera o autoinc corretamente....
MAS...... e agora, se eu precisar, logo após o Post, ter na mão qual foi o código autoinc gerado, para usar, por exemplo, num registro DETALHE..... oq devo fazer.
Qualquer dica será bem vinda!!!!!!
Bye
Eniorm
Curtidas 0
Respostas
Adriano Santos
16/03/2006
[quote:1fcdb77ae4=´Enio Marconcini´]Pessoal,
estou usando o DBX/UIB com Firebird 1.5
seto o TField ´CODIGO´ do DataSet para AutoInc,
está funcionando corretamente, ao dar Post, ApplyUpdates...... o banco gera o autoinc corretamente....
MAS...... e agora, se eu precisar, logo após o Post, ter na mão qual foi o código autoinc gerado, para usar, por exemplo, num registro DETALHE..... oq devo fazer.
Qualquer dica será bem vinda!!!!!!
Bye[/quote:1fcdb77ae4]
Cara, existem diversas formas. Uma delas, acredito a menos usada, seja fazer uma select na tabela. Ex:
estou usando o DBX/UIB com Firebird 1.5
seto o TField ´CODIGO´ do DataSet para AutoInc,
está funcionando corretamente, ao dar Post, ApplyUpdates...... o banco gera o autoinc corretamente....
MAS...... e agora, se eu precisar, logo após o Post, ter na mão qual foi o código autoinc gerado, para usar, por exemplo, num registro DETALHE..... oq devo fazer.
Qualquer dica será bem vinda!!!!!!
Bye[/quote:1fcdb77ae4]
Cara, existem diversas formas. Uma delas, acredito a menos usada, seja fazer uma select na tabela. Ex:
procedure TForm1.Button1Click(Sender: TObject); var Resultado : Double; begin with qryClientes do begin Close; Sql.Clear; Sql.Add(´SELECT MAX(CAMPO) AS ULT_REGISTRO FROM TABELA´); Open; Resultado := FieldbyName(´ULT_REGISTRO´).AsFloat; Close; end; end;
GOSTEI 0
Eniorm
16/03/2006
Sim, essa forma funciona, mas se o sistema estiver em rede, acho que pode ocorrer de pegar o codigo de um último registro inserido, mas não for o registro correspondente ao que foi inserido pelo usuário;.
GOSTEI 0
Marco Salles
16/03/2006
Enio Marconcini eu tenho acompanhado aqui no site esta tecnologia dbexpress e tb o problema e confusões com o a utilização de campo autoincrementados etc... Pude perceber o seguinte
situação que não deixa margem de desconfiança e usar uma sql que alem de retornar ela incrementa uma unidade no valor do generator.. e atribuir esse valor para o campo , quando se da um post , ou se dar um append na tabela
e mais ou menos assim :
var
ValorCampo:integer; //desnecessário
eu coloquei no evento BeforePost do Sql , para tentar ganhar mais tempo o possivel , porque toda vez que se executa uma consulta na SQLQuery1 , o valor do Generator é acrescentado mais um
A sql que incrementa esta definida nun SqlQuery a parte e foi definida assim a nivel de projeto
[b:87cce4552f]eu estou inclinado a pensar que esta é a melhor forma , quando se quer ter o valor do incremento , imediatamente apos a inclusão do registro , que parece ser o seu caso[/b:87cce4552f]
situação que não deixa margem de desconfiança e usar uma sql que alem de retornar ela incrementa uma unidade no valor do generator.. e atribuir esse valor para o campo , quando se da um post , ou se dar um append na tabela
e mais ou menos assim :
var
ValorCampo:integer; //desnecessário
eu coloquei no evento BeforePost do Sql , para tentar ganhar mais tempo o possivel , porque toda vez que se executa uma consulta na SQLQuery1 , o valor do Generator é acrescentado mais um
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet); begin ClientDataSet1.FieldByName(´****´).AsInteger:=SQLQuery1.FieldByName(´ValorChave´).Asinteger; ValorCampo:=ClientDataSet1.FieldByName(´*****´).AsInteger; showmessage(inttostr(ValorCampo)); end;
A sql que incrementa esta definida nun SqlQuery a parte e foi definida assim a nivel de projeto
select gen_id(Gen_Venda, 1) as ValorChave from rdb$database;
[b:87cce4552f]eu estou inclinado a pensar que esta é a melhor forma , quando se quer ter o valor do incremento , imediatamente apos a inclusão do registro , que parece ser o seu caso[/b:87cce4552f]
MAS...... e agora, se eu precisar, logo após o Post, ter na mão qual foi o código autoinc gerado, para usar, por exemplo, num registro DETALHE..... oq devo fazer.
GOSTEI 0
Marco Salles
16/03/2006
desculpe , esqueci de dar um close e um open para pegar o valor do generator e incrementa-lo
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet); begin SQLQuery1.Close; SQLQuery1.open; ClientDataSet1.FieldByName(´****´).AsInteger:=SQLQuery1.FieldByName(´ValorChave´).Asinteger; ValorCampo:=ClientDataSet1.FieldByName(´****).AsInteger; showmessage(inttostr(ValorCampo)); end;
GOSTEI 0