Delphi + firebird - trigger não funciona

07/06/2024

0

Prezados,
Tenho as seguintes informações:

A)>> Criação da tabela CLIENTES
CREATE table CLIENTES (
Id_Cliente integer Primary Key,
Cliente Varchar(30),
Endereco Varchar (30),
Cidade_UF Varchar(25),
Fone Varchar(15),
Dominio Varchar(20),
Provedor Varchar(20),
SenhaDom Varchar(15),
DtCadas date,
Obs Varchar(100)
);

B)>>Criação da Generator
CREATE GENERATOR GERA_ID_CLIENTE

C)>>Criação da TRIGGER
SET TERM ^
CREATE TRIGGER GERANDO_ID_CLIENTE FOR CLIENTES
BEFORE INSERT POSITION 0
AS
BEGIN
NEW.ID_CLIENTE = GEN_ID(GERA_ID_CLIENTE,1);
END;
Escrevi um form com 3 campos Id_Cliente, Cliente, Endereco + 2 botões
NOVO
procedure TFrm_Cadastro.BtnNovoClick(Sender: TObject);
begin
Fdq_Clientes.Insert;
dbedit1.SetFocus;
end;

GRAVAR
procedure TFrm_Cadastro.BtnGravarClick(Sender: TObject);
begin
if Fdq_Clientes.State in [DsInsert] then
begin
Fdt_Clientes.StartTransaction;
Fdq_Clientes.Post;
FDT_Clientes.CommitRetaining;
end;
end;

Apos a execução retorna a msg de erro "FIELD ''ID_Clientge'' must have a value"
Uso o firebird 4.0

Por favor, me orientem a sanar este erro para que possa continuar meu projeto.
Agradeço e aguardo; obrigado
Gilberto Moreira

Gilberto Moreira

Responder

Posts

07/06/2024

Arthur Heinrich

Geralmente, quando um banco reclama de falta de valores atribuídos à PK, a mensagem de erro reporta uma violação da constraint.

A mensagem que diz que a coluna precisa de um valor parece ser mais uma verificação do componente, que percebe que a coluna é not null, do que o banco, que provavelmente funcionaria com a trigger.

Você pode, inclusive, inserir um registro manualmente no banco e checar se a trigger preenche a coluna corretamente.

Neste caso, se eu estiver correto, o componente que você está utilizando deveria ser capaz de ignorar este alerta. Para alguns bancos, onde a coluna é gerada pelo banco (autoidentity, autoincrement, default value, etc.), o dicionário de dados indica que a coluna é gerada de forma automática e os frameworks identificam isso e desativam a verificação do componente.

No seu caso, a coluna não foi definida com esta característica e o componente pode estar interpretando que o insert falhará, não chegando nem a executar o comando.
Responder

08/06/2024

Gilberto Moreira

Geralmente, quando um banco reclama de falta de valores atribuídos à PK, a mensagem de erro reporta uma violação da constraint.

A mensagem que diz que a coluna precisa de um valor parece ser mais uma verificação do componente, que percebe que a coluna é not null, do que o banco, que provavelmente funcionaria com a trigger.

Você pode, inclusive, inserir um registro manualmente no banco e checar se a trigger preenche a coluna corretamente.

Neste caso, se eu estiver correto, o componente que você está utilizando deveria ser capaz de ignorar este alerta. Para alguns bancos, onde a coluna é gerada pelo banco (autoidentity, autoincrement, default value, etc.), o dicionário de dados indica que a coluna é gerada de forma automática e os frameworks identificam isso e desativam a verificação do componente.

No seu caso, a coluna não foi definida com esta característica e o componente pode estar interpretando que o insert falhará, não chegando nem a executar o comando.
Responder

08/06/2024

Gilberto Moreira

Amigo, acho que não entendi a solução. "No seu caso, a coluna não foi definida com esta característica e o componente pode estar interpretando que o insert falhará, não chegando nem a executar o comando." Na criação da tabela, usei "Id_Cliente integer Primary Key,"
Responder

10/06/2024

Arthur Heinrich

O que eu quis dizer é que, ao definir uma coluna com constraint de primary key, a coluna se torna NOT NULL (que é uma outra constraint).

É possível que, ao olhar o dicionário de dados do banco, o seu componente identifique que a coluna é not null e, por não informar um valor para ela, o componente esteja reclamando que a coluna precisa de um valor ("FIELD ''ID_Clientge'' must have a value"), antes de executar o comando e tratar o erro no banco.

O componente não sabe que uma trigger vai preencher essa coluna, no banco, ao ser executado o insert.

Para resolver o problema, ou você preenche a coluna com um valor fake, para enganar a lógica do componente e que será substituído pela trigger, ou, se for possível, deve avisar ao seu componente que não deve checar se as colunas foram preenchidas corretamente, de forma que ele execute o comando no banco.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar