SAP PP 生產訂單變更記錄保存


*&---------------------------------------------------------------------*
*&  包括                ZXCO1U01
*&---------------------------------------------------------------------*
***生產訂單關鍵參數修改日志記錄
IF HEADER_TABLE-AUTYP = '10' AND HEADER_TABLE-VBKZ <> 'I' AND SY-TCODE <> 'COHV'. "10-PP生產訂單
*--------------------------------------------------------------------*
* 數據定義
*--------------------------------------------------------------------*
  TABLES:ZPPCO02_LOG.

  DATA:IT_CO02LOG  TYPE STANDARD TABLE OF ZPPCO02_LOG,
       IT_CO02LOGN TYPE STANDARD TABLE OF ZPPCO02_LOG,
       IW_CO02LOG  TYPE ZPPCO02_LOG,
       IW_CO02LOGN TYPE ZPPCO02_LOG.

  DATA:IPX        TYPE MSXXLIST-HOSTADR,
       IP         TYPE ZPPCO02_LOG-CHIPA,
       HOST       TYPE ZPPCO02_LOG-CHHST.

  DATA:VI_OPNUM   TYPE ZPPCO02_LOG-CHNUM,
       VS_STR     TYPE STRING.

  DATA:V_ARBPL_OLD LIKE CRHD-ARBPL,
       V_ARBPL_NEW LIKE CRHD-ARBPL.

  DATA:L_DATUM TYPE SY-DATUM,
       L_RATE  TYPE P DECIMALS 5,
       L_RATE1 TYPE P DECIMALS 5.

*--------------------------------------------------------------------*
* 宏定義
*--------------------------------------------------------------------*

DEFINE  DEL_ZERO_R.
  SHIFT &1 RIGHT DELETING TRAILING '0'.
  SHIFT &1 RIGHT DELETING TRAILING '.'.
  CONDENSE &1 NO-GAPS.
END-OF-DEFINITION.

DEFINE ULOG_LINE.
*  &1:表名
*  &2:表名差異部分
*  &3:字段名
*  &4:變更對象類型
*  &5:變更對象的描述
  IF &1-&3 <> &1_&2-&3.
    CLEAR IW_CO02LOG.
    VI_OPNUM     = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
    IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

    IW_CO02LOG-CHTYP = 'U'.          "操作類型:U-更新
    IW_CO02LOG-OBJTP = '&4'.         "操作對象類型(抬頭、組件、工藝等)
    IW_CO02LOG-OBJNM = '&5'.         "操作對象描述
    IW_CO02LOG-VLOLD = &1_&2-&3.     "操作對象的舊值
    IW_CO02LOG-VLNEW = &1-&3.        "操作對象的新值

    APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
  ENDIF.
END-OF-DEFINITION.

DEFINE ULOG_ITAB.
* ---------------------------------------------------
* &1:記錄新值的內表名稱
* &2:記錄舊值的內表名稱與新表的差異部分(通常為OLD)
* &3:比較的字段名稱
* &4:操作對象類型
* &5:操作對象描述
* &6:操作對象唯一行標記描述
* &7:操作對象唯一行標記字段名
* &8:操作對象輔助行標記描述
* &9:操作對象輔助行標記字段名
* ---------------------------------------------------
  IF &1-&3 <> &1_&2-&3.
    CLEAR IW_CO02LOG.
    VI_OPNUM         = VI_OPNUM + 1.     "記錄本次操作的流水編碼(自增1)
    IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼
    IW_CO02LOG-CHTYP = 'U'.          "操作類型:U-更新

    IW_CO02LOG-OBJTP = '&4'.         "操作對象類型(抬頭、組件、工藝等)
    IW_CO02LOG-OBJNM = '&5'.         "操作對象描述

*   -------------------------------------------
*   操作對象唯一行標記,例如:預留項目號(1)
*   唯一行標記一般前台不可見,但唯一且不可更改
*   -------------------------------------------
    IW_CO02LOG-OBJLU = &1-&7.        "操作對象唯一行標記的值(例如:0001)

    SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.            "去除前置0

    CONCATENATE '&6' '(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*   -------------------------------------------
*   操作對象輔助行標記,例如:BOM項目號(0010)
*   輔助行標記一般不唯一或可修改,但最常用
*   -------------------------------------------
    IW_CO02LOG-OBJLA = &1-&9.        "操作對象輔助行標記的值(例如:0010)
    CONCATENATE '&8' '(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述

    IW_CO02LOG-VLOLD = &1_&2-&3.     "操作對象的舊值
    IW_CO02LOG-VLNEW = &1-&3.        "操作對象的新值

    APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
  ENDIF.

END-OF-DEFINITION.

*--------------------------------------------------------------------*
*訂單抬頭修改
*--------------------------------------------------------------------*
 IF HEADER_TABLE-VBKZ = 'U'.
   ULOG_LINE: HEADER_TABLE OLD GAMNG 訂單抬頭 訂單總數量   ,
              HEADER_TABLE OLD GASMG 訂單抬頭 訂單廢品數量 ,
              HEADER_TABLE OLD GLTRP 訂單抬頭 基本完成日期 ,
              HEADER_TABLE OLD GSTRP 訂單抬頭 基本開始日期 ,
              HEADER_TABLE OLD FHORI 訂單抬頭 計划邊際碼   ,
              HEADER_TABLE OLD DISPO 訂單抬頭 MRP控制者    ,
              HEADER_TABLE OLD FEVOR 訂單抬頭 生產調度員   .
 ENDIF.

