按单生产程序发布

一、新增4张表OK

IN_BOM_CHANGE、IN_STOCK_CUSTOMER、IN_ORDER_PLANNING、IN_STOCK_LOCATION

CREATE TABLE STG.IN_BOM_CHANGE
(
  SO_ID           VARCHAR2(20 BYTE),
  SO_LINE_ID      VARCHAR2(10 BYTE),
  LOC_ID          VARCHAR2(5 BYTE),
  PARENT_ITEM_ID  VARCHAR2(30 BYTE),
  BOM_ID          VARCHAR2(50 BYTE),
  OLD_ITEM_ID     VARCHAR2(30 BYTE),
  OLD_QUANTITY    NUMBER,
  NEW_ITEM_ID     VARCHAR2(30 BYTE),
  NEW_QUANTITY    NUMBER,
  ACTION          VARCHAR2(10 BYTE),
  PERIOD_DATE     DATE
)
TABLESPACE STGDATA;


CREATE BITMAP INDEX STG.IDX_IN_BOM_CHANGE_DBA01 ON STG.IN_BOM_CHANGE
(ACTION)
NOLOGGING
TABLESPACE STGDATA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
PARALLEL ( DEGREE 4 INSTANCES 1 );


CREATE TABLE STG.IN_STOCK_CUSTOMER
(
  CUSTOMER_ID  VARCHAR2(90 BYTE)                NOT NULL,
  NAME_ID      VARCHAR2(90 BYTE)                NOT NULL,
  ID           NUMBER(10)                       NOT NULL,
  LOCATION_ID  VARCHAR2(10 BYTE)
)
TABLESPACE STGDATA;



CREATE TABLE STG.IN_ORDER_PLANNING
(
  SO_ID           VARCHAR2(40 CHAR),
  SO_LINE_ID      VARCHAR2(40 CHAR),
  FG_ITEM_ID      VARCHAR2(40 CHAR),
  SEMI_ITEM_ID    VARCHAR2(40 CHAR),
  ORDER_PLANNING  INTEGER,
  CUSTOMER_ID     VARCHAR2(40 CHAR),
  VIP             INTEGER,
  WERKS           VARCHAR2(10 CHAR),
  ZREMARK1        VARCHAR2(50 CHAR),
  ZREMARK2        VARCHAR2(50 CHAR)
)
TABLESPACE STGDATA;

CREATE TABLE STG.IN_STOCK_LOCATION
(
  LOCATION_NAME  VARCHAR2(20 BYTE),
  LOCATION_ID    VARCHAR2(10 BYTE),
  WERKS          VARCHAR2(5 BYTE)
)
TABLESPACE STGDATA;
View Code

二、新建索引OK

ALTER TABLE ABPPMGR.MST_ITEMBOMROUTING  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.MST_ITEMBOMROUTING_P  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.SALESORDERLINE_P  MODIFY   ATTRIBUTECLASS  VARCHAR2(80 BYTE);
ALTER TABLE ABPPMGR.MST_BOMCOMPONENTS  MODIFY   BOMID  VARCHAR2(100 BYTE);
create index ABPPMGR.idx_MST_BOMCOMPONENTS_DBA01 on  ABPPMGR.MST_BOMCOMPONENTS(BOMID);
ALTER TABLE ABPPMGR.MST_BOMCOMPONENTS_P  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.MST_BOMCOMPONENTSALT  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.MST_BOMCOMPONENTSALT_P  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.MST_BOMHEADER  MODIFY   BOMID  VARCHAR2(100 BYTE);
create bitmap index   idx_MST_BOMCOMPONENTS_dba02 on ABPPMGR.MST_BOMCOMPONENTS(SYS_CREATED_BY);
ALTER TABLE ABPPMGR.PRODUCTIONORDERS_P  MODIFY   ATTRIBUTECLASS  VARCHAR2(80 BYTE);


