SAP增强点

VA01

增强点:MV45AFZZ      (包含文件,SE38直接搜就行)

点击“保存”后的事件,写在子例程USEREXIT_SAVE_DOCUMENT之中。

VL01N

对“过账发货”进行限制,当没有审核,就不能“过账发货”,这里用到了第三代增强,SE19创建典型业务加载项

只需要用到一种方法CHANGE_INPUT_HEADER_AND_ITEMS

双击该方法,进行编辑代码

  METHOD if_ex_le_shp_goodsmovement~change_input_header_and_items.
    LOOP AT it_xlips INTO DATA(gs_xlips).
      SELECT SINGLE vkorg INTO @DATA(lv_vbak) FROM vbak
        WHERE vbeln = @gs_xlips-vbeln.
      "只有4600、4700、4800的销售组织才需限制
      IF lv_vbak = '4600' OR lv_vbak = '4700' OR lv_vbak = '4800'.
        SELECT SINGLE status INTO @DATA(gs_status) FROM ztmm084b
          WHERE vbeln = @gs_xlips-vbeln.
        "status为OA返回的审核状态,A通过,B驳回,C已下发
        IF gs_status <> 'A'.
          MESSAGE'未经过OA审批,不允许过账!' TYPE 'E'.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

CO02

工单变更,需用到第二代增强 CMOD ,创建增强的项目,添加组件

双击那个功能出口,再点击其包含文件ZXCO1U01,就可添加代码

*++++++++++++++++++++++++++++++++++++++++++++++
* 增强1:记录修改生产订单中关键字段的日志
*++++++++++++++++++++++++++++++++++++++++++++++
IF header_table-plauf <> header_table_old-plauf OR header_table-aufld <> header_table_old-aufld.
ELSE.
  READ TABLE status_table INTO DATA(ls_table) WITH KEY stat = 'I0045'.
  READ TABLE status_table_old INTO DATA(ls_table_old) WITH KEY stat = 'I0045'.
  IF ls_table-inact <> ls_table_old-inact.
  ELSE.
    IF ls_table_old IS NOT INITIAL OR ls_table IS INITIAL.
*========================================
* 当为生产订单时才继续执行
*========================================
      CHECK header_table-autyp = '10'.  "订单类别:10-PP生产订单

*========================================
* 当不是创建时才继续执行
*========================================
      CHECK header_table-vbkz <> 'I'.   "抬头更新标识:I-新增

*---------------
* 数据定义
*---------------
      DATA: it_log LIKE zpco02 OCCURS 0 WITH HEADER LINE.   "日志内表

      DATA: ipx      LIKE msxxlist-hostadr,  "IP地址(16进制)
            ip(15)   TYPE c,                 "IP地址(10进制字符串)
            host(20) TYPE c.                 "主机名

      DATA: vi_opnum(5) TYPE n,   "流水码变量
            vs_str      TYPE string.   "字符串变量

      DATA: v_arbpl_old LIKE crhd-arbpl,  "工作中心(旧值)
            v_arbpl_new LIKE crhd-arbpl.  "工作中心(新值)

*========================================
* 定义去除字符串中小数点后无用的0
*(只适用于带小数点的数字字符串)
*========================================
      DEFINE del_zero_r.

        SHIFT &1 RIGHT DELETING TRAILING  '0 '.                  "去掉末尾0
        SHIFT &1 RIGHT DELETING TRAILING  '. '.                  "若小数位全是0,则去掉小数点,只保存整数位
        CONDENSE &1 NO-GAPS.

      END-OF-DEFINITION.

*========================================
* 定义记录修改的宏(对单行表)
*========================================
      DEFINE ulog_line.
*  ---------------------------------------------------
*  &1:记录新值的表名称
*  &2:记录旧值的表名称与新表的差异部分(通常为OLD)
*  &3:比较的字段名称
*  &4:操作对象类型
*  &5:操作对象描述
*  ---------------------------------------------------
        IF &1-&3 <> &1_&2-&3.
          VI_OPNUM     = VI_OPNUM + 1. "记录本次操作的流水编码(自增1)
          IT_LOG-OPNUM = VI_OPNUM.     "记录本次操作的流水编码

          IT_LOG-OPTYP = 'U'.          "操作类型:U-更新
          IT_LOG-OBJTP = '&4'.         "操作对象类型(抬头、组件、工艺等)
          IT_LOG-OBJNM = '&5'.         "操作对象描述
          IT_LOG-VLOLD = &1_&2-&3.     "操作对象的旧值
          IT_LOG-VLNEW = &1-&3.        "操作对象的新值

          APPEND IT_LOG.               "追加记录
          CLEAR IT_LOG.
        ENDIF.

      END-OF-DEFINITION.

