现在的位置: 首页 > 综合 > 正文

oracle Complete transaction control in package and package body

2013年10月31日 ⁄ 综合 ⁄ 共 25466字 ⁄ 字号 评论关闭

/*
oracle  Complete transaction in package  and package body
author:chinayaosir
email: chinayaosir@126.com
blog:blog.csdn.net/chinayaosir
date:4/30/2013
 brief Introduction of the content:
1.this project include all quotesheet process on The world's large retail company(walmart,kmart,etc,.)
2. package define and package body implement
oracle包实现完整事务控制
粘出实现代码,愿老人提出缺点,愿新人能够借鉴!
*/
------------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PACKAGE QS_PACK_OTHER AS
  /*
  -- AUTHOR  : chinayaosir
  -- EMAIL   : chinayaosir@126.com
  -- PURPOSE : QUTESHEET COPY AND RE-CALCULATE PACKAGES BODY
  -- public function  interface list 
 
  FUNCTION F_QSCOPY(QSFM VARCHAR2,QSTO VARCHAR2,CUST VARCHAR2,QD DATE,OP VARCHAR2) RETURN VARCHAR2;
  FUNCTION F_QSRECAL(QSNO VARCHAR2,OP VARCHAR2) RETURN VARCHAR2;   
  */
 
 /*
  F_QSCOPY() Function parameter specification
  QSFM:quotesheet copy source qsno#
  QSTO:quotesheet copy to target qsno#
  CUST:quotesheet copy to  customerid on target-qsno#
  QD:quotesheet copy to  quotedate on target-qsno#
  OP:three quotesheet copy option:
    I:INSERT,FUNCTION IS ONLY INSERT NEW DATA INTO targetQSNO)
    U:UPDATE,FUNCTION IS NEW DATA INSERT,OLD ITEM UPDATEIN INTO targetQSNO)
    R:REPACE,FUNCTION IS DELETE ALL DATA,INSERT SOURCE QS DATA INTO targetQSNO)
 
  FUNCTION CALL SAMPLE CODE
  F_QSCOPY('Q130414119','Q130422136','WALMART',04/22/2013,'U')
  */   
  FUNCTION F_QSCOPY(QSFM VARCHAR2,QSTO VARCHAR2,CUST VARCHAR2,QD DATE,OP VARCHAR2) RETURN VARCHAR2;
 
 
  /*
  F_QSRECAL() Function parameter specification
  QSNO:re-calculate qsno#
  OP:two option:
    F:Forward calculate some price structure
    R:reverse calculate come price structure
 
  FUNCTION CALL SAMPLE CODE
  F_QSRECAL('Q130422136','F')
  */   
  FUNCTION F_QSRECAL(QSNO VARCHAR2,OP VARCHAR2) RETURN VARCHAR2;
 
 
 
 
  -------------
  --private function list QUOTESHEET COPY 
  FUNCTION FP_COPY_DELALL(QSTO VARCHAR2,OP VARCHAR2) RETURN VARCHAR2;
  FUNCTION FP_COPY_MASTER(OLD_QSNO VARCHAR2,NEW_QSNO VARCHAR2,NEWCUST VARCHAR2,NEWDT DATE,OP VARCHAR2) RETURN VARCHAR2;
  FUNCTION FP_COPY_ITEM(OLD_QSNO VARCHAR2,NEW_QSNO VARCHAR2,OP VARCHAR2) RETURN VARCHAR2;
  FUNCTION FP_COPY_MASTER_FILL(NEW_QSNO VARCHAR2,CUST VARCHAR2) RETURN VARCHAR2;
  FUNCTION FP_COPY_ITEM_FILL(NEW_QSNO VARCHAR2,CUST VARCHAR2) RETURN VARCHAR2;
  FUNCTION FP_COPY_ITEM_FILL_FREIGHT(CUSTID VARCHAR2,PORTID VARCHAR2,D VARCHAR2)   RETURN NUMBER;
  FUNCTION FB_COPY_QSRECAL(QSNO VARCHAR2,OP VARCHAR2)  RETURN VARCHAR2;
  -------------
   --private function list QUOTESHEET RE-CALCULATE
  FUNCTION FP_RECAL_PRC(QSNO VARCHAR2,OP VARCHAR2)  RETURN VARCHAR2;
  FUNCTION FP_RECAL_PRC_ROW(C VARCHAR2,T VARCHAR2,OP VARCHAR2,QS VARCHAR2,ITEM VARCHAR2,PORT VARCHAR2,P VARCHAR2)  RETURN NUMBER;
END;

 

------------------------------------------------------------------------------------------------------------------------------------------