--ADD ON 20180607
ALTER TABLE ABPPMGR.PRODUCTIONORDERS  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.SFCHEADER  MODIFY   BOMID  VARCHAR2(100 BYTE);
ALTER TABLE ABPPMGR.INVENTORYPROPERTY  MODIFY   ATTRIBUTECLASS  VARCHAR2(80 BYTE);


ALTER TABLE ABPPMGR.INVENTORY  MODIFY   LOTLEVEL1  VARCHAR2(80 BYTE);  --6.15号还原6.10的DB后,此加长字段取消
ALTER TABLE ABPPMGR.INVENTORYPROPERTY  MODIFY   LOCATIONID  VARCHAR2(80 BYTE);--6.15号还原6.10的DB后,此加长字段取消
View Code

三、创建存储过程SAP_VIP_YANHUO OK

CREATE OR REPLACE PROCEDURE STG.SAP_VIP_YANHUO(EXITCODE OUT NUMBER)
IS
   /***********************************************************************
    **  存储过程详细说明
    **  存储过程名称:  SAP_VIP_YANHUO
    **  存储过程创建日期: 2017/12/08
    **  存储过程创建人: LVXUEFEN
    **  目的:
    **   1.将ZFP037\ZFP026整合成到一张表IN_ORDER_PLANNING(数据来源SAP_037A\SAP_QM_CUSTOMER\SAP_QM_CUSTOMER_FAKE)
    **   2.将ZFP027A和ZFP025a整合进一个表IN_BOM_CHANGE
           SAP_BOM_CHANGE_ALT-->IN_BOM_CHANGE
           SAP_SO_BOM-->IN_BOM_CHANGE
    **  输入参数:
    **  输出参数: EXITCODE: 0=Success/1=Failure
    **  返回值: 
    **  用法: 
    ** IN_ORDER_PLANNING表中的ORDER_PLANNING代表是否是真驗貨 1:表示為真驗貨 0:為假驗貨;VIP字段:1代表VIP,0非VIP
    ** IN_BOM_CHANGE 變更方式:VIP:VIP換標簽 NEW:新增 DEL:刪除 MODIFY:修改
    *-\*+"P;9U7YTR+ 修订版本:
    **  版本号     修订时间    修订人        描述
    **  ---------  ----------  ------------  ------------------------
    **    1.0     2017/12/08  lvxuefen    1. 新建存储过程.
    
   **********************************************************************/
   
      ----------------------- 以下定义存储过程使用的变量---------------------------------
   E_ErrMessage   VARCHAR2 (3000);
   
