SAP CO02 User exit

58 篇文章 0 订阅

 

*&---------------------------------------------------------------------*
*&  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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值