Fórum AUTO INCREMENT FIREBIRD #463478
09/12/2013
0
Raniel Gomes
Curtir tópico
+ 0Posts
10/12/2013
Joel Rodrigues
Gostei + 0
10/12/2013
Joel Rodrigues
Gostei + 0
10/12/2013
Raniel Gomes
Gostei + 0
10/12/2013
Deivison Melo
CREATE GENERATOR AGenerator; SET GENERATOR AGenerator TO 1;
A função: "GEN_ID" é usada para incrementar valores ao seu generator...
Veja o exemplo abaixo:
SELECT GEN_ID(AGenerator, 1) from RDB$DATABASE;
Abaixo mostrarei como criar um Generator e Popular o mesmo com uso de uma
trigger.
CREATE GENERATOR CUST_NO_GEN; SET GENERATOR CUST_NO_GEN TO 0;
SET SQL DIALECT 3;
CREATE GENERATOR CUST_NO_GEN;
SET TERM ^ ;
CREATE OR ALTER TRIGGER SET_CUST_NO FOR CUSTOMER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (new.cust_no is null) then
new.cust_no = gen_id(cust_no_gen, 1);
END
^
SET TERM ; ^
Além dos Generators você poderá fazer uso das sequences
adicionadas ao firebird em sua versão 2.0.
A explicação das mesmas ficará para uma outra oportunidade
ou no caso de você preferir o uso delas, basta sinalizar
que exemplificarei a sua criação e uso.
Abração e bons códigos.
Emanoel Deivison
Recife - PE
Gostei + 0
10/12/2013
Thiago Irrazabal
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
12/12/2013
Raniel Gomes
Gostei + 0
12/12/2013
Joel Rodrigues
Abraço a todos.
Gostei + 0
12/12/2013
Deivison Melo
function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
else
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;
PS. Lembrando que usei os componentes DBX.
Abração e bons códigos!
Atenciosamente,
Emanoel Deivison
Recife - PE
Gostei + 0
12/12/2013
Thiago Irrazabal
function IncrementaPK(NomeGenerator_Tabela: string; i: Integer;
CampoIncremento: string): Integer;
var
x, Generator: string;
Q1, Q2, Q3: TSQLQuery;
const
sSqlFindGenerator = 'SELECT RDB$GENERATOR_NAME AS GEN FROM RDB$GENERATORS WHERE UPPER(RDB$GENERATOR_NAME) = ''%s''';
sSqlGetGenerator = 'SELECT GEN_ID(%s,%s) AS INC FROM RDB$DATABASE';
sSqlMaxField = 'SELECT COALESCE(MAX(%s),0) AS MAXFIELD FROM %s';
sSqlSetGenerator = 'SET GENERATOR %s TO %s';
begin
Generator := UpperCase('G_' + NomeGenerator_Tabela);
Generator := Copy(Generator, 1, 31);
Q1 := ExecSql(Format(sSqlFindGenerator, [Generator]));
try
if Q1.FieldByName('GEN').IsNull then
begin
Connection.ExecuteDirect(' CREATE GENERATOR ' + Generator);
x := Format(sSqlMaxField, [CampoIncremento, NomeGenerator_Tabela]);
if Trim(CampoIncremento) <> '' then
begin
if Existe_Tabela(UpperCase(NomeGenerator_Tabela)) then
begin
Q2 := ExecSql(x);
try
Connection.ExecuteDirect(Format(sSqlSetGenerator, [Generator, Q2.FieldByName('MAXFIELD').AsString]));
finally
FreeAndNil(Q2);
end;
end;
end;
end;
finally
FreeAndNil(Q1);
end;
Q3 := ExecSql(Format(sSqlGetGenerator, [Generator, IntToStr(i)]));
try
Result := Q3.FieldByName('INC').AsInteger;
finally
FreeAndNil(Q3);
end;
end;
Nesse caso precisa dessa outra função.
function ExecSql(X: String): TSQLQuery; begin Result := TSQLQuery.Create(nil); Result.SQLConnection := Connection; Result.Close; Result.SQL.Clear; Result.SQL.Add(X); Result.Open; end;
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
18/06/2015
Marcelino Wille
Sou iniciante em programação comecei estudando delphi, mas resolvi migrar para o LAZARUS essa dica foi perfeita
function Tdm.GeneratorID(aName: string; Connection: TIBConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.DataBase := Connection;
if Incrementa then
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
else
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end; como usei
procedure Tdm.SQLFUNCIONARIONewRecord(DataSet: TDataSet);
begin
SQLFUNCIONARIO.FieldByName('COD_FUNCIONARIO').Value:=GeneratorID('GEN_FUNCIONARIO_ID',dbtransportes,TRUE);
end; Gostei + 0
20/06/2015
Denilosn Carlos
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.DataBase := Connection;
if Incrementa then
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
else
Qry.SQL.Add(
'SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;
este código eu uso em todas as tabelas ?
Gostei + 0
20/06/2015
Denilosn Carlos
o código é o mesmo para gerar ?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)