DBExpress: Obter AutoInc após o Post

16/03/2006

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


Eniorm

Respostas

16/03/2006

Adriano Santos

[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:

    
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; 




Responder Citar

16/03/2006

Eniorm

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;.


Responder Citar

16/03/2006

Marco Salles

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

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.



Responder Citar

16/03/2006

Marco Salles

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;



Responder Citar