Fórum Codigo sequencial em cadastros #8294
04/08/2009
0
Rogério Nascimento
Curtir tópico
+ 0Posts
05/08/2009
Rodrigo Mourão
Desculpe a demora, eu estava caçando minha rotina aqui nas milhes de linhas de código.
No MySql eu trabalho com uma tabela chamada Generator com dois campos TableName e Value,
assim coloco la os registros com o ID:
Cliente 10
Perfil 5
Produtos 6
E por ai vai....
Na hora de pegar dou um update somo mais 1 e retono.
function TDM.GenID(tablename: String): Integer;
var
Qry: TSQLQuery;
Transaction: TDBXTransaction;
begin
try
try
Transaction := DBAcesso.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
DBAcesso.ExecuteDirect('UPDATE SEQUENCE SET NEXTVALUE = NEXTVALUE+1 WHERE TABLENAME = '+QuotedStr(tablename));
Qry := TSQLQuery.Create(Self);
Qry.SQLConnection := DBAcesso;
Qry.SQL.Add('SELECT NEXTVALUE FROM SEQUENCE WHERE TABLENAME = '+QuotedStr(tablename));
Qry.Open;
Result := Qry.Fields[0].AsInteger;
DBAcesso.DBXConnection.CommitFreeAndNil(Transaction);
except
DBAcesso.DBXConnection.RollbackFreeAndNil(Transaction);
end;
finally
FreeAndNil(Qry);
end;
end;
Abs
Gostei + 0
05/08/2009
Rogério Nascimento
Gostei + 0
05/08/2009
Rogério Nascimento
Gostei + 0
05/08/2009
Rodrigo Mourão
1) Bem pode usar em qualquer banco sim;
2) Se der Rollback nao vai incrementar não;
3) Agora quanto ao salto em caso de cancelar so tem um jeito. Vai no evento BeforeApplyUpdates e coloque lá. Assim só vai gerar quando realmente for gravar. Agora tem um porem se quiser ter o ID antes de gravar entao noa tem jeito, tem que gerar antes mesmo e se cancelar vai pular tb.
Poderia ate fazer uma rotina para Id nao usado em um tabela ai quando fosse gerar ia nesta tabela primeiro e tal mas ai daria muito trabalho e o custo beneficio nao compensaria !!
Abs !!
Gostei + 0
05/08/2009
Rogério Nascimento
Abraços !
Gostei + 0
05/08/2009
Rogério Nascimento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)