没有难度却繁琐的一trigger

CREATE OR REPLACE TRIGGER BI_M_OUT_HITEM
    INSTEAD OF INSERT OR UPDATE OR DELETE ON M_OUT_HITEM REFERENCES OLD AS OLD NEW AS NEW
    FOR EACH ROW
DECLARE
        v_boxstatus               NUMBER(10);
        v_isbox                   NUMBER(1);
        v_status                  NUMBER(10);
        v_id                      NUMBER(10);
        v_billtype                VARCHAR2(80);
        v_product_id              NUMBER(10);
        v_attributesetinstance_id NUMBER(10);
        v_box_qty                 NUMBER(10);
        v_tot_cqtyout             NUMBER(10);
        v_pdanewid                NUMBER(10);
        v_count                   NUMBER;
        v_count1                  NUMBER;
        v_pda                     VARCHAR2(80);
        v_tot_bqty                NUMBER(10);
        v_tot_bqtyout             NUMBER(10);
        v_tot_cqty                NUMBER(10);
        v_qty                     NUMBER(10);
        v_qtyout                  NUMBER(10);
        --create by tracy 20110228
BEGIN

        SELECT t.BOX_STATUS, t.isbox, t.STATUS
            INTO v_boxstatus, v_isbox, v_status
            FROM m_out t
         WHERE t.id = :NEW.m_out_id
             AND rownum = 1;

        IF v_boxstatus <> 1 AND v_isbox = 2 THEN
                raise_application_error(-20001, '出库单正在装箱,不能修改出库箱数!');
        END IF;

        IF v_status = 2 THEN
                raise_application_error(-20001, '出库单已提交,不能修改出库箱数!');
        END IF;

        v_billtype := chr(substr(:NEW.m_out_id, -2));

        v_id := substr(:NEW.m_out_id, 0, length(:NEW.m_out_id) - 2);

        IF :OLD.TOT_cQTY > 0 AND round(:NEW.tot_cqtyout) < 0 THEN
                raise_application_error(-20201, '数量大于零,出库盒数不能为负数,请重新输入!');
        END IF;

        BEGIN
                SELECT nvl(t3.qty, 0)
                    INTO v_qty
                    FROM m_outitem t3
                 WHERE t3.m_product_id = :NEW.m_product_id
                     AND t3.m_attributesetinstance_id = :NEW.m_attributesetinstance_id
                     AND t3.M_OUT_ID = :NEW.m_out_id;
        EXCEPTION
                WHEN no_data_found THEN
                        v_qty := 0;
        END;

        IF UPDATING THEN
       
                SELECT m.box_qty INTO v_box_qty FROM m_product m WHERE m.id = :NEW.m_product_id;
                BEGIN
                        SELECT nvl(t3.TOT_BQTYOUT, 0)
                            INTO v_tot_bqtyout
                            FROM m_out_xitem t3
                         WHERE t3.m_product_id = :NEW.m_product_id
                             AND t3.m_attributesetinstance_id = :NEW.m_attributesetinstance_id
                             AND t3.M_OUT_ID = :NEW.m_out_id;
                EXCEPTION
                        WHEN no_data_found THEN
                                v_tot_bqtyout := 0;
                END;
                /* SELECT m.TOT_CQTYOUT
          INTO v_TOT_CQTYOUT
          FROM m_out_hitem m
         WHERE m.M_OUT_ID = :NEW.M_OUT_ID
           AND m.M_PRODUCT_ID = :NEW.m_product_id
           AND m.M_ATTRIBUTESETINSTANCE_ID = :NEW.m_attributesetinstance_id;
        IF v_TOT_CQTYOUT < 0 THEN
            raise_application_error(-20201, '出库盒数小于0,不允许!');
        END IF;*/
                v_qtyout := v_tot_bqtyout * v_box_qty + round(:NEW.tot_cqtyout);
                IF v_qtyout > v_qty THEN
                        raise_application_error(-20001,
                                                                        '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' || v_qtyout ||
                                                                        ',单据数量:' || v_qty || ',不允许!');
                END IF;
       
                CASE
                        WHEN v_billtype = 'A' THEN
                                UPDATE M_SALE_HITEM t
                                     SET t.tot_cqtyout = round(:NEW.tot_cqtyout)
                                 WHERE t.id = :NEW.real_id;
                       
                                UPDATE m_saleitem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t1.tot_cqtyout
                                                                            FROM M_SALE_HITEM t1
                                                                         WHERE t.m_product_id = t1.m_product_id
                                                                             AND t.m_attributesetinstance_id =
                                                                                     t1.m_attributesetinstance_id
                                                                             AND t1.id = :NEW.real_id)
                                 WHERE t.m_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_saleitem t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_saleitem a
                                                                                                                                                                     WHERE a.m_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'B' THEN
                       
                                UPDATE M_RETSALE_HITEM t
                                     SET t.Tot_Cqtyout = round(:NEW.Tot_Cqtyout)
                                 WHERE t.id = :NEW.real_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETSALE_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_sale_id = v_id)
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_ret_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_saleitem a
                                                                                                                                                                     WHERE a.m_ret_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'C' THEN
                       
                                UPDATE M_TRANSFER_HITEM t
                                     SET t.Tot_Cqtyout = round(:NEW.Tot_Cqtyout)
                                 WHERE t.id = :NEW.real_id;
                       
                                UPDATE m_transferitem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_TRANSFER_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_transfer_id = v_id)
                                 WHERE t.m_transfer_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_transferitem t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist
                                 WHERE t.m_transfer_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_transfer t
                                     SET (t.tot_qtyout, t.tot_amtout_list) = (SELECT SUM(a.qtyout),
                                                                                                                                        SUM(a.tot_amtout_list)
                                                                                                                             FROM m_transferitem a
                                                                                                                            WHERE a.m_transfer_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'D' THEN
                                UPDATE M_RETSALE_HITEM t
                                     SET t.Tot_Cqtyout = round(:NEW.Tot_Cqtyout)
                                 WHERE t.id = :NEW.real_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETSALE_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_sale_id = v_id)
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = :NEW.m_product_id
                                     AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                       
                                UPDATE m_ret_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_saleitem a
                                                                                                                                                                     WHERE a.m_ret_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'E' THEN
                                UPDATE M_RETPUR_HITEM t
                                     SET t.Tot_Cqtyout = round(:NEW.Tot_Cqtyout)
                                 WHERE t.id = :NEW.real_id;
                       
                                UPDATE m_ret_puritem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETPUR_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_pur_id = v_id)
                                 WHERE t.m_ret_pur_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_puritem t
                                     SET t.qtydiff = nvl(qty, 0) - nvl(t.qtyout, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_pur_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_pur t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_puritem a
                                                                                                                                                                     WHERE a.m_ret_pur_id = v_id)
                                 WHERE t.id = v_id;
                       
                END CASE;
       
        END IF;

        IF INSERTING THEN
       
                SELECT COUNT(*)
                    INTO v_count
                    FROM m_pdt_alias_con t
                 WHERE t.m_pda_old_id =
                             (SELECT a.id
                                    FROM m_product_alias a
                                 WHERE a.m_product_id = :NEW.m_product_id
                                     AND a.m_attributesetinstance_id = :NEW.m_attributesetinstance_id);
       
                IF v_count = 0 OR (v_billtype = 'B' OR v_billtype = 'D') THEN
                        SELECT t.no, t.m_product_id, t.m_attributesetinstance_id
                            INTO v_pda, v_product_id, v_attributesetinstance_id
                            FROM m_product_alias t
                         WHERE t.m_product_id = :NEW.m_product_id
                             AND t.m_attributesetinstance_id = :NEW.m_attributesetinstance_id;
                ELSE
                        SELECT t.m_pda_new_id
                            INTO v_pdanewid
                            FROM m_pdt_alias_con t
                         WHERE t.m_pda_old_id =
                                     (SELECT a.id
                                            FROM m_product_alias a
                                         WHERE a.m_product_id = :NEW.m_product_id
                                             AND a.m_attributesetinstance_id = :NEW.m_attributesetinstance_id);
               
                        SELECT t.no, t.m_product_id, t.m_attributesetinstance_id
                            INTO v_pda, v_product_id, v_attributesetinstance_id
                            FROM m_product_alias t
                         WHERE t.id = v_pdanewid;
                END IF;
       
                SELECT m.box_qty INTO v_box_qty FROM m_product m WHERE m.id = v_product_id;
                BEGIN
                        SELECT nvl(t3.TOT_BQTYOUT, 0)
                            INTO v_tot_bqtyout
                            FROM m_out_Xitem t3
                         WHERE t3.m_product_id = :NEW.m_product_id
                             AND t3.m_attributesetinstance_id = :NEW.m_attributesetinstance_id
                             AND t3.M_OUT_ID = :NEW.m_out_id;
                EXCEPTION
                        WHEN no_data_found THEN
                                v_tot_bqtyout := 0;
                END;
       
                CASE
               
                        WHEN v_billtype = 'A' THEN
                       
                                SELECT COUNT(*)
                                    INTO v_count
                                    FROM M_SALEITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_sale_id = v_id;
                       
                                SELECT COUNT(*)
                                    INTO v_count1
                                    FROM M_SALE_HITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_sale_id = v_id;
                       
                                IF v_count = 0 THEN
                                        raise_application_error(-20001,
                                                                                        '款号:' || v_pda || ',在单据明细里不存在!');
                                ELSIF v_count <> 0 AND v_count1 = 0 THEN
                               
                                        INSERT INTO M_SALE_HITEM
                                                (id, AD_CLIENT_ID, AD_ORG_ID, M_SALE_ID, M_PRODUCT_ID, TOT_CQTY,
                                                 TOT_CQTYOUT, M_ATTRIBUTESETINSTANCE_ID, OWNERID, MODIFIERID,
                                                 CREATIONDATE, MODIFIEDDATE, ISACTIVE)
                                        VALUES
                                                (get_sequences('M_SALE_HITEM'), round(:NEW.AD_CLIENT_ID),
                                                 round(:NEW.AD_CLIENT_ID), v_id, round(:NEW.m_product_id), 0,
                                                 round(:NEW.tot_cqtyout), round(:NEW.m_attributesetinstance_id),
                                                 round(:NEW.OWNERID), round(:NEW.MODIFIERID), SYSDATE, SYSDATE,
                                                 'Y');
                               
                                        v_tot_cqtyout := round(:NEW.tot_cqtyout);
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                ELSIF v_count1 <> 0 THEN
                               
                                        UPDATE M_SALE_HITEM M
                                             SET M.TOT_CQTYOUT = M.TOT_CQTYOUT + round(:NEW.tot_cqtyout)
                                         WHERE M.M_SALE_ID = V_ID
                                             AND m.m_product_id = v_product_id
                                             AND m.m_attributesetinstance_id = v_attributesetinstance_id;
                               
                                        SELECT t.tot_cqty, nvl(t.tot_cqtyout, 0)
                                            INTO v_tot_cqty, v_tot_cqtyout
                                            FROM M_SALE_HITEM t
                                         WHERE t.m_product_id = v_product_id
                                             AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                             AND t.m_sale_id = v_id
                                             AND rownum = 1;
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                               
                                END IF;
                       
                                UPDATE m_saleitem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t1.tot_cqtyout
                                                                            FROM M_SALE_HITEM t1
                                                                         WHERE t.m_product_id = t1.m_product_id
                                                                             AND t.m_attributesetinstance_id =
                                                                                     t1.m_attributesetinstance_id
                                                                             AND T1.M_SALE_ID = V_ID)
                                 WHERE t.m_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_saleitem t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_saleitem a
                                                                                                                                                                     WHERE a.m_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'B' THEN
                       
                                SELECT COUNT(*)
                                    INTO v_count
                                    FROM M_RET_SALEITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_sale_id = v_id;
                       
                                SELECT COUNT(*)
                                    INTO v_count1
                                    FROM M_RETSALE_HITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_sale_id = v_id;
                       
                                IF v_count = 0 THEN
                                        raise_application_error(-20001,
                                                                                        '款号:' || v_pda || ',在单据明细里不存在!');
                                ELSIF v_count <> 0 AND v_count1 = 0 THEN
                               
                                        INSERT INTO M_RETSALE_HITEM
                                                (id, AD_CLIENT_ID, AD_ORG_ID, M_RET_SALE_ID, M_PRODUCT_ID,
                                                 TOT_CQTY, TOT_CQTYOUT, M_ATTRIBUTESETINSTANCE_ID, OWNERID,
                                                 MODIFIERID, CREATIONDATE, MODIFIEDDATE, ISACTIVE)
                                        VALUES
                                                (get_sequences('M_RETSALE_HITEM'), round(:NEW.AD_CLIENT_ID),
                                                 round(:NEW.AD_CLIENT_ID), v_id, round(:NEW.m_product_id), 0,
                                                 round(:NEW.tot_cqtyout), round(:NEW.m_attributesetinstance_id),
                                                 round(:NEW.OWNERID), round(:NEW.MODIFIERID), SYSDATE, SYSDATE,
                                                 'Y');
                                        v_tot_cqtyout := round(:NEW.tot_cqtyout);
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                ELSIF v_count1 <> 0 THEN
                               
                                        UPDATE M_RETSALE_HITEM M
                                             SET M.TOT_CQTYOUT = M.TOT_CQTYOUT + round(:NEW.tot_cqtyout)
                                         WHERE M.M_RET_SALE_ID = V_ID
                                             AND m.m_product_id = v_product_id
                                             AND m.m_attributesetinstance_id = v_attributesetinstance_id;
                               
                                        SELECT t.Tot_Cqty, nvl(t.Tot_Cqtyout, 0)
                                            INTO v_Tot_Cqty, v_tot_Cqtyout
                                            FROM M_RETSALE_HITEM t
                                         WHERE t.m_product_id = v_product_id
                                             AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                             AND t.m_ret_sale_id = v_id
                                             AND rownum = 1;
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                               
                                END IF;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETSALE_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_sale_id = v_id)
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_saleitem a
                                                                                                                                                                     WHERE a.m_ret_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'C' THEN
                                --raise_application_error(-20001, :new.m_attributesetinstance_id);
                                SELECT COUNT(*)
                                    INTO v_count
                                    FROM M_TRANSFERITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_transfer_id = v_id;
                       
                                SELECT COUNT(*)
                                    INTO v_count1
                                    FROM M_TRANSFER_HITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_transfer_id = v_id;
                       
                                IF v_count = 0 THEN
                                        raise_application_error(-20001,
                                                                                        '款号:' || v_pda || ',在单据明细里不存在!');
                                ELSIF v_count <> 0 AND v_count1 = 0 THEN
                               
                                        INSERT INTO M_TRANSFER_HITEM
                                                (id, AD_CLIENT_ID, AD_ORG_ID, M_TRANSFER_ID, M_PRODUCT_ID,
                                                 TOT_CQTY, TOT_CQTYOUT, M_ATTRIBUTESETINSTANCE_ID, OWNERID,
                                                 MODIFIERID, CREATIONDATE, MODIFIEDDATE, ISACTIVE)
                                        VALUES
                                                (get_sequences('M_TRANSFER_HITEM'), round(:NEW.AD_CLIENT_ID),
                                                 round(:NEW.AD_CLIENT_ID), v_id, round(:NEW.m_product_id), 0,
                                                 round(:NEW.tot_cqtyout), round(:NEW.m_attributesetinstance_id),
                                                 round(:NEW.OWNERID), round(:NEW.MODIFIERID), SYSDATE, SYSDATE,
                                                 'Y');
                               
                                        v_tot_cqtyout := round(:NEW.tot_cqtyout);
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                ELSIF v_count1 <> 0 THEN
                               
                                        UPDATE M_TRANSFER_HITEM M
                                             SET M.TOT_CQTYOUT = M.TOT_CQTYOUT + round(:NEW.tot_cqtyout)
                                         WHERE M.M_TRANSFER_ID = V_ID
                                             AND m.m_product_id = v_product_id
                                             AND m.m_attributesetinstance_id = v_attributesetinstance_id;
                               
                                        SELECT t.tot_cqty, nvl(t.tot_cqtyout, 0)
                                            INTO v_tot_cqty, v_tot_cqtyout
                                            FROM M_TRANSFER_HITEM t
                                         WHERE t.m_product_id = v_product_id
                                             AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                             AND t.m_transfer_id = v_id
                                             AND rownum = 1;
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                END IF;
                       
                                UPDATE m_transferitem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_TRANSFER_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_transfer_id = v_id)
                                 WHERE t.m_transfer_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_transferitem t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist
                                 WHERE t.m_transfer_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_transfer t
                                     SET (t.tot_qtyout, t.tot_amtout_list) = (SELECT SUM(a.qtyout),
                                                                                                                                        SUM(a.tot_amtout_list)
                                                                                                                             FROM m_transferitem a
                                                                                                                            WHERE a.m_transfer_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'D' THEN
                       
                                SELECT COUNT(*)
                                    INTO v_count
                                    FROM M_RET_SALEITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_sale_id = v_id;
                       
                                SELECT COUNT(*)
                                    INTO v_count1
                                    FROM M_RETSALE_HITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_sale_id = v_id;
                       
                                IF v_count = 0 THEN
                                        raise_application_error(-20001,
                                                                                        '款号:' || v_pda || ',在单据明细里不存在!');
                                ELSIF v_count <> 0 AND v_count1 = 0 THEN
                               
                                        INSERT INTO M_RETSALE_HITEM
                                                (id, AD_CLIENT_ID, AD_ORG_ID, M_RET_SALE_ID, M_PRODUCT_ID,
                                                 TOT_CQTY, TOT_CQTYOUT, M_ATTRIBUTESETINSTANCE_ID, OWNERID,
                                                 MODIFIERID, CREATIONDATE, MODIFIEDDATE, ISACTIVE)
                                        VALUES
                                                (get_sequences('M_RETSALE_HITEM'), round(:NEW.AD_CLIENT_ID),
                                                 round(:NEW.AD_CLIENT_ID), v_id, round(:NEW.m_product_id), 0,
                                                 round(:NEW.tot_cqtyout), round(:NEW.m_attributesetinstance_id),
                                                 round(:NEW.OWNERID), round(:NEW.MODIFIERID), SYSDATE, SYSDATE,
                                                 'Y');
                                        v_tot_cqtyout := round(:NEW.tot_cqtyout);
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                ELSIF v_count1 <> 0 THEN
                               
                                        UPDATE M_RETSALE_HITEM M
                                             SET M.TOT_CQTYOUT = M.TOT_CQTYOUT + round(:NEW.tot_cqtyout)
                                         WHERE M.M_RET_SALE_ID = V_ID
                                             AND m.m_product_id = v_product_id
                                             AND m.m_attributesetinstance_id = v_attributesetinstance_id;
                               
                                        SELECT t.Tot_Cqty, nvl(t.Tot_Cqtyout, 0)
                                            INTO v_Tot_Cqty, v_tot_Cqtyout
                                            FROM M_RETSALE_HITEM t
                                         WHERE t.m_product_id = v_product_id
                                             AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                             AND t.m_ret_sale_id = v_id
                                             AND rownum = 1;
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                               
                                END IF;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETSALE_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_sale_id = v_id)
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE M_RET_SALEITEM t
                                     SET t.qtydiff = nvl(t.qtyout, 0) - nvl(qtyin, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_sale_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_sale t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_saleitem a
                                                                                                                                                                     WHERE a.m_ret_sale_id = v_id)
                                 WHERE t.id = v_id;
                       
                        WHEN v_billtype = 'E' THEN
                       
                                SELECT COUNT(*)
                                    INTO v_count
                                    FROM m_ret_puritem t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_pur_id = v_id;
                       
                                SELECT COUNT(*)
                                    INTO v_count1
                                    FROM M_RETPUR_HITEM t
                                 WHERE t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                     AND t.m_ret_pur_id = v_id;
                       
                                IF v_count = 0 THEN
                                        raise_application_error(-20001,
                                                                                        '款号:' || v_pda || ',在单据明细里不存在!');
                                ELSIF v_count <> 0 AND v_count1 = 0 THEN
                               
                                        INSERT INTO M_RETPUR_HITEM
                                                (id, AD_CLIENT_ID, AD_ORG_ID, M_RET_PUR_ID, M_PRODUCT_ID,
                                                 TOT_CQTY, TOT_CQTYOUT, M_ATTRIBUTESETINSTANCE_ID, OWNERID,
                                                 MODIFIERID, CREATIONDATE, MODIFIEDDATE, ISACTIVE)
                                        VALUES
                                                (get_sequences('M_RETPUR_HITEM'), round(:NEW.AD_CLIENT_ID),
                                                 round(:NEW.AD_CLIENT_ID), v_id, round(:NEW.m_product_id), 0,
                                                 round(:NEW.tot_cqtyout), round(:NEW.m_attributesetinstance_id),
                                                 round(:NEW.OWNERID), round(:NEW.MODIFIERID), SYSDATE, SYSDATE,
                                                 'Y');
                               
                                        v_tot_cqtyout := round(:NEW.tot_cqtyout);
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                                ELSIF v_count1 <> 0 THEN
                               
                                        UPDATE M_RETPUR_HITEM M
                                             SET M.TOT_CQTYOUT = M.TOT_CQTYOUT  + round(:NEW.tot_cqtyout)
                                         WHERE M.M_RET_PUR_ID = V_ID
                                             AND m.m_product_id = v_product_id
                                             AND m.m_attributesetinstance_id = v_attributesetinstance_id;
                               
                                        SELECT t.tot_cqty, nvl(t.tot_cqtyout, 0)
                                            INTO v_tot_cqty, v_tot_cqtyout
                                            FROM M_RETPUR_HITEM t
                                         WHERE t.m_product_id = v_product_id
                                             AND t.m_attributesetinstance_id = v_attributesetinstance_id
                                             AND t.m_ret_pur_id = v_id
                                             AND rownum = 1;
                               
                                        IF v_tot_cqtyout < 0 THEN
                                                raise_application_error(-20201, '出库盒数小于0,不允许!');
                                        END IF;
                               
                                        v_qtyout := v_tot_bqtyout * v_box_qty + v_tot_cqtyout;
                               
                                        IF v_qtyout > v_qty THEN
                                                raise_application_error(-20001,
                                                                                                '款号:' || v_pda || ',实际出库数量大于单据数量,出库数量:' ||
                                                                                                v_qtyout || ',单据数量:' || v_qty || ',不允许!');
                                        END IF;
                               
                                END IF;
                       
                                UPDATE m_ret_puritem t
                                     SET t.qtyout = (SELECT v_tot_bqtyout * v_box_qty + t2.tot_cqtyout
                                                                            FROM M_RETPUR_HITEM t2
                                                                         WHERE t2.m_product_id = t.m_product_id
                                                                             AND t2.m_attributesetinstance_id =
                                                                                     t.m_attributesetinstance_id
                                                                             AND t2.m_ret_pur_id = v_id)
                                 WHERE t.m_ret_pur_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_puritem t
                                     SET t.qtydiff = nvl(qty, 0) - nvl(t.qtyout, 0),
                                             t.tot_amtout_list = nvl(t.qtyout, 0) * t.pricelist,
                                             t.tot_amtout_actual = nvl(t.qtyout, 0) * t.priceactual
                                 WHERE t.m_ret_pur_id = v_id
                                     AND t.m_product_id = v_product_id
                                     AND t.m_attributesetinstance_id = v_attributesetinstance_id;
                       
                                UPDATE m_ret_pur t
                                     SET (t.tot_qtyout, t.tot_amtout_list, t.tot_amtout_actual) = (SELECT SUM(a.qtyout),
                                                                                                                                                                                 SUM(a.tot_amtout_list),
                                                                                                                                                                                 SUM(a.tot_amtout_actual)
                                                                                                                                                                        FROM m_ret_puritem a
                                                                                                                                                                     WHERE a.m_ret_pur_id = v_id)
                                 WHERE t.id = v_id;
                       
                END CASE;
       
        END IF;

END;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值