SAP CO02 User exit

本博客详细介绍了如何增强生产订单系统,通过记录关键参数修改的日志,包括订单抬头、组件、工序等信息的变化,并实现了日志的存储、查询和展示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

*&---------------------------------------------------------------------*
*&  Include           ZXCOZRU01
*&---------------------------------------------------------------------*
* 05/11/2013   Lisa_wong  Enhancement for order release, add ECN to Z table

DATA: T_ZTCFK LIKE TABLE OF ZTCFK WITH HEADER LINE.


SELECT *
  
INTO TABLE T_ZTCFK
  
FROM ZTCFK FOR ALL ENTRIES IN IT_RESBD
 
WHERE ZTCFK~AENNR IT_RESBD-AENNR.
*  AND IT_RESBD-BDMNG > 0.

 
IF T_ZTCFK[] IS INITIAL.
   
LOOP AT IT_RESBD.

   
ENDLOOP.

 
ENDIF.

 

 

*&---------------------------------------------------------------------*
*&  Include           ZXCO1U23
*&---------------------------------------------------------------------*
* Add control to production order changed Add by Lisa wong 02/05/2013
* Order type = PPX1,if status is released,not allowed to change component
* Order type <> PPX1, require qty could not smaller than withdraw qty

check sy-uname+(1) = 'M'.
IF SY-BINPT ''.             "Skip BDC program
  
IF IS_HEADER-AUART+3(1) = '1'.
    
IF NOT IS_HEADER-FTRMI IS INITIAL.
      