*--------------------------------------------------------------------*
* 訂單收貨庫存地點更改
*--------------------------------------------------------------------*
 IF POSITION_TABLE-VBKZ = 'U'.

   ULOG_LINE: POSITION_TABLE OLD LGORT 訂單項目 收貨庫存地點.

 ENDIF.

*--------------------------------------------------------------------*
* 訂單組件更改
*--------------------------------------------------------------------*
 LOOP AT COMPONENT_TABLE WHERE NOT VBKZ IS INITIAL.

   CASE COMPONENT_TABLE-VBKZ.
*    ---------------------------
*    記錄組件的新增日志
*    ---------------------------
     WHEN 'I'.
       CLEAR:IW_CO02LOG.
       VI_OPNUM         = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
       IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

       IW_CO02LOG-CHTYP = 'I'.                    "操作類型:I-新增
       IW_CO02LOG-OBJTP = '訂單組件'.             "操作對象類型(抬頭、組件、工藝等)
       IW_CO02LOG-OBJNM = '訂單組件(新增)'.       "操作對象描述

*      -------------------------------------------
*      操作對象唯一行標記,例如:預留項目號(1)
*      唯一行標記一般前台不可見,但唯一且不可更改
*      -------------------------------------------
       IW_CO02LOG-OBJLU = COMPONENT_TABLE-RSPOS.        "預留項目號(例如:0001)

       SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.                           "去除前置0

       CONCATENATE '預留項目號(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*      -------------------------------------------
*      操作對象輔助行標記,例如:BOM項目號(0010)
*      輔助行標記一般不唯一或可修改,但最常用
*      -------------------------------------------
       IW_CO02LOG-OBJLA = COMPONENT_TABLE-POSNR.        "BOM項目號(例如:0010)
       CONCATENATE 'BOM項目號(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述

*      ------------------------------------------
*      將新增組件的所有信息組合為一行存入NEW字段
*      ------------------------------------------
       VS_STR = COMPONENT_TABLE-ERFMG.

       DEL_ZERO_R VS_STR.

       SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING '0'.
       CONCATENATE '物料號:' COMPONENT_TABLE-MATNR
                   ',需求數量:' VS_STR '(' COMPONENT_TABLE-ERFME ')'
                   ',工廠:' COMPONENT_TABLE-WERKS INTO IW_CO02LOG-VLNEW.

       IF NOT COMPONENT_TABLE-LGORT IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',庫存地點:' COMPONENT_TABLE-LGORT INTO IW_CO02LOG-VLNEW.
       ENDIF.

       IF NOT COMPONENT_TABLE-RGEKZ IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',反沖:' COMPONENT_TABLE-RGEKZ INTO IW_CO02LOG-VLNEW.
       ENDIF.

       APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
*    ---------------------------
*    記錄組件的修改日志
*    ---------------------------
     WHEN 'U'.
*      --------------------------------
*      根據預留及項目查詢更改前的信息
*      --------------------------------
       READ TABLE COMPONENT_TABLE_OLD
       WITH KEY RSNUM = COMPONENT_TABLE-RSNUM
                RSPOS = COMPONENT_TABLE-RSPOS.

       CHECK SY-SUBRC = 0.

       SHIFT COMPONENT_TABLE_OLD-MATNR LEFT DELETING LEADING '0'.
       SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING '0'.
       SHIFT COMPONENT_TABLE_OLD-LIFNR LEFT DELETING LEADING '0'.
       SHIFT COMPONENT_TABLE-LIFNR LEFT DELETING LEADING '0'.

       ULOG_ITAB: COMPONENT_TABLE OLD POSNR 訂單組件 BOM項目號 預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD MATNR 訂單組件 物料號    預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD ERFMG 訂單組件 需求數量  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD ERFME 訂單組件 計量單位  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD WERKS 訂單組件 工廠      預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD LGORT 訂單組件 庫存地點  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD RGEKZ 訂單組件 反沖標識  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD SOBKZ 訂單組件 特殊庫存  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD LIFNR 訂單組件 供應商(特殊庫存)  預留項目號 RSPOS BOM項目號 POSNR,
                  COMPONENT_TABLE OLD XLOEK 訂單組件 已刪除標識  預留項目號 RSPOS BOM項目號 POSNR.
     WHEN 'D'.
       CLEAR:IW_CO02LOG.
       VI_OPNUM         = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
       IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

       IW_CO02LOG-CHTYP = 'D'.                    "操作類型:I-新增
       IW_CO02LOG-OBJTP = '訂單組件'.             "操作對象類型(抬頭、組件、工藝等)
       IW_CO02LOG-OBJNM = '訂單組件(刪除)'.       "操作對象描述