*===========================================
* 定义记录修改的宏(对多行表,需要记录行号)
*===========================================
      DEFINE ulog_itab.
*  ---------------------------------------------------
*  &1:记录新值的内表名称
*  &2:记录旧值的内表名称与新表的差异部分(通常为OLD)
*  &3:比较的字段名称
*  &4:操作对象类型
*  &5:操作对象描述
*  &6:操作对象唯一行标记描述
*  &7:操作对象唯一行标记字段名
*  &8:操作对象辅助行标记描述
*  &9:操作对象辅助行标记字段名
*  ---------------------------------------------------
        IF &1-&3 <> &1_&2-&3.
          VI_OPNUM     = VI_OPNUM + 1. "记录本次操作的流水编码(自增1)
          IT_LOG-OPNUM = VI_OPNUM.     "记录本次操作的流水编码

          IT_LOG-OPTYP = 'U'.          "操作类型:U-更新
          IT_LOG-OBJTP = '&4'.         "操作对象类型(抬头、组件、工艺等)
          IT_LOG-OBJNM = '&5'.         "操作对象描述

*    -------------------------------------------
*    操作对象唯一行标记,例如:预留项目号(1)
*    唯一行标记一般前台不可见,但唯一且不可更改
*    -------------------------------------------
          IT_LOG-OBJLU = &1-&7.        "操作对象唯一行标记的值(例如:0001)
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
            EXPORTING
              INPUT  = IT_LOG-OBJLU
            IMPORTING
              OUTPUT = IT_LOG-OBJLU.                             "去除前置0
          CONCATENATE '&6' '(' IT_LOG-OBJLU ')' INTO IT_LOG-OBJLU.  "拼写描述

*    -------------------------------------------
*    操作对象辅助行标记,例如:BOM项目号(0010)
*    辅助行标记一般不唯一或可修改,但最常用
*    -------------------------------------------
          IT_LOG-OBJLA = &1-&9.        "操作对象辅助行标记的值(例如:0010)
          CONCATENATE '&8' '(' IT_LOG-OBJLA ')' INTO IT_LOG-OBJLA.  "拼写描述

          IT_LOG-VLOLD = &1_&2-&3.     "操作对象的旧值
          IT_LOG-VLNEW = &1-&3.        "操作对象的新值

          APPEND IT_LOG.               "追加记录
          CLEAR IT_LOG.
        ENDIF.

      END-OF-DEFINITION.

      "-----------------------------------------------------------20170905  zhangyong
      DEFINE ulog_itab1.
*  ---------------------------------------------------
*  &1:记录新值的内表名称
*  &2:记录旧值的内表名称与新表的差异部分(通常为OLD)
*  &3:比较的字段名称
*  &4:操作对象类型
*  &5:操作对象描述
*  &6:操作对象唯一行标记描述
*  &7:操作对象唯一行标记字段名
*  &8:操作对象辅助行标记描述
*  &9:操作对象辅助行标记字段名
*  ---------------------------------------------------
        "COMPONENT_TABLE OLD MATNR 订单组件 项目删除  预留项目号 RSPOS BOM项目号 POSNR.
*   IF &1-&3 <> &1_&2-&3.
        VI_OPNUM     = VI_OPNUM + 1. "记录本次操作的流水编码(自增1)
        IT_LOG-OPNUM = VI_OPNUM.     "记录本次操作的流水编码

        IT_LOG-OPTYP = 'D'.          "操作类型:U-更新
        IT_LOG-OBJTP = '&4'.         "操作对象类型(抬头、组件、工艺等)
        IT_LOG-OBJNM = '&5'.         "操作对象描述