create or replace package body QS_PACK_OTHER AS
  /*
  -- AUTHOR  : chinayaosir
  -- EMAIL   : chinayaosir@126.com
  -- PURPOSE : QUTESHEET COPY AND RE-CALCULATE PACKAGES BODY
  -- public function  interface list
  FUNCTION F_QSCOPY(QSFM VARCHAR2,QSTO VARCHAR2,CUST VARCHAR2,QD DATE,OP VARCHAR2) RETURN VARCHAR2;
  FUNCTION F_QSRECAL(QSNO VARCHAR2,OP VARCHAR2) RETURN VARCHAR2; 
 
  --modify history: 
  01.04/21/2012 finished F_QSCOPY function interface define
  02.04/21/2012 finished FP_COPY_DELALL()+ FP_COPY_MASTER()
  03.04/22/2012 finished FP_COPY_ITEM(3 table data copy)
  04.04/23/2012 finished FP_COPY_ITEM(6 table data copy)
  05.04/23/2012 finished FP_COPY_MASTER_FILL(common data auto fill)  
  06.04/23/2012 finished F_QSRECAL function interface define
  07.04/24/2012 finished FP_RECAL_PRC (retrieve all data by qsno)
  08.04/24/2012 finished FP_RECAL_PRC_ROW(each item re calculate)
  09.04/25/2012 finished FP_COPY_ITEM_FILL(echitem fill freight by customer port)
  10.04/26/2012 repaired FP_RECAL_PRC_ROW() update bug (update two times become one times)
  11.04/27/2012 finished FB_COPY_QSRECAL() it wiil call by F_QSCOPY() only
  11.04/27/2012 repaired F_QSCOPY(re combination database transaction,
                                  old transaction=OP_V1+OP_V2+OP_V3,OP_V4+OP_V5,OP_V6
                                  new transaction=only one)
  */
--public funtion implement list 
FUNCTION F_QSCOPY(QSFM VARCHAR2,QSTO VARCHAR2,CUST VARCHAR2,QD DATE,OP VARCHAR2) 
  RETURN VARCHAR2
  IS
  OP_V1  VARCHAR2(1);
  OP_V2  VARCHAR2(1);
  OP_V3  VARCHAR2(1);
  OP_V4  VARCHAR2(1);
  OP_V5  VARCHAR2(1);
  OP_V6  VARCHAR2(1);     
  OP_D   VARCHAR2(1);   
BEGIN
    OP_D:=NVL(OP,'U');--default operator
   
    OP_V1:=FP_COPY_DELALL(QSTO,OP_D);--if OP is R then clear all data by QSTO
    OP_V2:=FP_COPY_MASTER(QSFM,QSTO,CUST,QD,OP_D);   
    OP_V3:=FP_COPY_ITEM(QSFM,QSTO,OP_D);
    OP_V4:=FP_COPY_MASTER_FILL(QSTO,CUST);--fill data into cover common price
    OP_V5:=FP_COPY_ITEM_FILL(QSTO,CUST);  --fill data into each  item  price
    OP_V6:=FB_COPY_QSRECAL(QSTO,'F'); 
    IF (OP_V1='T' AND OP_V2='T' AND OP_V3='T' AND  OP_V4='T' AND OP_V5='T' AND OP_V6='T') THEN     
       --six function  combination a Complete transaction on oralce database
       COMMIT;
       RETURN ('T');       
    ELSE
       ROLLBACK;
       RETURN ('F'); 
    END IF;

   RETURN ('T');     
EXCEPTION
    WHEN OTHERS THEN RETURN('F'); 
END F_QSCOPY;

--public funtion implement list 
FUNCTION F_QSRECAL(QSNO VARCHAR2,OP VARCHAR2)
  RETURN VARCHAR2
  IS
  OP_V1  VARCHAR2(1);
  OP_D   VARCHAR2(1);   
BEGIN
    OP_D:=NVL(OP,'F');--default operator
    OP_V1:='T';
    OP_V1:=FP_RECAL_PRC(QSNO,OP_D);
    IF (OP_V1='T' ) THEN     
       COMMIT;
      RETURN ('T');   
    ELSE
       ROLLBACK;
       RETURN ('F'); 
    END IF;
   RETURN ('T');     
EXCEPTION
    WHEN OTHERS THEN RETURN('F'); 
END F_QSRECAL;

 

 

 

 

--qs copy private function implement list
FUNCTION FP_COPY_DELALL(QSTO VARCHAR2,OP VARCHAR2)
 RETURN VARCHAR2
 IS
BEGIN
    IF (OP='R') THEN
       DELETE FROM Q_QUOTESHEET_OTHER       WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QUOTESHEET_PRICE       WHERE QUOTECODE = QSTO ;      
       DELETE FROM Q_QSHEETITEM              WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QSHEETITEM_PACKAGING   WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QSHEETITEM_PACKING     WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QSHEETITEM_DUTY         WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QSHEETITEM_PATTERN     WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QSHEETITEM_RESULT      WHERE QUOTECODE = QSTO ;
       DELETE FROM Q_QUOTESHEET              WHERE QUOTECODE = QSTO ;
    END IF;
    RETURN ('T');
EXCEPTION
    WHEN OTHERS THEN RETURN('F');       
END FP_COPY_DELALL;