BEGIN
   EXITCODE := 0;
   
   EXECUTE IMMEDIATE 'TRUNCATE TABLE IN_ORDER_PLANNING';
   
    ----一、1.查找VIP客户成品编码的下层半成品编码(有BOM)
    INSERT INTO IN_ORDER_PLANNING(SO_ID,  SO_LINE_ID ,  FG_ITEM_ID ,  SEMI_ITEM_ID,  ORDER_PLANNING ,  CUSTOMER_ID ,VIP,WERKS )
    SELECT distinct ISO.SO_ID,ISO.SO_LINE_ID, VIP.CMATNR,DT.ITEM_ID,'',VIP.KUNNR,'1',ISO.SITEID
    from SAP_037A VIP, IN_BOM_DETAILS DT, IN_BOM_HEADER HD,IN_SALES_ORDER ISO
     WHERE    VIP.CMATNR= HD.PRODUCT_ID  AND  DT.BOM_ID = HD.BOM_ID AND ISO.ITEM_ID=VIP.CMATNR AND ISO.CUSTOMER_ID=VIP.KUNNR
            AND HD.IS_VALID = '1'and VIP.WERKS= SUBSTR(HD.BOM_ID,instr(HD.BOM_ID,'_',1)+1 ,'4') --SUBSTR(HD.BOM_ID,10,4)
            AND  DT.ITEM_ID LIKE '000000102%' ;
    COMMIT;
    
    --既是VIP又是真验货
    MERGE INTO IN_ORDER_PLANNING IOP
        USING SAP_QM_CUSTOMER  A
        ON (IOP.SEMI_ITEM_ID=A.MATNR AND IOP.CUSTOMER_ID=A.KUNNR)
    WHEN MATCHED THEN 
    UPDATE SET IOP.ORDER_PLANNING='1' WHERE VIP=1;
    COMMIT;
    
    --既是VIP又是假验货
    MERGE INTO IN_ORDER_PLANNING IOP
        USING SAP_QM_CUSTOMER_fake  A
        ON (IOP.SEMI_ITEM_ID=A.MATNR AND IOP.CUSTOMER_ID=A.KUNNR)
    WHEN MATCHED THEN 
    UPDATE SET IOP.ORDER_PLANNING='0' WHERE VIP=1;
    COMMIT;
    
    --真假验假UI表中没有维护,则VIP客户一定是假验货
    UPDATE IN_ORDER_PLANNING SET ORDER_PLANNING='0' WHERE  ORDER_PLANNING IS  NULL;
    COMMIT;
    
    ---真验货
    INSERT INTO IN_ORDER_PLANNING(SO_ID,  SO_LINE_ID ,  FG_ITEM_ID ,  SEMI_ITEM_ID,  ORDER_PLANNING ,  CUSTOMER_ID ,VIP,WERKS  )
    SELECT distinct ISO.SO_ID,ISO.SO_LINE_ID, HD.PRODUCT_ID,ZYH.MATNR,'1',ZYH.KUNNR,'',ISO.SITEID
        from SAP_QM_CUSTOMER ZYH, IN_BOM_DETAILS DT, IN_BOM_HEADER HD,IN_SALES_ORDER ISO
         WHERE    ZYH.MATNR= DT.ITEM_ID  AND  DT.BOM_ID = HD.BOM_ID AND ISO.ITEM_ID=HD.PRODUCT_ID AND ISO.CUSTOMER_ID=ZYH.KUNNR
                AND HD.IS_VALID = '1'  
                AND ISO.SO_ID || SO_LINE_ID  NOT IN (SELECT SO_ID || SO_LINE_ID FROM IN_ORDER_PLANNING);
    COMMIT;                
                
    ---假验货
    INSERT INTO IN_ORDER_PLANNING(SO_ID,  SO_LINE_ID ,  FG_ITEM_ID ,  SEMI_ITEM_ID,  ORDER_PLANNING ,  CUSTOMER_ID ,VIP,WERKS  )
    SELECT distinct ISO.SO_ID,ISO.SO_LINE_ID, HD.PRODUCT_ID,ZYH.MATNR,'0',ZYH.KUNNR,'',ISO.SITEID
        from SAP_QM_CUSTOMER_fake ZYH, IN_BOM_DETAILS DT, IN_BOM_HEADER HD,IN_SALES_ORDER ISO
         WHERE    ZYH.MATNR= DT.ITEM_ID  AND  DT.BOM_ID = HD.BOM_ID AND ISO.ITEM_ID=HD.PRODUCT_ID AND ISO.CUSTOMER_ID=ZYH.KUNNR
                AND HD.IS_VALID = '1'  
                AND ISO.SO_ID || SO_LINE_ID  NOT IN (SELECT SO_ID || SO_LINE_ID FROM IN_ORDER_PLANNING);                
     COMMIT;
     
     --真假验假UI表中没有维护,则VIP客户一定是假验货
    UPDATE IN_ORDER_PLANNING SET VIP='0' WHERE  VIP IS  NULL;
    COMMIT;
                 
    /*--1.无BOM
    INSERT INTO IN_ORDER_PLANNING(MANDT,  KUNNRV ,  CMATNR ,  BMATNR,  MENGE ,  SIGEN ,  WERKS ,HASBOM)
    SELECT VIP.* ,'N' HASBOM FROM SAP_037A VIP WHERE NOT EXISTS(SELECT * FROM IN_ORDER_PLANNING A WHERE A.CMATNR=VIP.CMATNR AND VIP.WERKS=A.WERKS );
    --and VIP.CMATNR='000000101002001847' ;

    COMMIT;
     
    --2.将真验货表数据与IN_ORDER_PLANNING关联,匹配成功的数据标识为1,用于后面将IN_ORDER_PLANNING表的MATNR更新为空
     MERGE INTO IN_ORDER_PLANNING VIP
    USING SAP_QM_CUSTOMER  A
        ON (VIP.MATNR=A.MATNR AND VIP.KUNNRV=A.KUNNR)
    WHEN MATCHED THEN 
    UPDATE SET VIP.ZFLAG2 = '1',VIP.KUNNR=A.KUNNR,VIP.ROW_ID=A.ROW_ID,VIP.ZFLAG=A.ZFLAG;
    COMMIT;
    
    
    update SAP_QM_CUSTOMER_FAKE set matnr='000000102001001122' where matnr='000000102002000563' and kunnr='R3540';--用于测试
    
    
    ---2.将假验货表数据与IN_ORDER_PLANNING关联,匹配成功的数据标识为2,用于后面将IN_ORDER_PLANNING表的MATNR更新为空
    MERGE INTO IN_ORDER_PLANNING VIP
    USING SAP_QM_CUSTOMER_FAKE  A
        ON (VIP.MATNR=A.MATNR  AND VIP.KUNNRV=A.KUNNR)
    WHEN MATCHED THEN 
    UPDATE SET VIP.ZFLAG2 = '2' ,VIP.KUNNR=A.KUNNR,VIP.ROW_ID=A.ROW_ID;
    COMMIT;
  
    --3.将不符合条件 的半成品编码删除掉(ZFLAG2状态不为1的数据或者为空的数据)
    UPDATE IN_ORDER_PLANNING SET MATNR=''  WHERE ZFLAG2 IS NULL;
    COMMIT;
    
    --4.将余下的真验货数据写入IN_ORDER_PLANNING表
    INSERT INTO IN_ORDER_PLANNING(KUNNR,MATNR,ROW_ID,ZFLAG)
    SELECT A.* FROM SAP_QM_CUSTOMER  A WHERE NOT EXISTS(SELECT * FROM IN_ORDER_PLANNING  VIP  WHERE VIP.MATNR=A.MATNR AND VIP.KUNNRV=A.KUNNR );
    COMMIT;
    
     --4.将余下的假验货数据写入IN_ORDER_PLANNING表
    INSERT INTO IN_ORDER_PLANNING(KUNNR,MATNR,ROW_ID)
    SELECT KUNNR,MATNR,ROW_ID FROM SAP_QM_CUSTOMER_FAKE  A WHERE NOT EXISTS(SELECT * FROM IN_ORDER_PLANNING  VIP  WHERE VIP.MATNR=A.MATNR AND VIP.KUNNRV=A.KUNNR );
    COMMIT;
*/

   -------二、将ZFP027A和ZFP025a整合进一个表IN_BOM_CHANGE      
  --TRUNCATE IN_BOM_CHANGE
  EXECUTE IMMEDIATE 'TRUNCATE TABLE IN_BOM_CHANGE'; 
  
     --INSERT THE DATA
     INSERT INTO IN_BOM_CHANGE(
       SO_ID 
      ,SO_LINE_ID
      ,LOC_ID
      ,PARENT_ITEM_ID
      ,BOM_ID
      ,OLD_ITEM_ID
      --,OLD_QUANTITY
      ,NEW_ITEM_ID
      --,NEW_QUANTITY
      ,PERIOD_DATE
      ,ACTION   
    )