*    -------------------------------------------
*    操作对象唯一行标记,例如:预留项目号(1)
*    唯一行标记一般前台不可见,但唯一且不可更改
*    -------------------------------------------
        IT_LOG-OBJLU = &1-&7.        "操作对象唯一行标记的值(例如:0001)
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            INPUT  = IT_LOG-OBJLU
          IMPORTING
            OUTPUT = IT_LOG-OBJLU.                             "去除前置0
        CONCATENATE '&6' '(' IT_LOG-OBJLU ')' INTO IT_LOG-OBJLU.  "拼写描述

*    -------------------------------------------
*    操作对象辅助行标记,例如:BOM项目号(0010)
*    辅助行标记一般不唯一或可修改,但最常用
*    -------------------------------------------
        IT_LOG-OBJLA = &1-&9.        "操作对象辅助行标记的值(例如:0010)
        CONCATENATE '&8' '(' IT_LOG-OBJLA ')' INTO IT_LOG-OBJLA.  "拼写描述

        IT_LOG-VLOLD = &1_&2-&3.     "操作对象的旧值
        IT_LOG-VLNEW = &1-&3.        "操作对象的新值
        CONCATENATE '物料号:'  IT_LOG-VLNEW  '被删除' into IT_LOG-VLNEW.
        APPEND IT_LOG.               "追加记录
        CLEAR IT_LOG.
*   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'.

            vi_opnum     = vi_opnum + 1. "记录本次操作的流水编码(自增1)
            it_log-opnum = vi_opnum.     "记录本次操作的流水编码

            it_log-optyp = 'I'.                    "操作类型:I-新增
            it_log-objtp = '订单组件'.             "操作对象类型(抬头、组件、工艺等)
            it_log-objnm = '订单组件(整行)'.       "操作对象描述

*      -------------------------------------------
*      操作对象唯一行标记,例如:预留项目号(1)
*      唯一行标记一般前台不可见,但唯一且不可更改
*      -------------------------------------------
            it_log-objlu = component_table-rspos.        "预留项目号(例如:0001)
            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
              EXPORTING
                input  = it_log-objlu
              IMPORTING
                output = it_log-objlu.                           "去除前置0
            CONCATENATE '预留项目号(' it_log-objlu ')' INTO it_log-objlu.  "拼写描述

*      -------------------------------------------
*      操作对象辅助行标记,例如:BOM项目号(0010)
*      辅助行标记一般不唯一或可修改,但最常用
*      -------------------------------------------
            it_log-objla = component_table-posnr.        "BOM项目号(例如:0010)
            CONCATENATE 'BOM项目号(' it_log-objla ')' INTO it_log-objla.  "拼写描述

*      ------------------------------------------
*      将新增组件的所有信息组合为一行存入NEW字段
*      ------------------------------------------
            vs_str = component_table-erfmg.
            del_zero_r vs_str.
            CONCATENATE '物料号:' component_table-matnr
                        ',需求数量:' vs_str '(' component_table-erfme ')'
                        ',工厂:' component_table-werks INTO it_log-vlnew.

            IF NOT component_table-lgort IS INITIAL.
              CONCATENATE it_log-vlnew ',库存地点:' component_table-lgort INTO it_log-vlnew.
            ENDIF.

            IF NOT component_table-rgekz IS INITIAL.
              CONCATENATE it_log-vlnew ',反冲:' component_table-rgekz INTO it_log-vlnew.
            ENDIF.

            APPEND it_log.               "追加记录
            CLEAR it_log.

*    ---------------------------
*    记录组件的修改日志
*    ---------------------------
          WHEN 'U'.
*      --------------------------------
*      根据预留及项目查询更改前的信息
*      --------------------------------
            READ TABLE component_table_old
            WITH KEY rsnum = component_table-rsnum
                     rspos = component_table-rspos.

            CHECK sy-subrc = 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 kzear 订单组件 最后发货  预留项目号 rspos bom项目号 posnr,



                      component_table old xloek 订单组件 已删除  预留项目号 rspos bom项目号 posnr.


          WHEN  'D'.
            READ TABLE component_table_old
            WITH KEY   rsnum = component_table-rsnum
                       rspos = component_table-rspos.

            CHECK sy-subrc = 0.
            ulog_itab1: component_table old matnr 订单组件 项目删除  预留项目号 rspos bom项目号 posnr.

        ENDCASE.

      ENDLOOP.


*========================================
* 订单工序更改
*========================================
      LOOP AT operation_table WHERE NOT vbkz IS INITIAL.

        CASE operation_table-vbkz.