MESSAGE E007(BSWITH 'Released order' 'change'.
      
RAISE NO_CHANGES_ALLOWED.
    
ENDIF.
  
ENDIF.
  
IF IS_COMPONENT-BDMNG < IS_COMPONENT-ENMNG.
    
MESSAGE E752(CNWITH IS_COMPONENT-MATNR IS_COMPONENT-BDMNG IS_COMPONENT-ENMNG.
    
RAISE NO_CHANGES_ALLOWED.
  
ENDIF.
ENDIF.

 

 

1、增强出口:

Exit name  PPCO0001(开发应用程序: PP订单)

Exit functionEXIT_SAPLCOBT_001

 

2、双击出口函数EXIT_SAPLCOBT_001中的INCLUDE程序名:ZXCO1U01,写入增强的代码源码如下记得都要激活哦):

*&---------------------------------------------------------------------*

*&  包括              ZXCO1U01                                        *

*&---------------------------------------------------------------------*

 

*++++++++++++++++++++++++++++++++++++++++++++++

* 增强1:记录修改生产订单中关键字段的日志

*++++++++++++++++++++++++++++++++++++++++++++++

 

*========================================

* 当为生产订单时才继续执行

*========================================

 CHECK HEADER_TABLE-AUTYP = '10'.  "订单类别:10-PP生产订单

 

*========================================

* 当不是创建时才继续执行

*========================================

 CHECK HEADER_TABLE-VBKZ <> 'I'.   "抬头更新标识:I-新增

 

*---------------

* 数据定义

*---------------

 DATA: IT_LOG LIKE ZCO02_LOG_TABLE 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.

 

*==================================

* 订单抬头修改

*==================================

 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 XLOEK 订单组件项目删除  预留项目号 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-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 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 ZCO02_LOG_TABLE FROM TABLE IT_LOG ACCEPTING DUPLICATE KEYS.  "忽略索引相同的记录

 

 ENDIF.


 

3、增强将日志存入了自定义的一张表ZCO02_LOG_TABLE中,所以还要创建表(记得激活),表结构如下:

以下为可直接拷贝的:

Table nameZCO02_LOG_TABLE

 

MANDT  MANDT  CLNT     3     0     集团

AUFNR   AUFNR   CHAR     12    0     订单编码

OPDAT          DATS      8     0     操作日期(服务器)

OPTIM          TIMS      6     0     操作时间(服务器)

OPNUM         NUMC    5     0     操作流水编号(本次)

OPTYP   VBKZ      CHAR     1     0     更新标志

OBJTP           CHAR     20    0     操作对象类别描述

OBJNM          CHAR     50    0     操作对象描述

OBJLU           CHAR     50    0     操作对象行标记(唯一)

OBJLA           CHAR     50    0     操作对象行标记(辅助)

VLOLD          CHAR     128  0     操作对象原值

VLNEW         CHAR     128  0     操作对象新值

VLNE2           CHAR     128  0     操作对象新值(补充)

TCODE   TCODE   CHAR     20    0     事务代码

OPUSR          CHAR     12    0     操作SAP用户名

OPIPA           CHAR     15    0     操作客户端IP地址

OPHOS          CHAR     20    0     操作客户端主机名

 

4、这样就可以记录日志了,最后为了好看又写了一个查询报表(不想要的就直接用SE16查询):

 

代码如下:

*&---------------------------------------------------------------------*

*& Report  ZR_PP_103                                                   *

*&                                                                     *

*&---------------------------------------------------------------------*

*&                                                                     *

*&                                                                     *

*&---------------------------------------------------------------------*

*&  申请部门:XXXX

*&  作    者:小马哥

*&  时    间:2012-08-01

*&  功能描述:生产订单关键参数修改日志查询

*&  适用范围:无限制

*&  备    注:

*&---------------------------------------------------------------------*

*&  修改记录:

*&  修改序号   修改时间   修改人   修改原因    修改内容

*&

*&

*&

*&

*&---------------------------------------------------------------------*

 

REPORT  ZR_PP_103.

 

TYPE-POOLS: SLIS.

TABLES: AFKO,USR02,ZCO02_LOG_TABLE.

 

TYPES: BEGIN OF LINE_LOG.  "输出日志的结构

        INCLUDE STRUCTURE ZCO02_LOG_TABLE.   "包含结构ZCO02_LOG_TABLE

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 ZCO02_LOG_TABLE-OPTYP,

  R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP,

  R_OPIPA FOR ZCO02_LOG_TABLE-OPIPA,

  R_OPHOS FOR ZCO02_LOG_TABLE-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 ZCO02_LOG_TABLE LEFT JOIN DD07T ON ZCO02_LOG_TABLE~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

 

 

 

<think>好的,我现在需要帮助用户解决关于SAP CO01事务代码的增强点或相关自定义功能的开发指南问题。首先,我需要回忆一下SAP中增强点的相关知识,特别是与生产订单创建相关的CO01事务。 用户提到的是CO01,也就是创建生产订单的事务。在SAP中,增强通常可以通过User Exit、BAdI、Enhancement Framework等方式实现。我需要确定CO01中有哪些可用的增强点。 首先,User Exit是传统的增强方式,可能存在于标准程序的预留子程序中。例如,在SAPMV45A这样的程序中查找以USEREXIT_开头的子程序。对于生产订单,可能涉及的程序是SAPLCOR1或类似的模块池程序。需要确认CO01使用的程序,然后查找其中的用户出口。 接下来,BAdI(Business Add-In)是更现代的增强方式。CO01可能使用相关的BAdI,比如PPCO_ORDER或WORKORDER_UPDATE。用户可能需要查找这些BAdI的实现,但需要检查SPRO中的配置路径,看看是否有相关的增强点。 另外,Enhancement Framework中的隐式和显式增强点也是一个方向。使用SE18或SE19可以查看是否有可用的BAdI。例如,生产订单保存时可能有保存前的增强点,比如PPCO0002或类似的BAdI。 屏幕增强也是一个可能的需求,用户可能想在CO01的界面中添加自定义字段。这可以通过屏幕增强工具,如APPEND结构或使用Enhancement Framework在指定屏幕添加字段,然后通过出口将数据保存到自定义表中。 此外,出口函数模块也可能存在。例如,在保存生产订单时,系统可能会调用某个函数模块,如CO_ORDER_POST或类似,这些函数模块可能有预留的出口,比如EXIT_函数。 需要注意的是,SAP不同版本可能会有不同的增强点,因此用户需要根据其系统版本检查具体可用的BAdI和User Exit。同时,开发自定义功能时,需要创建实现类或函数组,然后激活增强,并在测试环境中验证。 在开发过程中,用户可能需要使用事务代码如CMOD或SMOD创建增强项目,或者使用SE19创建BAdI实现。屏幕增强可能需要使用屏幕绘制器进行修改,并确保字段与数据元素的绑定正确。 最后,建议用户参考SAP官方文档和开发指南,特别是关于生产订单模块的部分,以及相关的增强技术文档。测试时,应先在开发系统进行,避免影响生产环境。 现在需要整理这些思路,分点说明不同的增强方式,具体步骤,以及注意事项,并生成相关问题。</think>### SAP CO01事务增强开发指南 针对SAP标准事务CO01(创建生产订单)的增强开发,可通过以下方式实现功能扩展: #### 一、增强点定位与实现方式 1. **用户出口(User Exits)** - 查找模块池程序`SAPLCOR1`中的预留子程序(以`USEREXIT_`开头) - 示例出口: ```abap USEREXIT_SAVE_DOCUMENT_PREPARE " 生产订单保存前处理 USEREXIT_NUMBER_RANGE " 编号范围增强 ``` - 实现步骤:通过事务码`SE38`查找程序→定位出口→在`Z`开头自定义包含程序中编码[^1] 2. **BAdI增强** - 关键BAdI: - `PPCO_ORDER`:生产订单创建/修改时触发 - `WORKORDER_UPDATE`:订单更新增强 - `PPCO_AFTER_SAVE`:订单保存后处理 - 实现步骤: ```abap 事务码SE19→创建BAdI实现→绑定到对应增强点 ``` 3. **隐式增强点** - 使用Enhancement Framework定位标准程序增强位置: ```abap 事务码SE80→打开程序SAPLCOR1→右键选择"增强" ``` #### 二、屏幕增强示例 1. **添加自定义字段** - 创建APPEND结构`CI_COKO`添加字段 - 使用增强点`COKO_SCREEN_ADD_FIELDS`激活屏幕元素 - 数据存储:通过表增强(如`AFPO`附加结构) 2. **字段校验逻辑** ```abap METHOD if_ex_workorder_update~check_before_save. IF order_operation-z_cust_field IS INITIAL. MESSAGE e888(abap) WITH '自定义字段必须填写'. ENDIF. ENDMETHOD. ``` #### 三、开发流程规范 1. 对象命名规则: - BAdI实现:`ZIM_XX_CO01_XX` - 增强项目:`ZCO01_ENH_XX` 2. 版本管理: - 通过传输请求号记录变更 3. 调试技巧: - 使用`/H`调试模式→在出口函数设置断点 #### 四、注意事项 1. 兼容性检查: - 确认增强点是否在SAP ECC 6.0以上版本有效 2. 性能影响: - 避免在保存增强中执行耗时操作 3. 权限控制: - 使用`AUTHORITY-CHECK`语句添加权限验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值