*      -------------------------------------------
*      操作對象唯一行標記,例如:預留項目號(1)
*      唯一行標記一般前台不可見,但唯一且不可更改
*      -------------------------------------------
       IW_CO02LOG-OBJLU = COMPONENT_TABLE-RSPOS.        "預留項目號(例如:0001)

       SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.             "去除前置0

       CONCATENATE '預留項目號(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*      -------------------------------------------
*      操作對象輔助行標記,例如:BOM項目號(0010)
*      輔助行標記一般不唯一或可修改,但最常用
*      -------------------------------------------
       IW_CO02LOG-OBJLA = COMPONENT_TABLE-POSNR.        "BOM項目號(例如:0010)
       CONCATENATE 'BOM項目號(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述
*      ------------------------------------------
*      將新增組件的所有信息組合為一行存入NEW字段
*      ------------------------------------------
       VS_STR = COMPONENT_TABLE-ERFMG.

       DEL_ZERO_R VS_STR.

       SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING '0'.
       CONCATENATE '物料號:' COMPONENT_TABLE-MATNR
                   ',需求數量:' VS_STR '(' COMPONENT_TABLE-ERFME ')'
                   ',工廠:' COMPONENT_TABLE-WERKS INTO IW_CO02LOG-VLNEW.

       IF NOT COMPONENT_TABLE-LGORT IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',庫存地點:' COMPONENT_TABLE-LGORT INTO IW_CO02LOG-VLNEW.
       ENDIF.

       IF NOT COMPONENT_TABLE-RGEKZ IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',反沖:' COMPONENT_TABLE-RGEKZ INTO IW_CO02LOG-VLNEW.
       ENDIF.

       APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
   ENDCASE.

 ENDLOOP.

*--------------------------------------------------------------------*
* 訂單工序更改
*--------------------------------------------------------------------*
 LOOP AT OPERATION_TABLE WHERE NOT VBKZ IS INITIAL.

   CASE OPERATION_TABLE-VBKZ.
*    ---------------------------
*    記錄工序的新增日志
*    ---------------------------
     WHEN 'I'.

       VI_OPNUM     = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
       IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

       IW_CO02LOG-CHTYP = 'I'.                     "操作類型:I-新增
       IW_CO02LOG-OBJTP = '訂單工序'.              "操作對象類型(抬頭、組件、工藝等)
       IW_CO02LOG-OBJNM = '訂單工序(新增)'.        "操作對象描述

*      -------------------------------------------
*      操作對象唯一行標記,例如:預留項目號(1)
*      唯一行標記一般前台不可見,但唯一且不可更改
*      -------------------------------------------
       IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL.        "工序計數器(例如:00000001)

       SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.                "去除前置0

       CONCATENATE '工序計數器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*      -------------------------------------------
*      操作對象輔助行標記,例如:BOM項目號(0010)
*      輔助行標記一般不唯一或可修改,但最常用
*      -------------------------------------------
       IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR.        "工序號(例如:0010)
       CONCATENATE '工序號(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述

*      -------------------------------------------------------------------
*      將新增工序的所有信息組合為一行存入NEW字段
*      由於ALV的列寬最大為128字符,所以將工時部分組合為一行存入NEW2字段
*      -------------------------------------------------------------------
       CLEAR V_ARBPL_NEW.
       SELECT SINGLE ARBPL
          FROM CRHD
          INTO V_ARBPL_NEW
         WHERE OBJTY = 'A' AND
               OBJID = OPERATION_TABLE-ARBID.
       IF SY-SUBRC = 0.
         CONCATENATE '工作中心:' V_ARBPL_NEW ',' INTO IW_CO02LOG-VLNEW.
       ENDIF.

       CONCATENATE IW_CO02LOG-VLNEW
                   '工廠:' OPERATION_TABLE-WERKS
                   ',控制碼:' OPERATION_TABLE-STEUS INTO IW_CO02LOG-VLNEW.

       IF NOT OPERATION_TABLE-KTSCH IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',標准文本碼:' OPERATION_TABLE-KTSCH INTO IW_CO02LOG-VLNEW.
       ENDIF.

       CONCATENATE IW_CO02LOG-VLNEW ',工序短文本:' OPERATION_TABLE-LTXA1 INTO IW_CO02LOG-VLNEW.

*      ------------------------
*      工時部分存入NEW2字段
*      ------------------------
       IF NOT OPERATION_TABLE-VGW01 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW01.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',准備工時:' VS_STR '(' OPERATION_TABLE-VGE01 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-VGW02 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW02.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',機器工時:' VS_STR '(' OPERATION_TABLE-VGE02 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-VGW03 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW03.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',人工工時:' VS_STR '(' OPERATION_TABLE-VGE03 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-PREIS IS INITIAL.
         VS_STR = OPERATION_TABLE-PREIS.
         CONCATENATE IW_CO02LOG-VLNE2 ',外協價格:' VS_STR '(' OPERATION_TABLE-WAERS ')/' INTO IW_CO02LOG-VLNE2.
         VS_STR = OPERATION_TABLE-PEINH.
         CONCATENATE IW_CO02LOG-VLNE2 VS_STR '(' OPERATION_TABLE-MEINH ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       SHIFT IW_CO02LOG-VLNE2 LEFT DELETING LEADING ','.
       CONDENSE IW_CO02LOG-VLNE2 NO-GAPS.

       APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
       CLEAR IW_CO02LOG.