*    ---------------------------
*    记录工序的新增日志
*    ---------------------------
          WHEN 'I'.

            vi_opnum     = vi_opnum + 1. "记录本次操作的流水编码(自增1)
            it_log-opnum = vi_opnum.     "记录本次操作的流水编码

            it_log-optyp = 'I'.                     "操作类型:I-新增
            it_log-objtp = '订单工序'.              "操作对象类型(抬头、组件、工艺等)
            it_log-objnm = '订单工序(整行)'.        "操作对象描述

*      -------------------------------------------
*      操作对象唯一行标记,例如:预留项目号(1)
*      唯一行标记一般前台不可见,但唯一且不可更改
*      -------------------------------------------
            it_log-objlu = operation_table-aplzl.        "工序计数器(例如:00000001)
            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
              EXPORTING
                input  = it_log-objlu
              IMPORTING
                output = it_log-objlu.                           "去除前置0
            CONCATENATE '工序计数器(' it_log-objlu ')' INTO it_log-objlu.  "拼写描述

*      -------------------------------------------
*      操作对象辅助行标记,例如:BOM项目号(0010)
*      辅助行标记一般不唯一或可修改,但最常用
*      -------------------------------------------
            it_log-objla = operation_table-vornr.        "工序号(例如:0010)
            CONCATENATE '工序号(' it_log-objla ')' INTO it_log-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 it_log-vlnew.
            ENDIF.

            CONCATENATE it_log-vlnew
                        '工厂:' operation_table-werks
                        ',控制码:' operation_table-steus INTO it_log-vlnew.

            IF NOT operation_table-ktsch IS INITIAL.
              CONCATENATE it_log-vlnew ',标准文本码:' operation_table-ktsch INTO it_log-vlnew.
            ENDIF.

            CONCATENATE it_log-vlnew ',工序短文本:' operation_table-ltxa1 INTO it_log-vlnew.

*      ------------------------
*      工时部分存入NEW2字段
*      ------------------------
            IF NOT operation_table-vgw01 IS INITIAL.
              vs_str = operation_table-vgw01.
              del_zero_r vs_str.
              CONCATENATE it_log-vlne2 ',准备工时:' vs_str '(' operation_table-vge01 ')' INTO it_log-vlne2.
            ENDIF.

            IF NOT operation_table-vgw02 IS INITIAL.
              vs_str = operation_table-vgw02.
              del_zero_r vs_str.
              CONCATENATE it_log-vlne2 ',机器工时:' vs_str '(' operation_table-vge02 ')' INTO it_log-vlne2.
            ENDIF.

            IF NOT operation_table-vgw03 IS INITIAL.
              vs_str = operation_table-vgw03.
              del_zero_r vs_str.
              CONCATENATE it_log-vlne2 ',人工工时:' vs_str '(' operation_table-vge03 ')' INTO it_log-vlne2.
            ENDIF.

            IF NOT operation_table-preis IS INITIAL.
              vs_str = operation_table-lifnr.
              CONCATENATE it_log-vlne2 ',厂商:' vs_str '(' operation_table-lifnr ')/' INTO it_log-vlne2.
            ENDIF.

            IF NOT operation_table-preis IS INITIAL.
              vs_str = operation_table-preis.
              CONCATENATE it_log-vlne2 ',外协价格:' vs_str '(' operation_table-waers ')/' INTO it_log-vlne2.
              vs_str = operation_table-peinh.
              CONCATENATE it_log-vlne2 vs_str '(' operation_table-meinh ')' INTO it_log-vlne2.
            ENDIF.

            SHIFT it_log-vlne2 LEFT DELETING LEADING ','.
            CONDENSE it_log-vlne2 NO-GAPS.

            APPEND it_log.               "追加记录
            CLEAR it_log.

*    ---------------------------
*    记录工序的修改日志
*    ---------------------------
          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 lifnr 订单工序 厂商             工序计数器 aplzl 工序号 vornr,
                         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)
                  it_log-opnum = vi_opnum.     "记录本次操作的流水编码

                  it_log-optyp = 'U'.          "操作类型:U-更新
                  it_log-objtp = '订单工序'.   "操作对象类型(抬头、组件、工艺等)
                  it_log-objnm = '工作中心'.   "操作对象描述