SELECT DISTINCT      ISO.SO_ID
                    ,ISO.SO_LINE_ID
                    ,ST.WERKS
                    ,ST.PMATNR
                    ,ISO.BOMID
                    ,ST.IDNRK
                    ,ST.CMATNR
                    ,ST.DATUB
                    ,'MODIFY'
     FROM SAP_BOM_CHANGE_ALT ST 
      JOIN IN_SALES_ORDER ISO
       ON ST.PMATNR=ISO.ITEM_ID
    UNION
    --半成品编码,先用半成品编码在BOM中找出对应所有成品编码,再用成品编码去找所有对应未清SO明细
   SELECT DISTINCT ISO.SO_ID
                   ,ISO.SO_LINE_ID
                   ,ST.WERKS
                   ,ST.PMATNR
                   ,IH.BOM_ID
                   ,ST.IDNRK
                   ,ST.CMATNR
                   ,ST.DATUB
                   ,'MODIFY'
     FROM SAP_BOM_CHANGE_ALT ST
      JOIN IN_BOM_HEADER IH
       ON ST.PMATNR=IH.PRODUCT_ID
      JOIN IN_BOM_DETAILS IB
       ON IB.ITEM_ID=ST.PMATNR
      JOIN IN_BOM_HEADER IR
       ON IB.BOM_ID=IR.BOM_ID
      JOIN IN_SALES_ORDER ISO
       ON  IR.PRODUCT_ID=ISO.ITEM_ID   
    WHERE SUBSTR(LTRIM(ST.PMATNR,0),1,3)
    NOT IN('101','401')
    UNION
  --直接取SAP_SO_BOM表数据,有效期按照最早的soid交期
    SELECT ISO.SO_ID
          ,ISO.SO_LINE_ID
          ,SB.SITE_ID
          ,SB.PITEM
          ,ISO.BOMID
          ,SB.CITEM
          ,SB.N_CITEM
          ,MIN(NVL(ISO.UDF_PROMD,ISO.UDF_CRSD))PERIODDATE
          ,'MODIFY'
           FROM SAP_SO_BOM SB
    JOIN IN_SALES_ORDER ISO
      ON SB.SO_ID=ISO.SO_ID
     AND LTRIM(SB.SO_LINE_ID,0)=SUBSTR(ISO.SO_LINE_ID,1,INSTR(ISO.SO_LINE_ID,'_')-1)
    GROUP BY ISO.SO_ID
            ,ISO.SO_LINE_ID
            ,SB.SITE_ID
            ,SB.PITEM
            ,SB.CITEM
            ,SB.N_CITEM
            ,ISO.BOMID
            ,'MODIFY';