*    ---------------------------
*    記錄工序的修改日志
*    ---------------------------
     WHEN 'U'.
*      ----------------------------------------------
*      根據工藝路線號及計數器查詢更改前的信息(AFVC)
*      ----------------------------------------------
       READ TABLE OPERATION_TABLE_OLD_AFVC
       WITH KEY AUFPL = OPERATION_TABLE-AUFPL
                APLZL = OPERATION_TABLE-APLZL.

       IF SY-SUBRC = 0.
*        -------------------------------------
*        可直接記錄更改的參數(工序基本信息)
*        -------------------------------------
         ULOG_ITAB: OPERATION_TABLE OLD_AFVC VORNR 訂單工序 工序號     工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC WERKS 訂單工序 工廠       工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC STEUS 訂單工序 控制碼     工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC KTSCH 訂單工序 標准文本碼 工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC LTXA1 訂單工序 工序短文本 工序計數器 APLZL 工序號 VORNR.
*        -------------------------------------
*        可直接記錄更改的參數(外協價格信息)
*        -------------------------------------
         ULOG_ITAB: OPERATION_TABLE OLD_AFVC PREIS 訂單工序 外協價格         工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC WAERS 訂單工序 外協價格貨幣     工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVC PEINH 訂單工序 外協價格單位(每) 工序計數器 APLZL 工序號 VORNR.

*        ---------------------------------------------
*        比較工作中心是否修改,因未直接記錄工作中心,
*        只能根據AFVC-ARBID查找工作中心並比較
*        ---------------------------------------------
         IF OPERATION_TABLE-ARBID <> OPERATION_TABLE_OLD_AFVC-ARBID.
*          ----------------------------------------
*          根據AFVC-ARBID查詢工作中心的原值與新值
*          ----------------------------------------
           CLEAR: V_ARBPL_OLD,V_ARBPL_NEW.

           SELECT SINGLE ARBPL
              FROM CRHD
              INTO V_ARBPL_OLD
             WHERE OBJTY = 'A' AND
                   OBJID = OPERATION_TABLE_OLD_AFVC-ARBID.

           SELECT SINGLE ARBPL
              FROM CRHD
              INTO V_ARBPL_NEW
             WHERE OBJTY = 'A' AND
                   OBJID = OPERATION_TABLE-ARBID.
*          ----------------------------------------
*          如果工作中心的原值與新值不同則記錄
*          ----------------------------------------
           IF V_ARBPL_OLD <> V_ARBPL_NEW.
             VI_OPNUM     = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
             IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

             IW_CO02LOG-CHTYP = 'U'.          "操作類型:U-更新
             IW_CO02LOG-OBJTP = '訂單工序'.   "操作對象類型(抬頭、組件、工藝等)
             IW_CO02LOG-OBJNM = '工作中心'.   "操作對象描述

*            -------------------------------------------
*            操作對象唯一行標記,例如:預留項目號(1)
*            唯一行標記一般前台不可見,但唯一且不可更改
*            -------------------------------------------
             IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL.        "工序計數器(例如:00000001)

             SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.             "去除前置0

             CONCATENATE '工序計數器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*            -------------------------------------------
*            操作對象輔助行標記,例如:BOM項目號(0010)
*            輔助行標記一般不唯一或可修改,但最常用
*            -------------------------------------------
             IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR.        "工序號(例如:0010)
             CONCATENATE '工序號(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述

             IW_CO02LOG-VLOLD = V_ARBPL_OLD.             "操作對象的舊值
             IW_CO02LOG-VLNEW = V_ARBPL_NEW.             "操作對象的新值

             APPEND IW_CO02LOG TO IT_CO02LOG.     "追加記錄
             CLEAR IW_CO02LOG.
           ENDIF.

         ENDIF.

       ENDIF.

*      ----------------------------------------------
*      根據工藝路線號及計數器查詢更改前的信息(AFVV)
*      ----------------------------------------------
       READ TABLE OPERATION_TABLE_OLD_AFVV
       WITH KEY AUFPL = OPERATION_TABLE-AUFPL
                APLZL = OPERATION_TABLE-APLZL.

       IF SY-SUBRC = 0.
*        ---------------------------------------------
*        可直接記錄更改的參數(工時信息)
*        ---------------------------------------------
         ULOG_ITAB: OPERATION_TABLE OLD_AFVV VGW01 訂單工序 准備工時(數值)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV VGE01 訂單工序 准備工時(單位)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV VGW02 訂單工序 機器工時(數值)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV VGE02 訂單工序 機器工時(單位)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV VGW03 訂單工序 人工工時(數值)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV VGE03 訂單工序 人工工時(單位)   工序計數器 APLZL 工序號 VORNR,
                    OPERATION_TABLE OLD_AFVV MEINH 訂單工序 作業的計量單位   工序計數器 APLZL 工序號 VORNR.

       ENDIF.
     WHEN 'D'.
       VI_OPNUM     = VI_OPNUM + 1. "記錄本次操作的流水編碼(自增1)
       IW_CO02LOG-CHNUM = VI_OPNUM.     "記錄本次操作的流水編碼

       IW_CO02LOG-CHTYP = 'D'.                     "操作類型:I-新增
       IW_CO02LOG-OBJTP = '訂單工序'.              "操作對象類型(抬頭、組件、工藝等)
       IW_CO02LOG-OBJNM = '訂單工序(刪除)'.        "操作對象描述

