Fórum criar uma trigger via programação, utilizando o ibquery #155011

15/04/2003

0

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


Vc tem que explicar no título da mensagem o seu problema. Não pode colocar coisas como ´socorro´ ou ´estou desesperado´. Ou ainda pior ´somente para os feras´.


Dinhosilva

Dinhosilva

Responder

Posts

15/04/2003

Aroldo Zanela

Colega,

Não consigo avançar mais em face de não utilizar Interbase. Eu estava verificando que tem um componente IBSQL, mas nem consegui testar em face do motivo acima. Verifique se o mesmo resolve seu problema.
Acho que você deveria colocar este tópico na seção de Interbase, por ser mais específico e por favor, com um tópico mais adequado, visando evitar criar uma guerra no site.
A propósito, você não pode criar esta trigger diretamente no banco?


Responder

Gostei + 0

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

Aceitar