COMMIT;
--VIP标签的加减  成品对应的标识减 DEL 半成品对应的表示新增NEW
 INSERT INTO IN_BOM_CHANGE(
       SO_ID 
      ,SO_LINE_ID
      ,LOC_ID
      ,PARENT_ITEM_ID
      ,BOM_ID
      ,OLD_ITEM_ID
      ,OLD_QUANTITY
      ,NEW_ITEM_ID
      ,NEW_QUANTITY
      ,PERIOD_DATE
      ,ACTION   
    )
    --成品减标签标识 DEL
SELECT DISTINCT IP.SO_ID
               ,IP.SO_LINE_ID
               ,IP.WERKS
               ,IP.FG_ITEM_ID
               ,IH.BOM_ID
               ,SA.BMATNR OLD_ITEM_ID
               ,NULL NEW_QUANTITY
               ,NULL NEW_ITEM_ID
               ,NULL OLD_QUANTITY  
               ,MIN(NVL(ISO.UDF_PROMD,ISO.UDF_CRSD))PERIODDATE            
               ,'DEL' ACTION
               
FROM 
IN_ORDER_PLANNING IP
JOIN SAP_037A SA
ON IP.FG_ITEM_ID=SA.CMATNR
AND IP.WERKS=SA.WERKS
JOIN IN_BOM_HEADER IH
ON IP.FG_ITEM_ID=IH.PRODUCT_ID
AND IP.WERKS=SUBSTR(IH.BOM_ID,INSTR(IH.BOM_ID,'_')+1,INSTR(IH.BOM_ID,'_',2,1)-5)
JOIN IN_SALES_ORDER ISO
ON IP.SO_ID=ISO.SO_ID
AND IP.SO_LINE_ID=ISO.SO_LINE_ID
 WHERE IP.VIP=1 AND LENGTH(TRIM(BOM_ID))<=16
 GROUP BY       IP.SO_ID
               ,IP.SO_LINE_ID
               ,IP.WERKS
               ,IP.FG_ITEM_ID
               ,IH.BOM_ID
               ,SA.BMATNR
               ,NULL
               ,NULL
               ,NULL            
               ,'DEL'