*      -------------------------------------------
*      操作對象唯一行標記,例如:預留項目號(1)
*      唯一行標記一般前台不可見,但唯一且不可更改
*      -------------------------------------------
       IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL.        "工序計數器(例如:00000001)

       SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'.                "去除前置0

       CONCATENATE '工序計數器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU.  "拼寫描述

*      -------------------------------------------
*      操作對象輔助行標記,例如:BOM項目號(0010)
*      輔助行標記一般不唯一或可修改,但最常用
*      -------------------------------------------
       IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR.        "工序號(例如:0010)
       CONCATENATE '工序號(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA.  "拼寫描述

*      -------------------------------------------------------------------
*      將新增工序的所有信息組合為一行存入NEW字段
*      由於ALV的列寬最大為128字符,所以將工時部分組合為一行存入NEW2字段
*      -------------------------------------------------------------------
       CLEAR: V_ARBPL_NEW,
              IW_CO02LOG-VLNEW.

       SELECT SINGLE ARBPL
          FROM CRHD
          INTO V_ARBPL_NEW
         WHERE OBJTY = 'A' AND
               OBJID = OPERATION_TABLE-ARBID.
       IF SY-SUBRC = 0.
         CONCATENATE '工作中心:' V_ARBPL_NEW ',' INTO IW_CO02LOG-VLNEW.
       ENDIF.

       CONCATENATE IW_CO02LOG-VLNEW
                   '工廠:' OPERATION_TABLE-WERKS
                   ',控制碼:' OPERATION_TABLE-STEUS INTO IW_CO02LOG-VLNEW.

       IF NOT OPERATION_TABLE-KTSCH IS INITIAL.
         CONCATENATE IW_CO02LOG-VLNEW ',標准文本碼:' OPERATION_TABLE-KTSCH INTO IW_CO02LOG-VLNEW.
       ENDIF.

       CONCATENATE IW_CO02LOG-VLNEW ',工序短文本:' OPERATION_TABLE-LTXA1 INTO IW_CO02LOG-VLNEW.

*      ------------------------
*      工時部分存入NEW2字段
*      ------------------------
       IF NOT OPERATION_TABLE-VGW01 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW01.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',准備工時:' VS_STR '(' OPERATION_TABLE-VGE01 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-VGW02 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW02.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',機器工時:' VS_STR '(' OPERATION_TABLE-VGE02 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-VGW03 IS INITIAL.
         VS_STR = OPERATION_TABLE-VGW03.
         DEL_ZERO_R VS_STR.
         CONCATENATE IW_CO02LOG-VLNE2 ',人工工時:' VS_STR '(' OPERATION_TABLE-VGE03 ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       IF NOT OPERATION_TABLE-PREIS IS INITIAL.
         VS_STR = OPERATION_TABLE-PREIS.
         CONCATENATE IW_CO02LOG-VLNE2 ',外協價格:' VS_STR '(' OPERATION_TABLE-WAERS ')/' INTO IW_CO02LOG-VLNE2.
         VS_STR = OPERATION_TABLE-PEINH.
         CONCATENATE IW_CO02LOG-VLNE2 VS_STR '(' OPERATION_TABLE-MEINH ')' INTO IW_CO02LOG-VLNE2.
       ENDIF.

       SHIFT IW_CO02LOG-VLNE2 LEFT DELETING LEADING ','.
       CONDENSE IW_CO02LOG-VLNE2 NO-GAPS.

       APPEND IW_CO02LOG TO IT_CO02LOG.               "追加記錄
       CLEAR IW_CO02LOG.

   ENDCASE.

 ENDLOOP.


*--------------------------------------------------------------------*
* 更新到數據庫表
*--------------------------------------------------------------------*
 IF NOT IT_CO02LOG[] IS INITIAL.

*  -----------------------------------
*  獲取客戶端IP地址(16進制)、主機名
*  -----------------------------------
   CALL FUNCTION 'TH_USER_INFO'
     IMPORTING
       HOSTADDR = IPX    "IP地址(16進制)
       TERMINAL = HOST.  "主機名

*  --------------------------------------
*  轉換IP地址(16進制轉換為10進制字符串)
*  --------------------------------------
   CALL FUNCTION 'GWY_IPADR2STRING'
     EXPORTING
       IPADR  = IPX
     IMPORTING
       STRING = IP.   "IP地址(10進制字符串)

