Advertisement
filhotecmail

Lote

Oct 22nd, 2017
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.49 KB | None | 0 0
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE BAIXANOLOTE (
  4.     ID_PRODUTO INTEGER,
  5.     QUANTIDADE NUMERIC(15,2))
  6. AS
  7. DECLARE variable LOTE INTEGER; /* ID do Lote a ser Baixado */
  8. DECLARE variable ESTOQUE_ATUAL_LOTE NUMERIC(15,2); /* Valor Atual do Estoque do Lote */
  9. DECLARE variable RESTA_ABATER NUMERIC(15,2); /* Valor Restante, resultante se tiver que abater do proximo ou não */
  10. DECLARE variable QUANTO_PODE_ABATER NUMERIC(15,2); /* Quanto no Lote pode abater */
  11. BEGIN
  12.  
  13.    resta_abater = :quantidade;
  14.  
  15.    while ( :resta_abater > 0)  do
  16.       BEGIN
  17.        FOR SELECT es.lotenumero,es.lote_qtdcontrolada
  18.            FROM lote es WHERE es.produto_id =:id_produto
  19.              AND es.lote_qtdcontrolada > 0
  20.              ORDER BY es.lote_val INTO :lote, :estoque_atual_lote
  21.        do
  22.         BEGIN
  23.  
  24.           quanto_pode_abater = :estoque_atual_lote - :resta_abater;
  25.  
  26.  
  27.           IF (:quanto_pode_abater > 0) THEN
  28.             BEGIN
  29.              quanto_pode_abater = :resta_abater;
  30.              resta_abater =0;
  31.             END
  32.           ELSE
  33.            BEGIN
  34.              quanto_pode_abater = :resta_abater -:estoque_atual_lote;
  35.              quanto_pode_abater =   :resta_abater - :quanto_pode_abater;
  36.              resta_abater = :resta_abater - :quanto_pode_abater;
  37.            END
  38.  
  39.            UPDATE lote es SET es.lote_qtdcontrolada =
  40.                   (es.lote_qtdcontrolada - :quanto_pode_abater)
  41.              WHERE es.produto_id = :id_produto AND es.lotenumero = :lote ;
  42.  
  43.         END
  44.  
  45.     END
  46.  
  47.  
  48.  
  49. END^
  50.  
  51. SET TERM ; ^
  52.  
  53. COMMENT ON PARAMETER BAIXANOLOTE.ID_PRODUTO IS
  54. 'Id do produto na tabela';
  55.  
  56. COMMENT ON PARAMETER BAIXANOLOTE.QUANTIDADE IS
  57. 'Quantidade a ser descontada no lote';
  58.  
  59. /* Following GRANT statetements are generated automatically */
  60.  
  61. GRANT SELECT,UPDATE ON LOTE TO PROCEDURE BAIXANOLOTE;
  62.  
  63. /* Existing privileges on this procedure */
  64.  
  65. GRANT EXECUTE ON PROCEDURE BAIXANOLOTE TO SYSDBA;
  66.  
  67.  
  68.  
  69.  /*  Triguer  */
  70.  
  71. SET SQL DIALECT 3;
  72.  
  73.  
  74. SET TERM ^ ;
  75.  
  76.  
  77.  
  78. CREATE OR ALTER TRIGGER CADPRODUTOS_BAIXALOTE FOR CADPRODUTOS
  79. ACTIVE AFTER UPDATE POSITION 3
  80. AS
  81.  DECLARE variable quantidade NUMERIC(15,2);
  82.  DECLARE variable  cont INT;
  83.  BEGIN
  84.   /* Trigger text */
  85.   SELECT COUNT(*) FROM lote h WHERE h.produto_id = NEW.id INTO cont ;
  86.   quantidade =  0;
  87.   IF  ( OLD.estq_total > NEW.estq_total ) THEN
  88.          quantidade =  OLD.estq_total - NEW.estq_total;
  89.          IF (cont > 0) THEN
  90.           EXECUTE PROCEDURE baixanolote( NEW.id,quantidade);
  91.  
  92. END
  93. ^
  94.  
  95.  
  96. SET TERM ; ^
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement