PROBLEMA AO CRIAR TRIGGER

Firebird

17/04/2003

Caros amigos.. estou com um pro muito difícil..
estou tentando criar uma trigger via programação, UTILIZANDO O IBQUERY...
o pro é que o SET TERM executa dois procedimentos e o EXECSQL executa um comando por vez... se alguém puder me ajudar eu vou ser muito grato...
O SQLCRIPT NÃO RESOLVE PQ ESTOU UTILIZANDO O IBQUERY E NÃO O QUERY..

ABAIXO SEGUE O SCRIPT DE CRIAÇÃO...

SET TERM ^;
CREATE TRIGGER ´TRG_ATUALIZA_LOCAIS´ FOR PRODUTO_ESTOQUE
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE CD_LOCAL_MOV INTEGER;
DECLARE VARIABLE QTD INTEGER;
DECLARE VARIABLE TIPO_OPERACAO VARCHAR(1);
DECLARE VARIABLE TIPO VARCHAR(10);
DECLARE VARIABLE QTD_ANTERIOR INTEGER;
DECLARE VARIABLE CUSTO_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE VENDA_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE CUSTO_MEDIO_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE QTD_MOVIMENTO INTEGER;
BEGIN
IF ((NEW.DISP_TRG = ´T´) AND (OLD.QT_ESTOQUE_PRODUTO <> NEW.QT_ESTOQUE_PRODUTO))
THEN BEGIN
FOR SELECT LM.CD_LOCAL_MOV FROM LOCAL_MOV LM
WHERE LM.CD_LOCAL = OLD.CD_LOCAL
INTO :CD_LOCAL_MOV
DO BEGIN
/* */
SELECT
COUNT(*)
FROM
PRODUTO_ESTOQUE PE2
WHERE
PE2.CD_LOCAL = :CD_LOCAL_MOV
AND PE2.CD_PRODUTO = OLD.CD_PRODUTO
INTO :QTD;
/* */
/* */
IF (QTD = 0)
THEN INSERT INTO PRODUTO_ESTOQUE (CD_PRODUTO, CD_LOCAL, DISP_TRG, QT_ESTOQUE_PRODUTO, VL_PRECO_VENDA_PRODUTO, VL_CUSTO_MEDIO_PRODUTO)
VALUES (OLD.CD_PRODUTO, :CD_LOCAL_MOV, ´F´, 0, 0, 0);
/* */
IF ((NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO) > 0)
THEN TIPO_OPERACAO = ´E´;
ELSE TIPO_OPERACAO = ´S´;

IF (NEW.TIPO = ´CO´)
THEN TIPO = ´COMPRA´;
IF (NEW.TIPO = ´VE´)
THEN TIPO = ´VENDA´;
IF (NEW.TIPO = ´EA´)
THEN TIPO = ´ENTACERTO´;
IF (NEW.TIPO = ´SA´)
THEN TIPO = ´SAIACERTO´;

IF (TIPO_OPERACAO = ´E´)
THEN QTD_MOVIMENTO = NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO;
ELSE QTD_MOVIMENTO = OLD.QT_ESTOQUE_PRODUTO - NEW.QT_ESTOQUE_PRODUTO;

SELECT
PE3.QT_ESTOQUE_PRODUTO, PE3.VL_PRECO_CUSTO, PE3.VL_PRECO_VENDA_PRODUTO, PE3.VL_CUSTO_MEDIO_PRODUTO
FROM
PRODUTO_ESTOQUE PE3
WHERE
PE3.CD_LOCAL = :CD_LOCAL_MOV
AND PE3.CD_PRODUTO = OLD.CD_PRODUTO
INTO :QTD_ANTERIOR, :CUSTO_ANTERIOR, :VENDA_ANTERIOR, :CUSTO_MEDIO_ANTERIOR;