*  ------------------------------------
*  補充日志內表的公共部分
*  ------------------------------------
   GET TIME.   "獲取最新的時間

   IW_CO02LOG-AUFNR  = HEADER_TABLE-AUFNR.  "訂單編碼
   SHIFT IW_CO02LOG-AUFNR LEFT DELETING LEADING '0'.
   IW_CO02LOG-CHDAT  = SY-DATUM.            "操作日期(服務器)
   IW_CO02LOG-CHTIM  = SY-UZEIT.            "操作時間(服務器)
   IW_CO02LOG-TCODE  = SY-TCODE.            "事務代碼
   IW_CO02LOG-CHUSR  = SY-UNAME.            "操作客戶端用戶名
   IW_CO02LOG-CHIPA  = IP.                  "操作客戶端IP地址
   IW_CO02LOG-CHHST  = HOST.                "操作客戶端主機名

   MODIFY IT_CO02LOG FROM IW_CO02LOG
                     TRANSPORTING AUFNR CHDAT CHTIM TCODE CHUSR CHIPA CHHST
                            WHERE AUFNR IS INITIAL.   "全部更新



*--------------------------------------------------------------------*
* 讀生產計划數據時 特殊處理
*--------------------------------------------------------------------*
  SORT IT_CO02LOG DESCENDING BY CHTYP.
  CLEAR:IW_CO02LOG.
  LOOP AT IT_CO02LOG INTO IW_CO02LOG.
    CONDENSE:IW_CO02LOG-VLNEW NO-GAPS,
             IW_CO02LOG-VLOLD NO-GAPS.
    IF IW_CO02LOG-CHTYP <> 'D'.
      APPEND IW_CO02LOG TO IT_CO02LOGN.
    ELSE.
      DELETE IT_CO02LOGN WHERE AUFNR = IW_CO02LOG-AUFNR
                           AND CHTYP = 'I'
                           AND CHDAT = IW_CO02LOG-CHDAT
                           AND CHTIM = IW_CO02LOG-CHTIM
                           AND OBJTP = IW_CO02LOG-OBJTP
                           AND VLNEW = IW_CO02LOG-VLNEW
                           AND VLNE2 = IW_CO02LOG-VLNE2
                           .
      IF SY-SUBRC <> 0.
        APPEND IW_CO02LOG TO IT_CO02LOGN.
      ENDIF.
    ENDIF.

  ENDLOOP.
*--------------------------------------------------------------------*
* 訂單總需求量變更時,只記錄總需求量的變更,刪除組件的同比例變更記錄
*--------------------------------------------------------------------*
  SORT IT_CO02LOGN BY CHNUM.
  LOOP AT IT_CO02LOGN INTO IW_CO02LOGN.
*  * 訂單總需求量變更時,只記錄總需求量的變更,刪除組件的同比例變更記錄
    IF IW_CO02LOGN-OBJTP = '訂單抬頭' AND IW_CO02LOGN-OBJNM = '訂單總數量'
       AND IW_CO02LOGN-CHTYP = 'U'   AND IW_CO02LOGN-VLNEW <> '0.000'.
      CLEAR: L_RATE.
      L_RATE = IW_CO02LOGN-VLOLD / IW_CO02LOGN-VLNEW.
    ENDIF.

    IF IW_CO02LOGN-OBJTP = '訂單組件' AND IW_CO02LOGN-OBJNM = '需求數量'
       AND IW_CO02LOGN-CHTYP = 'U'   AND IW_CO02LOGN-VLNEW <> '0.000'.
      CLEAR: L_RATE1.
      L_RATE1 = IW_CO02LOGN-VLOLD / IW_CO02LOGN-VLNEW.
      IF L_RATE = L_RATE1 AND L_RATE <> 0.
        DELETE TABLE IT_CO02LOGN FROM IW_CO02LOGN.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF IT_CO02LOGN IS INITIAL.
    IW_CO02LOG-CHNUM = '1'.
    IW_CO02LOG-CHTYP = 'U'.
    IW_CO02LOG-OBJTP = '讀生產主數據'.
    IW_CO02LOG-OBJNM = '組件、工序均未變更,可能是重讀主數據'.
    CLEAR:IW_CO02LOG-OBJLU,
          IW_CO02LOG-OBJLA,
          IW_CO02LOG-VLNEW,
          IW_CO02LOG-VLNE2.
    APPEND IW_CO02LOG TO IT_CO02LOGN.
  ENDIF.
*  ---------------------------
*  將日志保存至數據庫
*  ---------------------------
  INSERT ZPPCO02_LOG FROM TABLE IT_CO02LOGN ACCEPTING DUPLICATE KEYS.  "忽略索引相同的記錄

*  ---------------------------
*  刪除過早歷史數據
*  ---------------------------
  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      DATE            = SY-DATUM
      DAYS            = 0
      MONTHS          = 3
      SIGNUM          = '-'
      YEARS           = 0
   IMPORTING
      CALC_DATE       = L_DATUM
            .
  DELETE FROM ZPPCO02_LOG WHERE CHDAT <= L_DATUM.

 ENDIF.

ENDIF.

 

----------------湊字數-------------------------

勵志美文、《抉擇》
  
人的一生常處於抉擇之中,如:念哪一間大學?選哪一種職業?娶哪一種女子?……等等傷腦筋的事情。一個人抉擇力的有無,可以顯示其人格成熟與否。
  