*            -------------------------------------------
*            操作对象唯一行标记,例如:预留项目号(1)
*            唯一行标记一般前台不可见,但唯一且不可更改
*            -------------------------------------------
                  it_log-objlu = operation_table-aplzl.        "工序计数器(例如:00000001)
                  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
                    EXPORTING
                      input  = it_log-objlu
                    IMPORTING
                      output = it_log-objlu.                     "去除前置0
                  CONCATENATE '工序计数器(' it_log-objlu ')' INTO it_log-objlu.  "拼写描述

*            -------------------------------------------
*            操作对象辅助行标记,例如:BOM项目号(0010)
*            辅助行标记一般不唯一或可修改,但最常用
*            -------------------------------------------
                  it_log-objla = operation_table-vornr.        "工序号(例如:0010)
                  CONCATENATE '工序号(' it_log-objla ')' INTO it_log-objla.  "拼写描述

                  it_log-vlold = v_arbpl_old.             "操作对象的旧值
                  it_log-vlnew = v_arbpl_new.             "操作对象的新值

                  APPEND it_log.     "追加记录
                  CLEAR it_log.
                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.

        ENDCASE.

      ENDLOOP.

*=======================================
* 如有修改日志产生时才进行记录
*=======================================
      IF NOT it_log[] 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.   "获取最新的时间

        it_log-aufnr  = header_table-aufnr.  "订单编码
        it_log-opdat  = sy-datum.            "操作日期(服务器)
        it_log-optim  = sy-uzeit.            "操作时间(服务器)
        it_log-tcode  = sy-tcode.            "事务代码
        it_log-opusr  = sy-uname.            "操作客户端用户名
        it_log-opipa  = ip.                  "操作客户端IP地址
        it_log-ophos  = host.                "操作客户端主机名

        MODIFY it_log TRANSPORTING aufnr opdat optim tcode opusr opipa ophos
                                   WHERE aufnr IS INITIAL.   "全部更新

*  ---------------------------
*  将日志保存至数据库
*  ---------------------------
        INSERT zpco02 FROM TABLE it_log ACCEPTING DUPLICATE KEYS.  "忽略索引相同的记录

      ENDIF.
    ENDIF.
  ENDIF.
ENDIF.

可以再写个报表程序来方便用户了解工单组件的变更情况

REPORT ZPPR018.

TYPE-POOLS: SLIS.
TABLES: AFKO,USR02,ZPCO02.

TYPES: BEGIN OF LINE_LOG.  "输出日志的结构
        INCLUDE STRUCTURE ZPCO02.   "包含结构ZPCO02
TYPES:  DDTEXT LIKE DD07T-DDTEXT,                  "更新类型描述
       END OF LINE_LOG.

DATA IT_LOG TYPE STANDARD TABLE OF LINE_LOG WITH HEADER LINE.


*&---------------------------------------------------------------------*
*                        ALV全局定义及设置
*&---------------------------------------------------------------------*

DATA: GT_FIELDCAT   TYPE  SLIS_T_FIELDCAT_ALV WITH HEADER LINE,      "ALV列属性
      GT_LAYOUT     TYPE  SLIS_LAYOUT_ALV,                           "ALV布局设置
      ALV_TITLE     TYPE  LVC_TITLE.                                 "ALV表头

GT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.    "ALV布局设置为自动优化列宽

DEFINE GT_TITLE .
  GT_FIELDCAT-FIELDNAME   = '&1'.  "字段ID
  GT_FIELDCAT-JUST        = '&2'.  "对齐方式
  GT_FIELDCAT-EMPHASIZE   =  &3 .  "列颜色
  GT_FIELDCAT-NO_ZERO     =  &4 .  "不输出前置0
  GT_FIELDCAT-NO_OUT      =  &5 .  "不输出标识
  GT_FIELDCAT-SELTEXT_L   = '&6'.  "字段描述

  APPEND GT_FIELDCAT.
  CLEAR  GT_FIELDCAT.
END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*                       FORM ALV_DISPLAY
*&---------------------------------------------------------------------*
* 功能:简化ALV调用
* 作者:小马哥
* 时间:2010-08-18
*&---------------------------------------------------------------------*
FORM ALV_DISPLAY TABLES OUTTAB
                 USING GRID_TITLE TYPE LVC_TITLE.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IT_FIELDCAT        = GT_FIELDCAT[]
      IS_LAYOUT          = GT_LAYOUT
      I_SAVE             = 'A'
      I_GRID_TITLE       = GRID_TITLE           "表头信息
    TABLES
      T_OUTTAB           = OUTTAB
    EXCEPTIONS
      PROGRAM_ERROR      = 1
      OTHERS             = 2.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    "ALV_DISPLAY