INSERT INTO MOVIMENTO_ESTOQUE (CD_MOVIMENTO,
CD_PRODUTO,
QT_ESTOQUE_ANTERIOR,
QT_MOVIMENTO,
DT_MOVIMENTO,
HR_MOVIMENTO,
TIPO,
TIPO_OPERACAO,
VL_PRECO_CUSTO,
VL_CUSTO_MEDIO,
VL_PRECO_VENDA,
VL_PRECO_CUSTO_ANT,
VL_PRECO_VENDA_ANT,
VL_CUSTO_MEDIO_ANT,
CD_OPERADOR,
CD_LOCAL,
CD_PEDIDO)
VALUES (GEN_ID (GEN_MOVIMENTO_ESTOQUE, 1),
OLD.CD_PRODUTO,
:QTD_ANTERIOR,
:QTD_MOVIMENTO,
´TODAY´,
´NOW´,
:TIPO,
:TIPO_OPERACAO,
NEW.VL_PRECO_CUSTO,
NEW.VL_CUSTO_MEDIO_PRODUTO,
NEW.VL_PRECO_VENDA_PRODUTO,
:CUSTO_ANTERIOR,
:VENDA_ANTERIOR,
:CUSTO_MEDIO_ANTERIOR,
NEW.OPERADOR,
:CD_LOCAL_MOV,
NEW.PEDIDO);
/* */
UPDATE
PRODUTO_ESTOQUE PE1
SET
PE1.DISP_TRG = ´F´,
PE1.QT_ESTOQUE_PRODUTO = PE1.QT_ESTOQUE_PRODUTO + (NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO),
PE1.VL_PRECO_CUSTO = NEW.VL_PRECO_CUSTO,
PE1.VL_PRECO_VENDA_PRODUTO = NEW.VL_PRECO_VENDA_PRODUTO
WHERE
PE1.CD_PRODUTO = OLD.CD_PRODUTO AND
PE1.CD_LOCAL = :CD_LOCAL_MOV;

END
UPDATE PRODUTO_ESTOQUE PE2 SET PE2.DISP_TRG = ´F´, OPERADOR = NULL, PEDIDO = NULL WHERE PE2.CD_PRODUTO = OLD.CD_PRODUTO AND PE2.CD_LOCAL = OLD.CD_LOCAL;
END
END
^

COMMIT WORK ^
SET TERM ;^


Dinhosilva

Dinhosilva

Curtidas 0

Respostas

Fsflorencio

Fsflorencio

17/04/2003

Quando for um comando pra criar trigger, vc não precisa do set term;
use apenas no sql o seguinte:

CREATE TRIGGER ´TRG_ATUALIZA_LOCAIS´ FOR PRODUTO_ESTOQUE
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE CD_LOCAL_MOV INTEGER;
DECLARE VARIABLE QTD INTEGER;
DECLARE VARIABLE TIPO_OPERACAO VARCHAR(1);
DECLARE VARIABLE TIPO VARCHAR(10);
DECLARE VARIABLE QTD_ANTERIOR INTEGER;
DECLARE VARIABLE CUSTO_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE VENDA_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE CUSTO_MEDIO_ANTERIOR NUMERIC(11,1);
DECLARE VARIABLE QTD_MOVIMENTO INTEGER;
BEGIN
IF ((NEW.DISP_TRG = ´T´) AND (OLD.QT_ESTOQUE_PRODUTO <> NEW.QT_ESTOQUE_PRODUTO))
THEN BEGIN
FOR SELECT LM.CD_LOCAL_MOV FROM LOCAL_MOV LM
WHERE LM.CD_LOCAL = OLD.CD_LOCAL
INTO :CD_LOCAL_MOV
DO BEGIN
/* */
SELECT
COUNT(*)
FROM
PRODUTO_ESTOQUE PE2
WHERE
PE2.CD_LOCAL = :CD_LOCAL_MOV
AND PE2.CD_PRODUTO = OLD.CD_PRODUTO
INTO :QTD;
/* */
/* */
IF (QTD = 0)
THEN INSERT INTO PRODUTO_ESTOQUE (CD_PRODUTO, CD_LOCAL, DISP_TRG, QT_ESTOQUE_PRODUTO, VL_PRECO_VENDA_PRODUTO, VL_CUSTO_MEDIO_PRODUTO)
VALUES (OLD.CD_PRODUTO, :CD_LOCAL_MOV, ´F´, 0, 0, 0);
/* */
IF ((NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO) > 0)
THEN TIPO_OPERACAO = ´E´;
ELSE TIPO_OPERACAO = ´S´;