UNION
--半成品新增标签标识 NEW
SELECT DISTINCT IP.SO_ID
               ,IP.SO_LINE_ID
               ,IP.WERKS
               ,IP.SEMI_ITEM_ID
               ,IH.BOM_ID
               ,NULL OLD_ITEM_ID
               ,NULL NEW_QUANTITY
               ,SA.BMATNR NEW_ITEM_ID
               ,NULL OLD_QUANTITY     
               ,MIN(NVL(ISO.UDF_PROMD,ISO.UDF_CRSD))PERIODDATE         
               ,'NEW' ACTION
               
FROM 
IN_ORDER_PLANNING IP
JOIN SAP_037A SA
ON IP.FG_ITEM_ID=SA.CMATNR
AND IP.WERKS=SA.WERKS
JOIN IN_BOM_HEADER IH
ON IP.SEMI_ITEM_ID=IH.PRODUCT_ID
AND IP.WERKS=SUBSTR(IH.BOM_ID,INSTR(IH.BOM_ID,'_')+1,INSTR(IH.BOM_ID,'_',2,1)-5)
JOIN IN_SALES_ORDER ISO
ON IP.SO_ID=ISO.SO_ID
AND IP.SO_LINE_ID=ISO.SO_LINE_ID
 WHERE IP.VIP=1 AND LENGTH(TRIM(BOM_ID))<=16
 GROUP BY       IP.SO_ID
               ,IP.SO_LINE_ID
               ,IP.WERKS
               ,IP.SEMI_ITEM_ID
               ,IH.BOM_ID
               ,SA.BMATNR
               ,NULL
               ,NULL
               ,NULL            
               ,'NEW'
;
COMMIT;


--EXCEPTIONS
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;

      e_ErrMessage :=
            SUBSTR (SQLERRM, 1, 1000)
         || SUBSTR (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 2000);
      PKG_UTIL.CREATELOG ('IN_ORDER_PLANNING',
                          'IN_ORDER_PLANNING',
                          '1',
                          'INSERT',
                          PKG_CONSTANT.CONS_MSG_EXCEPTION,
                          e_ErrMessage,
                          'IN_ORDER_PLANNING');

      EXITCODE := 1;
END;
/
View Code

四、SSIS导数

INSERT INTO IN_STOCK_LOCATION(
WERKS,LOCATION_ID,LOCATION_NAME)
SELECT WERKS,LGORT,LGOBE FROM ZTPP_FP_046@SAP_SEP;


INSERT INTO IN_STOCK_CUSTOMER(CUSTOMER_ID,
                              NAME_ID,
                              ID,
                           LOCATION_ID)
                   SELECT KUNNR 
                         ,ZQUNZ
                         ,ZINX
,LGORT
FROM  SAPSR3.ZTPP_FP_042@SAP_SEP

五、修改存储过程SAP_SO_BOM_OUTSOURCING_SEMI,去掉尾续

六、执行新存储过程SAP_VIP_YANHUO ,写入数据

七、去掉INVENTORY和IN_SEMI_ONHAND_LOCK表的尾续

ALTER TABLE IN_INVENTORY MODIFY EXT_FORTEXT1 VARCHAR2(10 BYTE);
UPDATE IN_INVENTORY SET  EXT_FORTEXT1=SUBSTR(ITEM_ID,19,2),ITEM_ID=SUBSTR(ITEM_ID,1,18) WHERE ITEM_ID LIKE '%C%';
COMMIT;
UPDATE IN_SEMI_ONHAND_LOCKED SET ITEM_ID =SUBSTR(ITEM_ID,1,18) WHERE ITEM_ID LIKE '%C%';
COMMIT;

八、FP_BOM

九、fp

猜你喜欢

转载自www.cnblogs.com/Snowfun/p/9257178.html