************************************************************************
* SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK FLAG1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
  R_AUFNR FOR AFKO-AUFNR OBLIGATORY MEMORY ID ANR,
  R_OPDAT FOR SY-DATUM,
  R_OPTIM FOR SY-UZEIT,
  R_OPTYP FOR ZPCO02-OPTYP,
  R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP,
  R_OPIPA FOR ZPCO02-OPIPA,
  R_OPHOS FOR ZPCO02-OPHOS.
SELECTION-SCREEN END OF BLOCK FLAG1.

************************************************************************
* Initialization
************************************************************************
INITIALIZATION.

************************************************************************
* AT SELECTION-SCREEN
************************************************************************
AT SELECTION-SCREEN.
  PERFORM SUB_CHECKINPUT.

************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
  PERFORM SUB_MAIN.

************************************************************************
* END-OF-SELECTION
************************************************************************
END-OF-SELECTION.
  PERFORM DISPLAY_ALV.



*&--------------------------------------------------------------------*
*&      Form  SUB_MAIN
*&--------------------------------------------------------------------*
*       主程序
*---------------------------------------------------------------------*
FORM SUB_MAIN.

* ===============
* 查询日志表
* ===============
  SELECT *
    FROM ZPCO02 LEFT JOIN DD07T ON ZPCO02~OPTYP = DD07T~DOMVALUE_L AND
                                            DD07T~DDLANGUAGE = SY-LANGU              AND
                                            DD07T~AS4LOCAL = 'A'                     AND
                                            DD07T~DOMNAME = 'VERBUCHER'
    INTO CORRESPONDING FIELDS OF TABLE IT_LOG
   WHERE AUFNR IN R_AUFNR AND
         OPDAT IN R_OPDAT AND
         OPTIM IN R_OPTIM AND
         OPTYP IN R_OPTYP AND
         OPUSR IN R_OPUSR AND
         OPIPA IN R_OPIPA AND
         OPHOS IN R_OPHOS.

  SORT IT_LOG BY OPDAT OPTIM AUFNR OPNUM.

ENDFORM.                    "SUB_MAIN


*&--------------------------------------------------------------------*
*&      Form  SUB_CHECKINPUT
*&--------------------------------------------------------------------*
*       执行前的检验
*---------------------------------------------------------------------*
FORM SUB_CHECKINPUT .

ENDFORM .                    "SUB_CHECKINPUT



*&--------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&--------------------------------------------------------------------*
*       输出
*---------------------------------------------------------------------*
FORM DISPLAY_ALV.

  GT_TITLE:
          AUFNR    C    'C410'    'X'    ''    生产订单号,
          OPNUM    C    'C410'    ''    'X'    操作流水编号,
          OPDAT    C    'C410'    ''    ''    操作日期,
          OPTIM    C    'C410'    ''    ''    操作时间,
          OPTYP    C    'C600'    ''    'X'    更新标志,
          DDTEXT    C    'C600'    ''    ''    操作类型,
          TCODE    C    'C300'    ''    'X'    事务代码,
          OPUSR    C    'C300'    ''    ''    SAP用户名,
          OPIPA    L    'C300'    ''    ''    客户端IP地址,
          OPHOS    L    'C300'    ''    ''    客户端主机名,
          OBJTP    L    '    '    ''    ''    操作对象类别,
          OBJNM    L    '    '    ''    ''    操作对象,
          OBJLU    L    '    '    ''    ''    行标记(唯一),
          OBJLA    L    '    '    ''    ''    行标记(辅助),
          VLOLD    L    'C700'    ''    ''    操作对象原值,
          VLNEW    L    'C500'    ''    ''    操作对象新值,
          VLNE2    L    'C500'    ''    ''    操作对象新值(补充).


*  CONCATENATE '日志' SPACE INTO ALV_TITLE.
  PERFORM ALV_DISPLAY TABLES IT_LOG USING ALV_TITLE.


ENDFORM.                    " DISPLAY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值