IF (NEW.TIPO = ´CO´)
THEN TIPO = ´COMPRA´;
IF (NEW.TIPO = ´VE´)
THEN TIPO = ´VENDA´;
IF (NEW.TIPO = ´EA´)
THEN TIPO = ´ENTACERTO´;
IF (NEW.TIPO = ´SA´)
THEN TIPO = ´SAIACERTO´;

IF (TIPO_OPERACAO = ´E´)
THEN QTD_MOVIMENTO = NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO;
ELSE QTD_MOVIMENTO = OLD.QT_ESTOQUE_PRODUTO - NEW.QT_ESTOQUE_PRODUTO;

SELECT
PE3.QT_ESTOQUE_PRODUTO, PE3.VL_PRECO_CUSTO, PE3.VL_PRECO_VENDA_PRODUTO, PE3.VL_CUSTO_MEDIO_PRODUTO
FROM
PRODUTO_ESTOQUE PE3
WHERE
PE3.CD_LOCAL = :CD_LOCAL_MOV
AND PE3.CD_PRODUTO = OLD.CD_PRODUTO
INTO :QTD_ANTERIOR, :CUSTO_ANTERIOR, :VENDA_ANTERIOR, :CUSTO_MEDIO_ANTERIOR;

INSERT INTO MOVIMENTO_ESTOQUE (CD_MOVIMENTO,
CD_PRODUTO,
QT_ESTOQUE_ANTERIOR,
QT_MOVIMENTO,
DT_MOVIMENTO,
HR_MOVIMENTO,
TIPO,
TIPO_OPERACAO,
VL_PRECO_CUSTO,
VL_CUSTO_MEDIO,
VL_PRECO_VENDA,
VL_PRECO_CUSTO_ANT,
VL_PRECO_VENDA_ANT,
VL_CUSTO_MEDIO_ANT,
CD_OPERADOR,
CD_LOCAL,
CD_PEDIDO)
VALUES (GEN_ID (GEN_MOVIMENTO_ESTOQUE, 1),
OLD.CD_PRODUTO,
:QTD_ANTERIOR,
:QTD_MOVIMENTO,
´TODAY´,
´NOW´,
:TIPO,
:TIPO_OPERACAO,
NEW.VL_PRECO_CUSTO,
NEW.VL_CUSTO_MEDIO_PRODUTO,
NEW.VL_PRECO_VENDA_PRODUTO,
:CUSTO_ANTERIOR,
:VENDA_ANTERIOR,
:CUSTO_MEDIO_ANTERIOR,
NEW.OPERADOR,
:CD_LOCAL_MOV,
NEW.PEDIDO);
/* */
UPDATE
PRODUTO_ESTOQUE PE1
SET
PE1.DISP_TRG = ´F´,
PE1.QT_ESTOQUE_PRODUTO = PE1.QT_ESTOQUE_PRODUTO + (NEW.QT_ESTOQUE_PRODUTO - OLD.QT_ESTOQUE_PRODUTO),
PE1.VL_PRECO_CUSTO = NEW.VL_PRECO_CUSTO,
PE1.VL_PRECO_VENDA_PRODUTO = NEW.VL_PRECO_VENDA_PRODUTO
WHERE
PE1.CD_PRODUTO = OLD.CD_PRODUTO AND
PE1.CD_LOCAL = :CD_LOCAL_MOV;

END
UPDATE PRODUTO_ESTOQUE PE2 SET PE2.DISP_TRG = ´F´, OPERADOR = NULL, PEDIDO = NULL WHERE PE2.CD_PRODUTO = OLD.CD_PRODUTO AND PE2.CD_LOCAL = OLD.CD_LOCAL;
END
END


A propósito: use o componente ibsql que é melhor.


GOSTEI 0
POSTAR