Olá Pessoal, no meu Curso D2007 DBX4 FB2.0 eu mostrei uma maneira de retornar o próximo ID no Firebird com o uso de Generator. Acontece que a partir daí recebi inúmeros de pessoas querendo saber como fazer no MySql. Então vamos lá.
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 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;
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;