--qs copy private function implement list
FUNCTION FP_COPY_MASTER(OLD_QSNO VARCHAR2,NEW_QSNO VARCHAR2,NEWCUST VARCHAR2,NEWDT DATE,OP VARCHAR2)
  RETURN VARCHAR2
  IS
  TYPE TAB_QSMASTER IS TABLE OF Q_QUOTESHEET%ROWTYPE;
  TYPE TAB_QSPRC    IS TABLE OF Q_QUOTESHEET_PRICE%ROWTYPE;
  TYPE TAB_QSOTHER  IS TABLE OF Q_QUOTESHEET_OTHER%ROWTYPE;
  ROW_MASTER    TAB_QSMASTER;
  ROW_PRC       TAB_QSPRC;
  ROW_OTHER     TAB_QSOTHER; 
 
  TOROW1   NUMBER(10,0);--TARGERT ROWS Q_QUOTESHEET
  TOROW2   NUMBER(10,0);--TARGERT ROWS Q_QUOTESHEET_PRICE
  TOROW3   NUMBER(10,0);--TARGERT ROWS Q_QUOTESHEET_OTHER
BEGIN
    SELECT COUNT(*) INTO TOROW1  FROM Q_QUOTESHEET       WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW2  FROM Q_QUOTESHEET_PRICE WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW3  FROM Q_QUOTESHEET_OTHER WHERE QUOTECODE = NEW_QSNO;
    --COPY DATA INTO ROW_RECORD
    SELECT * BULK COLLECT INTO ROW_MASTER FROM Q_QUOTESHEET       WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_PRC    FROM Q_QUOTESHEET_PRICE WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_OTHER  FROM Q_QUOTESHEET_OTHER WHERE QUOTECODE = OLD_QSNO;
    --INSERT/UPDATE Q_QUOTESHEET
         
    IF (TOROW1=0 )  THEN
      FOR I IN 1..ROW_MASTER.COUNT LOOP
       ROW_MASTER(I).QUOTECODE:=NEW_QSNO;
       ROW_MASTER(I).CUSTOMERID:=NEWCUST;
       ROW_MASTER(I).QUOTEDATE:=NEWDT;
       INSERT INTO Q_QUOTESHEET VALUES ROW_MASTER(I);
      END LOOP;     
    ELSE   
      IF (OP='I' OR OP='U' OR OP='R' )THEN
         FOR I IN 1..ROW_MASTER.COUNT LOOP
           ROW_MASTER(I).QUOTECODE:=NEW_QSNO;
           ROW_MASTER(I).CUSTOMERID:=NEWCUST;
           ROW_MASTER(I).QUOTEDATE:=NEWDT;           
           UPDATE Q_QUOTESHEET
           SET CUSTOMERID  =ROW_MASTER(I).CUSTOMERID,
               QUOTEDATE   =ROW_MASTER(I).QUOTEDATE,
               DEFAULTPORT =ROW_MASTER(I).DEFAULTPORT,
               DEPTMENTID  =ROW_MASTER(I).DEPTMENTID,
               BUYER       =ROW_MASTER(I).BUYER,
               CREATEMAN   =ROW_MASTER(I).CREATEMAN,
               CATEID      =ROW_MASTER(I).CATEID,
               INCOTERM    =ROW_MASTER(I).INCOTERM,
               SEND_TO     =ROW_MASTER(I).SEND_TO
           WHERE QUOTECODE =ROW_MASTER(I).QUOTECODE;          
          END LOOP;
      END IF;
    END IF;
  
    --INSERT/UPDATE Q_QUOTESHEET_PRICE
    
    IF (TOROW2=0 )  THEN
         FOR I IN 1..ROW_PRC.COUNT LOOP
          ROW_PRC(I).QUOTECODE:=NEW_QSNO;          
          INSERT INTO Q_QUOTESHEET_PRICE VALUES ROW_PRC(I);
         END LOOP; 
    ELSE   
       IF (OP='U' OR OP='R' )THEN
          FOR I IN 1..ROW_PRC.COUNT LOOP
           ROW_PRC(I).QUOTECODE:=NEW_QSNO;
           UPDATE Q_QUOTESHEET_PRICE
           SET CURRENCY      =ROW_PRC(I).CURRENCY,
               REMARK        =ROW_PRC(I).REMARK
           WHERE QUOTECODE = ROW_PRC(I).QUOTECODE;
         END LOOP;
       END IF;
    END IF;
   
    --INSERT/UPDATE Q_QUOTESHEET_OTHER  
 
    IF (TOROW3=0)  THEN
          FOR I IN 1..ROW_OTHER.COUNT LOOP
           ROW_OTHER(I).QUOTECODE:=NEW_QSNO;            
           INSERT INTO Q_QUOTESHEET_OTHER VALUES ROW_OTHER(I);
          END LOOP; 
    ELSE   
       IF (OP='U' OR OP='R' )THEN
          FOR I IN 1..ROW_OTHER.COUNT LOOP
           ROW_OTHER(I).QUOTECODE:=NEW_QSNO;            
            UPDATE Q_QUOTESHEET_OTHER
            SET OPENACCOU=ROW_OTHER(I).OPENACCOU,
              DAYSAFTER=ROW_OTHER(I).DAYSAFTER
            WHERE QUOTECODE =ROW_OTHER(I).QUOTECODE;
          END LOOP;
       END IF;
    END IF;

    RETURN('T');
