GARANTIR DESCONTO

Fórum Duvidas com trigger - como alimentar um campo com regra #51795

26/07/2005

0

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

Responder

Posts

26/07/2005

Gandalf.nho

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 ;^



Responder

Gostei + 0

27/07/2005

Emarcolongo

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.


Responder

Gostei + 0

27/07/2005

Gandalf.nho

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 ;^



Responder

Gostei + 0

28/07/2005

Emarcolongo

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.


Responder

Gostei + 0

28/07/2005

Gandalf.nho

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


Responder

Gostei + 0

29/07/2005

Emarcolongo

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

Obrigado.


Responder

Gostei + 0

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

Aceitar