Delphi + firebird - trigger não funciona
07/06/2024
0
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](https://www.devmedia.com.br/imagens/fotoscolunistas/896144_20240607103723.jpg)
Gilberto Moreira
Posts
07/06/2024
Arthur Heinrich
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.
08/06/2024
Gilberto Moreira
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.
08/06/2024
Gilberto Moreira
10/06/2024
Arthur Heinrich
É 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.
Clique aqui para fazer login e interagir na Comunidade :)