Duvidas com trigger - como alimentar um campo com regra

Firebird

26/07/2005

Tenho em meu banco de dados uma tabela de historico com os seguintes campos: empresa (integer), codigo(integer), historico(varchar(50))

O campo empresa esta relacionado com outra tabela (empresa).
Na tabela de historico minha chave primaria é empresa, codigo.

Gostaria de criar uma trigger que quando inclui-se um novo registro
pegasse o nr. do ultimo historico da empresa x e somasse mais um.

Por exemplo, tenho as empresas 1 e 2
Minha tab de historico esta zerada.
Na primeira inserção da empresa 1 deveria ficar assim:

inserção empresa codigo
1............. 1 ................ 1
2............. 1 ................ 2
3............. 1 ................ 3

O problema é quando for lançar a empresa 2, o código não poderá ser 4 uma vez que não pertence a esta empresa, deverá ser assim:

inserção empresa codigo
1............. 1 ................ 1
2............. 1 ................ 2
3............. 1 ................ 3

4............. 2 ................ 1
5............. 2 ................ 2
6............. 2 ................ 3
7............. 2 ................ 4

8............. 1 ................ 4
9............. 1 ................ 5

Como posso fazer isto?

Obrigado.


Emarcolongo

Emarcolongo

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

26/07/2005

Veja se é isso o que vc quer.

SET TERM ^;
CREATE TRIGGER GERA_CODIGO FOR HISTORICO 
BEFORE INSERT
AS
DECLARE VARIABLE ULTIMOCODIGO INTEGER;
BEGIN
    SELECT MAX(CODIGO) FROM HISTORICO WHERE EMPRESA = NEW.EMPRESA INTO :ULTIMOCODIGO;
    NEW.CODIGO = ULTIMOCODIGO;
END ^
SET TERM ;^



GOSTEI 0
Emarcolongo

Emarcolongo

26/07/2005

Tentei desta forma mas aparece uma mensagem informando que o valor do codigo não pode ser nulo. Minha tabela esta vazia. Neste caso o Max(Codigo) retorna null, mesmo colocando NEW.CODIGO = VARIAVEL+1, ele apresenta este problema.
Como devo fazer agora ?

Obrigado.


GOSTEI 0
Gandalf.nho

Gandalf.nho

26/07/2005

OK, deixa eu alterar então o código (e aproveitar para corrigir um errinho)

SET TERM ^; 
CREATE TRIGGER GERA_CODIGO FOR HISTORICO 
BEFORE INSERT 
AS 
DECLARE VARIABLE ULTIMOCODIGO INTEGER; 
BEGIN 
    SELECT COALESCE(MAX(CODIGO), 0) FROM HISTORICO WHERE EMPRESA = NEW.EMPRESA INTO :ULTIMOCODIGO; 
    NEW.CODIGO = ULTIMOCODIGO + 1; 
END ^ 
SET TERM ;^



GOSTEI 0
Emarcolongo

Emarcolongo

26/07/2005

Obrigado, funcionou blz.
Vc utilizou comandos que eu não conhecia, sou iniciante na programação do banco, que agora aprendi.
So mais um duvida, sei que devemos colocar : na varivel, mas porque quando usamos:

new.codigo = ultimocodigo + 1;

ficou sem os :
coloquei e o resultado foi o mesmo, por que então a diferença.
Obrigado por tudo.


GOSTEI 0
Gandalf.nho

Gandalf.nho

26/07/2005

Pelo que sei os : só seriam obrigatórios na cláusula INTO do SELECT


GOSTEI 0
Emarcolongo

Emarcolongo

26/07/2005

isso eu não conhecia. Sou iniciante em client-server

Obrigado.


GOSTEI 0
POSTAR