EXCEPTION
    WHEN OTHERS THEN RETURN('F');
END FP_COPY_MASTER;

 

--qs copy private function implement list
FUNCTION FP_COPY_ITEM(OLD_QSNO VARCHAR2,NEW_QSNO VARCHAR2,OP VARCHAR2)
  RETURN VARCHAR2
  IS
  TYPE TAB_ITEM     IS TABLE OF Q_QSHEETITEM%ROWTYPE;
  TYPE TAB_PACKAGE  IS TABLE OF Q_QSHEETITEM_PACKAGING%ROWTYPE;
  TYPE TAB_PACK     IS TABLE OF Q_QSHEETITEM_PACKING%ROWTYPE;
  TYPE TAB_DUTY     IS TABLE OF Q_QSHEETITEM_DUTY%ROWTYPE;
  TYPE TAB_PTN      IS TABLE OF Q_QSHEETITEM_PATTERN%ROWTYPE;
  TYPE TAB_RESULT   IS TABLE OF Q_QSHEETITEM_RESULT%ROWTYPE;
  ROW_ITEM     TAB_ITEM;
  ROW_PAGE     TAB_PACKAGE;
  ROW_PACK     TAB_PACK;
  ROW_DUTY     TAB_DUTY;
  ROW_PTN      TAB_PTN;
  ROW_PRCV     TAB_RESULT; 
 
  TOROW1   NUMBER(10,0);--Q_QSHEETITEM
  TOROW2   NUMBER(10,0);--Q_QSHEETITEM_PACKAGING
  TOROW3   NUMBER(10,0);--Q_QSHEETITEM_PACKING
  TOROW4   NUMBER(10,0);--Q_QSHEETITEM_DUTY
  TOROW5   NUMBER(10,0);--Q_QSHEETITEM_PATTERN
  TOROW6   NUMBER(10,0);--Q_QSHEETITEM_RESULT     
  I        NUMBER(10,0);--SOURCE QS ROWS
  J        NUMBER(10,0);--TARGET QS ROWS