倒是哪些胸無主見的人,不受抉擇之苦。因為逢到需要決定的時候,他總是求詢別人說:"嘿,你看怎么做?"
  
大凡能夠成大功業的人,都是抉擇力甚強的人。他知道事之成敗,全在乎已沒有人可以代勞,更沒有人能代你決定。
  
在抉擇的哪一刻,成敗實已露出端倪。
  1 *&---------------------------------------------------------------------*
  2 ** 程序名稱:Z
  3 ** 程序描述:
  4 ** 創建人  :
  5 ** 創建日期:
  6 *&---------------------------------------------------------------------*
  7 ** 修改記錄:
  8 
  9 REPORT Z.
 10 
 11 TYPE-POOLS: SLIS.
 12 TABLES: AFKO,USR02,ZPPCO02_LOG.
 13 
 14 TYPES: BEGIN OF LINE_LOG.  "輸出日志的結構
 15         INCLUDE STRUCTURE ZPPCO02_LOG.   "包含結構ZCO02_LOG_TABLE
 16 TYPES:  DDTEXT     LIKE DD07T-DDTEXT,                  "更新類型描述
 17         NAME_TEXT  LIKE ADRP-NAME_TEXT,
 18        END OF LINE_LOG.
 19 
 20 DATA: IT_LOG TYPE STANDARD TABLE OF LINE_LOG WITH HEADER LINE,
 21       BEGIN OF IT_USER OCCURS 0,
 22         BNAME    LIKE USR21-BNAME,
 23         NAME_TEXT LIKE ADRP-NAME_TEXT,
 24       END OF IT_USER.
 25 
 26 
 27 ************************************************************************
 28 * SELECTION-SCREEN
 29 ************************************************************************
 30 SELECTION-SCREEN BEGIN OF BLOCK FLAG1 WITH FRAME TITLE TEXT-001.
 31 SELECT-OPTIONS:
 32   R_AUFNR FOR AFKO-AUFNR OBLIGATORY MEMORY ID ANR,
 33   R_OPDAT FOR SY-DATUM,
 34   R_OPTIM FOR SY-UZEIT,
 35   R_OPTYP FOR ZPPCO02_LOG-CHTYP,
 36   R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP,
 37   R_CHIPA FOR ZPPCO02_LOG-CHIPA,
 38   R_CHHST FOR ZPPCO02_LOG-CHHST LOWER CASE.
 39 SELECTION-SCREEN END OF BLOCK FLAG1.
 40 
 41 ************************************************************************
 42 * Initialization
 43 ************************************************************************
 44 INITIALIZATION.
 45 
 46 ************************************************************************
 47 * AT SELECTION-SCREEN
 48 ************************************************************************
 49 AT SELECTION-SCREEN.
 50 
 51 
 52 ************************************************************************
 53 * START-OF-SELECTION
 54 ************************************************************************
 55 START-OF-SELECTION.
 56 
 57   PERFORM FRM_GET_DATA.
 58   PERFORM FRM_DISPLAY_ALV.
 59 
 60 *&--------------------------------------------------------------------*
 61 *&      Form  FRM_GET_DATA
 62 *&--------------------------------------------------------------------*
 63 *       主程序
 64 *---------------------------------------------------------------------*
 65 FORM FRM_GET_DATA.
 66 
 67   LOOP AT R_AUFNR.
 68     SHIFT R_AUFNR-LOW LEFT DELETING LEADING '0'.
 69     MODIFY R_AUFNR.
 70   ENDLOOP.
 71 
 72   SELECT *
 73     FROM ZPPCO02_LOG
 74     LEFT JOIN DD07T ON ZPPCO02_LOG~CHTYP = DD07T~DOMVALUE_L AND
 75                             DD07T~DDLANGUAGE = SY-LANGU              AND
 76                             DD07T~AS4LOCAL = 'A'                     AND
 77                             DD07T~DOMNAME = 'VERBUCHER'
 78     INTO CORRESPONDING FIELDS OF TABLE IT_LOG
 79    WHERE AUFNR IN R_AUFNR AND
 80          CHDAT IN R_OPDAT AND
 81          CHTIM IN R_OPTIM AND
 82          CHTYP IN R_OPTYP AND
 83          CHUSR IN R_OPUSR AND
 84          CHIPA IN R_CHIPA AND
 85          CHHST IN R_CHHST.
 86   IF SY-SUBRC <> 0.
 87     MESSAGE S001(00) WITH '變更日志不存在' DISPLAY LIKE 'E'.
 88     LEAVE TO TRANSACTION SY-TCODE.
 89   ENDIF.
 90 
 91   SELECT A~BNAME B~NAME_TEXT
 92     INTO TABLE IT_USER
 93     FROM USR21 AS A
 94     JOIN ADRP AS B ON A~PERSNUMBER = B~PERSNUMBER
 95     FOR ALL ENTRIES IN IT_LOG
 96     WHERE BNAME = IT_LOG-CHUSR.
 97   IF SY-SUBRC = 0.
 98     LOOP AT IT_LOG.
 99       READ TABLE IT_USER WITH KEY BNAME = IT_LOG-CHUSR.
