Share Button

Até a versão 2.5 do Firebird não existe a figura da coluna Auto-Incremento que existe em outros banco de dados.

No Firebird, você deve criar um GENERATOR que ira cuidar de gerar a sequência e associar uma Trigger para incluir o sequencial na tabela.

Exemplo para criar uma tabela de cliente com código Auto-Incremento:

// criar o recurso para armazenar o auto-incremento
CREATE GENERATOR CODIGO_CLIENTE; (formato mais antigo)
ou
CREATE SEQUENCE CODIGO_CLIENTE; (formato novo)    

// criar a tabela
CREATE TABLE FB_CLIENTE (
    CODIGO    INTEGER NOT NULL,
    NOME      VARCHAR(50),
    ENDERECO  VARCHAR(128),
    CIDADE    VARCHAR(32),
    ESTADO    VARCHAR(5)
);

// para marcar o valor inicial (é opcional)
ALTER SEQUENCE CODIGO_CLIENTE RESTART WITH 0;

// Trigger para gerar o próximo código
SET TERM ^ ;
CREATE OR ALTER TRIGGER FB_CLIENTE_GERAR_CODIGO FOR FB_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.codigo =  gen_id(CODIGO_CLIENTE,1);
end
^
SET TERM ; ^

Usando insert para retornar o valor o código inserido:

insert into fb_cliente
                  (nome,endereco,cidade,estado) 
            values( :nome,:endereço,:cidade,:estado)
            returning codigo into :codigo_cliente

 

Com FireDAC, utilizar o método FDQuery1.OPEN e irá retornar o parâmetro INTO como na lista de FIELDS (código cliente);

Share Button

Sabe aquele cadastro de cliente que você vai inserir um novo cliente e lá o código do cliente é uma coluna gerada com GENERATOR – (auto-incremento), pode ser uma grande dor de cabeça se não estiver seguro sobre o código inserido na tabela.
Muitas vezes precisa deste ID para utiliza-lo em outro lugar. Se errar o ID o registro final irá ficar errado, associando ao cliente errado…
Outra situação é, se demorar algum tempo para descobrir o ID e outro usuário inserir um outro cliente enquanto o app fazia alguma coisa…. vai dar confusão. É preciso garantir com precisão o ID que foi inserido no momento que o banco postou na tabela.

Para resolver estas situações o Firebird permite obter valores de retorno de um INSERT.

Exemplo:

   insert into cliente( nome, endereco, ...) values( :nome,:endereco,...)
   returning id_cliente into :id

Ao executar o comando de INSERT, o banco irá retornar no parâmetro o valor inserido pelo GENERATOR no parâmetro ID.