BEGIN

    SELECT COUNT(*) INTO TOROW1  FROM Q_QSHEETITEM           WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW2  FROM Q_QSHEETITEM_PACKAGING WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW3  FROM Q_QSHEETITEM_PACKING   WHERE QUOTECODE = NEW_QSNO;  
    SELECT COUNT(*) INTO TOROW4  FROM Q_QSHEETITEM_DUTY      WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW5  FROM Q_QSHEETITEM_PATTERN   WHERE QUOTECODE = NEW_QSNO;
    SELECT COUNT(*) INTO TOROW6  FROM Q_QSHEETITEM_RESULT    WHERE QUOTECODE = NEW_QSNO;          
    --COPY DATA INTO ROW_RECORD
    SELECT * BULK COLLECT INTO ROW_ITEM FROM Q_QSHEETITEM           WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_PAGE FROM Q_QSHEETITEM_PACKAGING WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_PACK FROM Q_QSHEETITEM_PACKING   WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_DUTY FROM Q_QSHEETITEM_DUTY      WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_PTN  FROM Q_QSHEETITEM_PATTERN   WHERE QUOTECODE = OLD_QSNO;
    SELECT * BULK COLLECT INTO ROW_PRCV FROM Q_QSHEETITEM_RESULT    WHERE QUOTECODE = OLD_QSNO;           
   
    --INSERT/UPDATE Q_QSHEETITEM   
    IF (TOROW1=0)  THEN
        FOR I IN 1..ROW_ITEM.COUNT LOOP
             ROW_ITEM(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM VALUES ROW_ITEM(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_ITEM.COUNT LOOP
          ROW_ITEM(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM
          WHERE QUOTECODE =ROW_ITEM(I).QUOTECODE AND ITEMNUMBER=ROW_ITEM(I).ITEMNUMBER;
          IF (J=0 ) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN
               INSERT INTO Q_QSHEETITEM VALUES  ROW_ITEM(I);
              END IF;
           ELSE
              IF (OP='U' OR OP='R' )THEN
                UPDATE Q_QSHEETITEM
                SET BRIEF_DESC=ROW_ITEM(I).BRIEF_DESC,
                DETAILDESC =ROW_ITEM(I).DETAILDESC,
                FACTORY_ID =ROW_ITEM(I).FACTORY_ID
                WHERE QUOTECODE =ROW_ITEM(I).QUOTECODE AND ITEMNUMBER=ROW_ITEM(I).ITEMNUMBER;
              END IF;
          END IF;
        END LOOP;
    END IF;
  
    --INSERT/UPDATE Q_QSHEETITEM_PACKAGING   
    IF (TOROW2=0)  THEN
        FOR I IN 1..ROW_PAGE.COUNT LOOP
             ROW_PAGE(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM_PACKAGING VALUES ROW_PAGE(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_PAGE.COUNT LOOP
          ROW_PAGE(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM_PACKAGING
          WHERE QUOTECODE =ROW_PAGE(I).QUOTECODE AND ITEMNUMBER=ROW_PAGE(I).ITEMNUMBER;
          IF (J=0) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN
               INSERT INTO Q_QSHEETITEM_PACKAGING VALUES  ROW_PAGE(I);
              END IF;
          ELSE
              IF (OP='U' OR OP='R' )THEN                             
               UPDATE Q_QSHEETITEM_PACKAGING
               SET PACKAGING =ROW_PAGE(I).PACKAGING,
               MATERIAL_P=ROW_PAGE(I).MATERIAL_P,
               S_SIZE_L  =ROW_PAGE(I).S_SIZE_L,
               S_SIZE_W  =ROW_PAGE(I).S_SIZE_W
               WHERE QUOTECODE =ROW_PAGE(I).QUOTECODE AND ITEMNUMBER=ROW_PAGE(I).ITEMNUMBER;
              END IF;
          END IF;
        END LOOP;
    END IF;
   
   --INSERT/UPDATE Q_QSHEETITEM_PACKING  
   IF (TOROW3=0)  THEN
        FOR I IN 1..ROW_PACK.COUNT LOOP
             ROW_PACK(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM_PACKING VALUES ROW_PACK(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_PACK.COUNT LOOP
          ROW_PACK(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM_PACKING
          WHERE QUOTECODE =ROW_PACK(I).QUOTECODE AND ITEMNUMBER=ROW_PACK(I).ITEMNUMBER;
          IF (J=0) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN
               INSERT INTO Q_QSHEETITEM_PACKING VALUES  ROW_PACK(I);
              END IF;
           ELSE
              IF (OP='U' OR OP='R' )THEN                           
                 UPDATE Q_QSHEETITEM_PACKING
                 SET PACKING=ROW_PACK(I).PACKING,
                 CUFT   =ROW_PACK(I).CUFT,
                 CBM    =ROW_PACK(I).CBM,
                 MASTER_QTY=ROW_PACK(I).MASTER_QTY,
                 INNER_QTY=ROW_PACK(I).INNER_QTY
                 WHERE QUOTECODE =ROW_PACK(I).QUOTECODE AND ITEMNUMBER=ROW_PACK(I).ITEMNUMBER;
              END IF;
          END IF;
        END LOOP;
    END IF;

    --INSERT/UPDATE Q_QSHEETITEM_DUTY  
   IF (TOROW4=0)  THEN
        FOR I IN 1..ROW_DUTY.COUNT LOOP
             ROW_DUTY(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM_DUTY VALUES ROW_DUTY(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_DUTY.COUNT LOOP
          ROW_DUTY(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM_DUTY
          WHERE QUOTECODE =ROW_DUTY(I).QUOTECODE AND ITEMNUMBER=ROW_DUTY(I).ITEMNUMBER
                AND TARIFF_CAT=ROW_DUTY(I).TARIFF_CAT;
          IF (J=0) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN           
                INSERT INTO Q_QSHEETITEM_DUTY VALUES  ROW_DUTY(I);
              END IF;
          ELSE
              IF (OP='U' OR OP='R' )THEN                         
                 UPDATE Q_QSHEETITEM_DUTY
                 SET TARIFFOFNO=ROW_DUTY(I).TARIFFOFNO,
                 TARIFFRATE=ROW_DUTY(I).TARIFFRATE,
                 DUTYOFVALU=ROW_DUTY(I).DUTYOFVALU
                 WHERE QUOTECODE =ROW_DUTY(I).QUOTECODE AND ITEMNUMBER=ROW_DUTY(I).ITEMNUMBER
                       AND TARIFF_CAT=ROW_DUTY(I).TARIFF_CAT;
              END IF;
          END IF;
        END LOOP;
    END IF;

  --INSERT/UPDATE Q_QSHEETITEM_PATTERN  
   IF (TOROW5=0)  THEN
        FOR I IN 1..ROW_PTN.COUNT LOOP
             ROW_PTN(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM_PATTERN VALUES ROW_PTN(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_PTN.COUNT LOOP
          ROW_PTN(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM_PATTERN
          WHERE QUOTECODE =ROW_PTN(I).QUOTECODE AND ITEMNUMBER=ROW_PTN(I).ITEMNUMBER
                AND PATTERNID=ROW_PTN(I).PATTERNID;
          IF (J=0) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN             
                INSERT INTO Q_QSHEETITEM_PATTERN VALUES  ROW_PTN(I);
              END IF; 
           ELSE
              IF (OP='U' OR OP='R' )THEN                            
                 UPDATE Q_QSHEETITEM_PATTERN
                 SET SUB_BRIEF =ROW_PTN(I).SUB_BRIEF,
                 SUBOF_UPC =ROW_PTN(I).SUBOF_UPC,
                 PART_SCALE=ROW_PTN(I).PART_SCALE
                 WHERE QUOTECODE =ROW_PTN(I).QUOTECODE AND ITEMNUMBER=ROW_PTN(I).ITEMNUMBER
                       AND PATTERNID=ROW_PTN(I).PATTERNID;
              END IF;    
          END IF;
        END LOOP;
    END IF;
   
  --INSERT/UPDATE Q_QSHEETITEM_RESULT  
   IF (TOROW6=0)  THEN
        FOR I IN 1..ROW_PRCV.COUNT LOOP
             ROW_PRCV(I).QUOTECODE:=NEW_QSNO;
             INSERT INTO Q_QSHEETITEM_RESULT VALUES ROW_PRCV(I);
        END LOOP; 
    ELSE   
        FOR I IN 1..ROW_PRCV.COUNT LOOP
          ROW_PRCV(I).QUOTECODE:=NEW_QSNO;
          SELECT COUNT(*) INTO J  FROM Q_QSHEETITEM_RESULT
          WHERE QUOTECODE =ROW_PRCV(I).QUOTECODE AND ITEMNUMBER=ROW_PRCV(I).ITEMNUMBER
                AND SHIPPPORT=ROW_PRCV(I).SHIPPPORT AND DESCPRICE=ROW_PRCV(I).DESCPRICE ;
          IF (J=0) THEN
              IF (OP='I' OR OP='U' OR OP='R' )THEN           
               INSERT INTO Q_QSHEETITEM_RESULT VALUES  ROW_PRCV(I);
              END IF;
           ELSE
              IF (OP='U' OR OP='R' )THEN                             
                UPDATE Q_QSHEETITEM_RESULT
                SET FOB=ROW_PRCV(I).FOB,ELC=ROW_PRCV(I).ELC,MARGIN=ROW_PRCV(I).MARGIN
                WHERE QUOTECODE =ROW_PRCV(I).QUOTECODE AND ITEMNUMBER=ROW_PRCV(I).ITEMNUMBER
                      AND SHIPPPORT=ROW_PRCV(I).SHIPPPORT AND DESCPRICE=ROW_PRCV(I).DESCPRICE ;         
              END IF;    
          END IF;
        END LOOP;
    END IF;           
    RETURN('T');
EXCEPTION
    WHEN OTHERS THEN RETURN('F');    
END FP_COPY_ITEM;

--qs copy private function implement list
--FILL COMMON PRICE DATA WITH BASIC DATA WITH QSNO+CUSTOMER
FUNCTION FP_COPY_MASTER_FILL(NEW_QSNO VARCHAR2,CUST VARCHAR2)
  RETURN VARCHAR2
  IS
  CURSOR CURSOR_PRC IS
                    SELECT * FROM B_CUSTOMERID_PRICE T
                    WHERE T.CUSTOMERID=CUST AND T.PRCASSORT='QS_COVER' ORDER BY T.SEQUENCE;
  TYPE TAB_BPRC     IS TABLE OF B_CUSTOMERID_PRICE%ROWTYPE;
  ROW_PRC           TAB_BPRC;
  SQL_STR           VARCHAR2(1000);
  COLUMN_N          VARCHAR2(40);
  COLUMN_V          NUMBER(10,4);
  J                 NUMBER(10,0);
BEGIN
     SQL_STR:='';
     OPEN CURSOR_PRC;
      FETCH CURSOR_PRC BULK COLLECT INTO ROW_PRC;
            FOR J IN 1..ROW_PRC.COUNT LOOP
            SQL_STR:='';
            COLUMN_N:=ROW_PRC(J).DESCPRICE;
            COLUMN_V:=ROUND(ROW_PRC(J).RATE/100,4);
            SQL_STR:=SQL_STR||'UPDATE Q_QUOTESHEET_PRICE SET '||COLUMN_N||'='||COLUMN_V;
            SQL_STR:=SQL_STR||' WHERE QUOTECODE=:P1';
            EXECUTE IMMEDIATE SQL_STR  USING NEW_QSNO;
      END LOOP;           
      CLOSE CURSOR_PRC;
    RETURN('T');
EXCEPTION
    WHEN OTHERS THEN RETURN('F');
END FP_COPY_MASTER_FILL;

--qs copy private function implement list
FUNCTION FP_COPY_ITEM_FILL(NEW_QSNO VARCHAR2,CUST VARCHAR2)
  RETURN VARCHAR2
  IS
  CURSOR CURSOR_ITEM IS
                     SELECT * FROM QS_VIEW_RESULTPACKQSPRC T
                     WHERE T.QUOTECODE=NEW_QSNO;       
  TYPE      TAB_ITEMPRC  IS TABLE OF QS_VIEW_RESULTPACKQSPRC%ROWTYPE; 
  ROWP      TAB_ITEMPRC;
  P_FREIGHT NUMBER(10,4); 
  SQL_STR   VARCHAR2(1000);
  J         NUMBER(10,0);
BEGIN
      OPEN CURSOR_ITEM;
      FETCH CURSOR_ITEM BULK COLLECT INTO ROWP;
            FOR J IN 1..ROWP.COUNT LOOP
            P_FREIGHT    :=FP_COPY_ITEM_FILL_FREIGHT(CUST,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE);           
            SQL_STR      :='';
            SQL_STR      :=SQL_STR||'UPDATE Q_QSHEETITEM_RESULT SET FREIGHT='||P_FREIGHT;
            SQL_STR      :=SQL_STR||' WHERE  QUOTECODE=:P1 AND ITEMNUMBER=:P2 AND SHIPPPORT=:P3 AND DESCPRICE=:P4';
            EXECUTE IMMEDIATE SQL_STR  USING ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE;                   
      END LOOP;              
      CLOSE CURSOR_ITEM;       
    RETURN('T');
EXCEPTION
    WHEN OTHERS THEN RETURN('F');
END FP_COPY_ITEM_FILL;

--qs copy private function implement list
FUNCTION FP_COPY_ITEM_FILL_FREIGHT(CUSTID VARCHAR2,PORTID VARCHAR2,D VARCHAR2)
  RETURN NUMBER
  IS
  PRC_V        NUMBER(10,4);
BEGIN  
        PRC_V:=0.0;
        SELECT UNIT_PRICE INTO PRC_V
        FROM B_CUSTOMERID_FREIGHT  WHERE (CUSTOMERID=CUSTID AND SHIPPPORT=PORTID AND DESCPRICE=D);
        PRC_V:=ROUND(NVL(PRC_V,0),4);
        RETURN(PRC_V);
EXCEPTION
  WHEN OTHERS THEN RETURN(0.0); 
END FP_COPY_ITEM_FILL_FREIGHT;

--qs copy private function implement list

FUNCTION FB_COPY_QSRECAL(QSNO VARCHAR2,OP VARCHAR2)
 RETURN VARCHAR2
  IS
  OP_V1  VARCHAR2(1);
  OP_D   VARCHAR2(1);   
BEGIN
    OP_D:=NVL(OP,'F');--default operator
    OP_V1:='T';
    OP_V1:=FP_RECAL_PRC(QSNO,OP_D);
   RETURN ('T');     
EXCEPTION
    WHEN OTHERS THEN RETURN('F'); 
END FB_COPY_QSRECAL; 

--qs re-cal private function implement list
FUNCTION FP_RECAL_PRC(QSNO VARCHAR2,OP VARCHAR2)
  RETURN VARCHAR2
  IS
  CURSOR CURSOR_ITEM IS
                     SELECT * FROM QS_VIEW_RESULTPACKQSPRC T
                     WHERE T.QUOTECODE=QSNO;       
  TYPE      TAB_ITEMPRC  IS TABLE OF QS_VIEW_RESULTPACKQSPRC%ROWTYPE; 
  ROWP      TAB_ITEMPRC;
  CUSTID    VARCHAR2(20);
  --RESULT
  FL_ELC    NUMBER(10,4);
  FL_MARGIN NUMBER(10,8);
  STOR_ELC  NUMBER(10,4);
  STOR_MARGIN NUMBER(10,8);
  --REVERS
  FL_ELC1   NUMBER(10,4);
  FL_FOB    NUMBER(10,4);
  STOR_ELC1 NUMBER(10,4); 
  STOR_FOB  NUMBER(10,4);
  SQL_STR   VARCHAR2(1000);
  SQL_STR1  VARCHAR2(1000);
  SQL_STR2  VARCHAR2(1000);
  SQL_STR3  VARCHAR2(1000);
  SQL_STR4  VARCHAR2(1000);     
  J         NUMBER(10,0);
BEGIN
     SQL_STR:='';
     SELECT CUSTOMERID INTO CUSTID FROM Q_QUOTESHEET WHERE QUOTECODE=QSNO;
    CASE
      --RESULT calculate
     WHEN OP='F' THEN
      OPEN CURSOR_ITEM;
      FETCH CURSOR_ITEM BULK COLLECT INTO ROWP;
       FOR J IN 1..ROWP.COUNT LOOP
            FL_ELC       :=ROUND(FP_RECAL_PRC_ROW(CUSTID,'FL_ELC','RESULT',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE),4);           
            FL_MARGIN    :=ROUND(FP_RECAL_PRC_ROW(CUSTID,'FL_MARGIN','RESULT',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE),8);           
            STOR_ELC     :=ROUND(FP_RECAL_PRC_ROW(CUSTID,'STOR_ELC','RESULT',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE),4);
            STOR_MARGIN  :=ROUND(FP_RECAL_PRC_ROW(CUSTID,'STOR_MARGIN','RESULT',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE),8);           
            IF ROWP(J).DESCPRICE='FL' THEN
              SQL_STR      :='';
              SQL_STR      :=SQL_STR||'UPDATE Q_QSHEETITEM_RESULT SET ELC='||FL_ELC||',MARGIN='||FL_MARGIN;
              SQL_STR      :=SQL_STR||' WHERE DESCPRICE='||'''FL'''||' AND QUOTECODE=:1 AND ITEMNUMBER=:2 AND SHIPPPORT=:3';
              EXECUTE IMMEDIATE SQL_STR  USING ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT;
              -- DBMS_OUTPUT.PUT_LINE(SQL_STR||FL_MARGIN||','||ROWP(J).QUOTECODE||','||ROWP(J).ITEMNUMBER||','||ROWP(J).SHIPPPORT);
            ELSE 
              SQL_STR      :='';
              SQL_STR      :=SQL_STR||'UPDATE Q_QSHEETITEM_RESULT SET ELC='||STOR_ELC||',MARGIN='||STOR_MARGIN;
              SQL_STR      :=SQL_STR||' WHERE DESCPRICE='||'''STOR'''||' AND QUOTECODE=:1 AND ITEMNUMBER=:2 AND SHIPPPORT=:3';
              EXECUTE IMMEDIATE SQL_STR  USING ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT;
              --DBMS_OUTPUT.PUT_LINE(SQL_STR||STOR_MARGIN||','||ROWP(J).QUOTECODE||','||ROWP(J).ITEMNUMBER||','||ROWP(J).SHIPPPORT);          
            END IF;
      END LOOP;      
      CLOSE CURSOR_ITEM;
        --REVERS calculate
     WHEN OP='R' THEN
      OPEN CURSOR_ITEM;
      FETCH CURSOR_ITEM BULK COLLECT INTO ROWP;
       FOR J IN 1..ROWP.COUNT LOOP
            FL_ELC1      :=FP_RECAL_PRC_ROW(CUSTID,'FL_ELC','REVERS',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE);           
            FL_FOB       :=FP_RECAL_PRC_ROW(CUSTID,'FL_FOB','REVERS',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE);           
            STOR_ELC1    :=FP_RECAL_PRC_ROW(CUSTID,'STOR_ELC','REVERS',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE);
            STOR_FOB     :=FP_RECAL_PRC_ROW(CUSTID,'STOR_FOB','REVERS',ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT,ROWP(J).DESCPRICE);           
            SQL_STR      :='';
            SQL_STR      :=SQL_STR||'UPDATE Q_QSHEETITEM_RESULT SET ELC='||FL_ELC1||',FOB='||FL_FOB;
            SQL_STR      :=SQL_STR||' WHERE DESCPRICE='||'''FL'''||' AND QUOTECODE=:P1 AND ITEMNUMBER=:P2 AND SHIPPPORT=:P3';
            EXECUTE IMMEDIATE SQL_STR  USING ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT;          
            SQL_STR      :='';
            SQL_STR      :=SQL_STR||'UPDATE Q_QSHEETITEM_RESULT SET ELC='||STOR_ELC1||',FOB='||STOR_FOB;
            SQL_STR      :=SQL_STR||' WHERE DESCPRICE='||'''STOR'''||' AND QUOTECODE=:P1 AND ITEMNUMBER=:P2 AND SHIPPPORT=:P3';
            EXECUTE IMMEDIATE SQL_STR  USING ROWP(J).QUOTECODE,ROWP(J).ITEMNUMBER,ROWP(J).SHIPPPORT;                   
      END LOOP;       
      CLOSE CURSOR_ITEM;
    END CASE;
    COMMIT;
    RETURN('T');
EXCEPTION
    WHEN OTHERS THEN ROLLBACK;
    RETURN('F');
END FP_RECAL_PRC;

--qs re-cal private function implement list
FUNCTION FP_RECAL_PRC_ROW(C VARCHAR2,T VARCHAR2,OP VARCHAR2,QS VARCHAR2,ITEM VARCHAR2,PORT VARCHAR2,P VARCHAR2)
  RETURN NUMBER
  IS
  SQL_FORMULA  VARCHAR2(1000);
  SQL_STR      VARCHAR2(1000);
  PRC_V        NUMBER(10,8);
BEGIN  
        PRC_V:=0.0;
        SELECT FORMULA INTO SQL_FORMULA
        FROM B_CUSTOMERID_FORMULA WHERE (CUSTOMERID=C AND FORMULAID=T AND PRCASSORT=OP);
        SQL_STR:='';
        SQL_STR:='SELECT '||SQL_FORMULA||' FROM QS_VIEW_RESULTPACKQSPRC
                  WHERE QUOTECODE=:P1 AND ITEMNUMBER=:P2 AND SHIPPPORT=:P3 AND DESCPRICE=:P4';
        EXECUTE IMMEDIATE SQL_STR INTO PRC_V USING QS,ITEM,PORT,P;
        PRC_V:=ROUND(NVL(PRC_V,0),8);
        RETURN(PRC_V);
EXCEPTION
  WHEN OTHERS THEN RETURN(0.0); 
END FP_RECAL_PRC_ROW;

END;

抱歉!评论已关闭.