100       IF  SY-SUBRC = 0.
101         IT_LOG-NAME_TEXT = IT_USER-NAME_TEXT.
102         MODIFY IT_LOG.
103       ENDIF.
104     ENDLOOP.
105   ENDIF.
106 
107 *  IT_LOG-DDTEXT = '刪除'.
108 *  MODIFY IT_LOG TRANSPORTING DDTEXT WHERE OBJNM = '組件刪除'.
109   SORT IT_LOG BY CHDAT DESCENDING CHTIM DESCENDING CHNUM ASCENDING.
110 
111 ENDFORM.                    "SUB_MAIN
112 
113 
114 *&--------------------------------------------------------------------*
115 *&      Form  FRM_DISPLAY_ALV
116 *&--------------------------------------------------------------------*
117 *       輸出
118 *---------------------------------------------------------------------*
119 FORM FRM_DISPLAY_ALV.
120 
121   DATA: GT_FIELDCAT   TYPE  SLIS_T_FIELDCAT_ALV WITH HEADER LINE,      "ALV列屬性
122         GT_LAYOUT     TYPE  SLIS_LAYOUT_ALV,                           "ALV布局設置
123         ALV_TITLE     TYPE  LVC_TITLE.                                 "ALV表頭
124 
125   GT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.    "ALV布局設置為自動優化列寬
126   GT_LAYOUT-ZEBRA = 'X'.
127 
128   DEFINE GT_TITLE .
129     GT_FIELDCAT-FIELDNAME   = '&1'.  "字段ID
130     GT_FIELDCAT-JUST        = '&2'.  "對齊方式
131     GT_FIELDCAT-EMPHASIZE   =  &3 .  "列顏色
132 *    GT_FIELDCAT-NO_ZERO     =  &4 .  "不輸出前置0
133     GT_FIELDCAT-KEY         =  &4 .
134     GT_FIELDCAT-NO_OUT      =  &5 .  "不輸出標識
135     GT_FIELDCAT-SELTEXT_L   = '&6'.  "字段描述
136 
137     APPEND GT_FIELDCAT.
138     CLEAR  GT_FIELDCAT.
139   END-OF-DEFINITION.
140 
141   GT_TITLE:
142           AUFNR C '    '  'X' ''  生產訂單號,
143           CHDAT C '    '  'X'  ''  操作日期,
144           CHTIM C '    '  'X'  ''  操作時間,
145           CHTYP C 'C600'  ''  'X' 更新標志,
146           DDTEXT  C '  '  'X'  ''  操作類型,
147           CHNUM C 'C410'  'X'  ''  流水編號,
148           CHUSR C 'C300'  ''  ''  SAP用戶名,
149           NAME_TEXT C ''  ''  ''  姓名,
150           CHIPA L '    '  ''  ''  客戶端IP地址,
151           CHHST L '    '  ''  ''  客戶端主機名,
152           OBJTP L 'C300'  ''  ''  操作對象類別,
153           OBJNM L 'C300'  ''  ''  操作對象,
154           OBJLU L '    '  ''  ''  行標記(唯一),
155           OBJLA L '    '  ''  ''  行標記(輔助),
156           VLOLD L 'C300'  ''  ''  操作對象原值,
157           VLNEW L 'C500'  ''  ''  操作對象新值,
158           VLNE2 L 'C500'  ''  ''  操作對象新值(補充),
159           TCODE C 'C300'  ''  ''  事務代碼.
160 
161   DESCRIBE TABLE IT_LOG[] LINES ALV_TITLE.
162   CONDENSE ALV_TITLE NO-GAPS.
163 
164   CONCATENATE '生產訂單變更日志' '(' ALV_TITLE 'ROWS  )' INTO ALV_TITLE
165                                                         SEPARATED BY SPACE.
166 
167   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
168     EXPORTING
169       I_CALLBACK_PROGRAM = SY-REPID
170       I_CALLBACK_PF_STATUS_SET   = 'FRM_STATUS_SET'
171       IT_FIELDCAT        = GT_FIELDCAT[]
172       IS_LAYOUT          = GT_LAYOUT
173       I_SAVE             = 'A'
174       I_GRID_TITLE       = ALV_TITLE          "表頭信息
175     TABLES
176       T_OUTTAB           = IT_LOG
177     EXCEPTIONS
178       PROGRAM_ERROR      = 1
179       OTHERS             = 2.
180 
181   IF SY-SUBRC <> 0.
182     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
183             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
184   ENDIF.
185 
186 ENDFORM.                    " DISPLAY
187 *&---------------------------------------------------------------------*
188 *&      FORM  FRM_STATUS_SET
189 *&---------------------------------------------------------------------*
190 *       TEXT
191 *----------------------------------------------------------------------*
192 *  -->  P1        TEXT
193 *  <--  P2        TEXT
194 *----------------------------------------------------------------------*
195 FORM FRM_STATUS_SET USING  EXTAB TYPE SLIS_T_EXTAB.
196 
197   SET PF-STATUS 'ZPPR0052_GS'.
198 ENDFORM.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM