SAP PP CO02 生产工单修改日志增强

此代码实现了一个SAP增强功能,用于记录和追溯生产订单(工单)的修改历史。当用户在CO01、CO02或COHV事务码下修改工单信息时,系统会通过EXIT_SAPLCOBT_001退出点,收集修改前后的字段值,并将这些信息存储到自定义表ZPPCO02_LOG中。日志包含工厂、工单号、工单行号、工艺路线号、操作日期和时间等关键信息,便于后续的查询和责任追踪。此外,还包括了一个日志查询程序,允许用户根据工厂、物料号、工单号、修改人和修改日期筛选修改记录,并通过ALV显示结果。

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

背景:客户在日常操作中,经常会发现有人修改了工单的信息,为了追溯工单的修改历史,找到责任人,那么工单的修改需要做一个记录,便于查找。 SAP标准的功能并不做记录修改日志,因为会影响效率,涉及的字段太多。但是预留了出口,给客户做客制化的增强。

增强出口: EXIT_SAPLCOBT_001  

INCLUDE:  ZXCO1U01

ZXCO1U01中的内容如下:


DATA:
  L_POSNR               TYPE CO_POSNR,
  L_AUFPL               TYPE ZPPCO02_LOG-AUFPL,
  L_APLZL               TYPE ZPPCO02_LOG-APLZL,
  L_RSNUM               TYPE ZPPCO02_LOG-RSNUM,
  L_RSPOS               TYPE ZPPCO02_LOG-RSPOS,
  L_MATNR               TYPE MATNR,
  L_OPDAT               TYPE ZEL_OPDAT,
  L_OPTIM               TYPE ZEL_OPTIM,
  L_OPNUM               TYPE ZEL_OPNUM,
  LS_ZPPCO02_01         TYPE ZPPCO02_01,
  LT_ZPPCO02_01         TYPE STANDARD TABLE OF ZPPCO02_01,
  L_NAME_TEXT           TYPE AD_NAMTEXT,
  L_PCNAME              TYPE CHAR200,
* 定义结构
  LS_AFKO_NEW           TYPE CAUFVDB,
  LS_AFKO_OLD           TYPE CAUFVDB,
  LS_AFPO_NEW           TYPE AFPOB,
  LS_AFPO_OLD           TYPE AAFPO,
  LS_AFVC_AFVV          TYPE AFVGB,
*  LS_AFVC_OLD                TYPE AAFVC,
*  LS_AFVV_OLD                TYPE AAFVV,
  LS_AFVC_OLD           TYPE AFVC,
  LS_AFVV_OLD           TYPE AFVV,
  LS_RESB_NEW           TYPE RESBB,
  LS_RESB_OLD           TYPE ARESB,
* 定义内表
  L_POSITION_TABLE      TYPE STANDARD TABLE OF AFPOB,
  L_POSITION_TABLE_OLD  TYPE STANDARD TABLE OF AAFPO,
  L_HEADER_TABLE        TYPE STANDARD TABLE OF CAUFVDB,
  L_HEADER_TABLE_OLD    TYPE STANDARD TABLE OF CAUFVDB,
  L_COMPONENT_TABLE     TYPE STANDARD TABLE OF RESBB,
  L_COMPONENT_TABLE_OLD TYPE STANDARD TABLE OF ARESB,
  L_OPERATION_TABLE     TYPE STANDARD TABLE OF AFVGB,
  L_AFVC_TABLE_OLD      TYPE STANDARD TABLE OF AFVC,
  L_AFVV_TABLE_OLD      TYPE STANDARD TABLE OF AFVV,
*  L_OPERATION_TABLE_OLD_AFVC TYPE STANDARD TABLE OF AAFVC,
*  L_OPERATION_TABLE_OLD_AFVV TYPE STANDARD TABLE OF AAFVV,

  LT_ZPPCO02_LOG        TYPE STANDARD TABLE OF ZPPCO02_LOG.

FIELD-SYMBOLS:
  <FS_VAL_NEW> TYPE ANY,
  <FS_VAL_OLD> TYPE ANY.

*CHECK SY-UNAME = 'CHUNHUI' OR SY-UNAME = '90990118' OR SY-UNAME = '90990105'.
CHECK SY-TCODE = 'CO01' OR SY-TCODE = 'CO02' OR SY-TCODE = 'COHV'.
CHECK HEADER_TABLE-AUTYP = '10'.  " 订单类别: 10-PP 生产订单
* Get user IP,Hostname
CALL FUNCTION 'TH_USER_INFO'
  EXPORTING
    CLIENT   = SY-MANDT
    USER     = SY-UNAME
  IMPORTING
    TERMINAL = L_PCNAME.
* 取得用户名称
SELECT SINGLE NAME_TEXT
  INTO L_NAME_TEXT
  FROM V_USERNAME
 WHERE BNAME = SY-UNAME.

* 取得配置的关键字段
SELECT *
  INTO TABLE LT_ZPPCO02_01
  FROM ZPPCO02_01
 WHERE DEL = SPACE.

L_POSITION_TABLE[]      = POSITION_TABLE[].
L_POSITION_TABLE_OLD[]  = POSITION_TABLE_OLD[].
L_HEADER_TABLE[]        = HEADER_TABLE[].
L_HEADER_TABLE_OLD[]    = HEADER_TABLE_OLD[].
L_COMPONENT_TABLE[]     = COMPONENT_TABLE[].
L_COMPONENT_TABLE_OLD[] = COMPONENT_TABLE_OLD[].
L_OPERATION_TABLE[]     = OPERATION_TABLE[].
*L_OPERATION_TABLE_OLD_AFVC[]  = OPERATION_TABLE_OLD_AFVC[].
*L_OPERATION_TABLE_OLD_AFVV[]  = OPERATION_TABLE_OLD_AFVV[].

GET TIME.
L_OPDAT = SY-DATUM.
L_OPTIM = SY-UZEIT.

READ TABLE L_HEADER_TABLE     INTO LS_AFKO_NEW INDEX 1.
READ TABLE L_HEADER_TABLE_OLD INTO LS_AFKO_OLD INDEX 1.
READ TABLE L_POSITION_TABLE     INTO LS_AFPO_NEW INDEX 1.
READ TABLE L_POSITION_TABLE_OLD INTO LS_AFPO_OLD INDEX 1.

IF L_OPERATION_TABLE[] IS NOT INITIAL AND
  LS_AFKO_NEW-VBKZ <> 'I'.
  SELECT *
    INTO TABLE L_AFVC_TABLE_OLD
    FROM AFVC
    FOR ALL ENTRIES IN L_OPERATION_TABLE
   WHERE AUFPL = L_OPERATION_TABLE-AUFPL
     AND APLZL = L_OPERATION_TABLE-APLZL.

  SELECT *
    INTO TABLE L_AFVV_TABLE_OLD
    FROM AFVV
    FOR ALL ENTRIES IN L_OPERATION_TABLE
   WHERE AUFPL = L_OPERATION_TABLE-AUFPL
     AND APLZL = L_OPERATION_TABLE-APLZL.

  SORT L_AFVC_TABLE_OLD BY AUFPL ASCENDING
                           APLZL ASCENDING.
  SORT L_AFVV_TABLE_OLD BY AUFPL ASCENDING
                           APLZL ASCENDING.
ENDIF.

CLEAR L_COMPONENT_TABLE_OLD .
SELECT
  *
  INTO CORRESPONDING FIELDS OF TABLE L_COMPONENT_TABLE_OLD
  FROM RESB
  WHERE AUFNR = HEADER_TABLE-AUFNR .

LOOP AT LT_ZPPCO02_01 INTO LS_ZPPCO02_01.
  CLEAR:
    L_POSNR,
    L_MATNR,
    L_AUFPL,
    L_APLZL,
    L_RSNUM,
    L_RSPOS.

  CASE LS_ZPPCO02_01-TABNAME.
    WHEN 'AFKO' OR 'AUFK'.
      ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFKO_NEW TO <FS_VAL_NEW>.
      ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFKO_OLD TO <FS_VAL_OLD>.
      IF <FS_VAL_NEW> IS ASSIGNED AND
         <FS_VAL_OLD> IS ASSIGNED.
        IF <FS_VAL_NEW> <> <FS_VAL_OLD>.

          PERFORM FRM_EIDT_LOG TABLES LT_ZPPCO02_LOG
                               USING <FS_VAL_NEW>         "新值
                                     <FS_VAL_OLD>         "旧值
                                     LS_AFKO_NEW-WERKS    "工厂
                                     LS_AFKO_NEW-AUFNR    "工单号
                                     L_POSNR              "工单行号
                                     L_AUFPL              "工艺路线号
                                     L_APLZL              "订单的通用计数器
                                     L_RSNUM              "预留/相关需求的编号
                                     L_RSPOS              "预留/相关需求的项目编号
                                     L_MATNR              "物料号
                                     L_OPDAT              "操作日期
                                     L_OPTIM              "操作时间
                                     LS_AFKO_NEW-VBKZ     "更新标志
                                     L_PCNAME
                                     L_NAME_TEXT
                                     LS_ZPPCO02_01
                            CHANGING L_OPNUM.             "操作流水编号
        ENDIF.
        UNASSIGN:
          <FS_VAL_NEW>,
          <FS_VAL_OLD>.
      ENDIF.
    WHEN 'AFPO'.
      ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFPO_NEW TO <FS_VAL_NEW>.
      ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFPO_OLD TO <FS_VAL_OLD>.
      IF <FS_VAL_NEW> IS ASSIGNED AND
         <FS_VAL_OLD> IS ASSIGNED.
        IF <FS_VAL_NEW> <> <FS_VAL_OLD>.
          L_POSNR = LS_AFPO_NEW-POSNR.
          L_MATNR = LS_AFPO_NEW-MATNR.

          PERFORM FRM_EIDT_LOG TABLES LT_ZPPCO02_LOG
                               USING <FS_VAL_NEW>         "新值
                                     <FS_VAL_OLD>         "旧值
                                     LS_AFKO_NEW-WERKS    "工厂
                                     LS_AFKO_NEW-AUFNR    "工单号
                                     L_POSNR              "工单行号
                                     L_AUFPL              "工艺路线号
                                     L_APLZL              "订单的通用计数器
                                     L_RSNUM              "预留/相关需求的编号
                                     L_RSPOS              "预留/相关需求的项目编号
                                     L_MATNR              "物料号
                                     L_OPDAT              "操作日期
                                     L_OPTIM              "操作时间
                                     LS_AFKO_NEW-VBKZ     "更新标志
                                     L_PCNAME
                                     L_NAME_TEXT
                                     LS_ZPPCO02_01
                            CHANGING L_OPNUM.             "操作流水编号
        ENDIF.
        UNASSIGN:
          <FS_VAL_NEW>,
          <FS_VAL_OLD>.
      ENDIF.
    WHEN 'AFVC' OR 'AFVV'.
      LOOP AT L_OPERATION_TABLE INTO LS_AFVC_AFVV.
        CLEAR:
          LS_AFVC_OLD,
          LS_AFVV_OLD.

        ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFVC_AFVV TO <FS_VAL_NEW>.
        IF LS_ZPPCO02_01-TABNAME = 'AFVC'.
*          READ TABLE L_OPERATION_TABLE_OLD_AFVC INTO LS_AFVC_OLD
*            WITH KEY AUFPL = LS_AFVC_AFVV-AUFPL
*                     APLZL = LS_AFVC_AFVV-APLZL.
*          ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFVC_OLD TO <FS_VAL_OLD>.

          READ TABLE L_AFVC_TABLE_OLD INTO LS_AFVC_OLD
            WITH KEY AUFPL = LS_AFVC_AFVV-AUFPL
                     APLZL = LS_AFVC_AFVV-APLZL
                     BINARY SEARCH.
          ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFVC_OLD TO <FS_VAL_OLD>.

        ELSE.
*          READ TABLE L_OPERATION_TABLE_OLD_AFVV INTO LS_AFVV_OLD
*            WITH KEY AUFPL = LS_AFVC_AFVV-AUFPL
*                     APLZL = LS_AFVC_AFVV-APLZL.
*          ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFVV_OLD TO <FS_VAL_OLD>.

          READ TABLE L_AFVV_TABLE_OLD INTO LS_AFVV_OLD
            WITH KEY AUFPL = LS_AFVC_AFVV-AUFPL
                     APLZL = LS_AFVC_AFVV-APLZL
                     BINARY SEARCH.
          ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_AFVV_OLD TO <FS_VAL_OLD>.

        ENDIF.

        L_AUFPL = LS_AFVC_AFVV-AUFPL.
        L_APLZL = LS_AFVC_AFVV-APLZL.
        IF <FS_VAL_NEW> IS ASSIGNED AND
           <FS_VAL_OLD> IS ASSIGNED.
          IF <FS_VAL_NEW> <> <FS_VAL_OLD>.

            PERFORM FRM_EIDT_LOG TABLES LT_ZPPCO02_LOG
                                 USING <FS_VAL_NEW>         "新值
                                       <FS_VAL_OLD>         "旧值
                                       LS_AFKO_NEW-WERKS    "工厂
                                       LS_AFKO_NEW-AUFNR    "工单号
                                       L_POSNR              "工单行号
                                       L_AUFPL              "工艺路线号
                                       L_APLZL              "订单的通用计数器
                                       L_RSNUM              "预留/相关需求的编号
                                       L_RSPOS              "预留/相关需求的项目编号
                                       L_MATNR              "物料号
                                       L_OPDAT              "操作日期
                                       L_OPTIM              "操作时间
                                       LS_AFKO_NEW-VBKZ     "更新标志
                                       L_PCNAME
                                       L_NAME_TEXT
                                       LS_ZPPCO02_01
                              CHANGING L_OPNUM.             "操作流水编号
          ENDIF.
          UNASSIGN:
            <FS_VAL_NEW>,
            <FS_VAL_OLD>.
        ENDIF.
      ENDLOOP.
    WHEN 'RESB'.
      LOOP AT L_COMPONENT_TABLE INTO LS_RESB_NEW.
                CLEAR LS_RESB_OLD .
        READ TABLE L_COMPONENT_TABLE_OLD INTO LS_RESB_OLD
          WITH KEY RSNUM = LS_RESB_NEW-RSNUM
                   RSPOS = LS_RESB_NEW-RSPOS
                   RSART = LS_RESB_NEW-RSART.

        ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_RESB_NEW TO <FS_VAL_NEW>.

        ASSIGN COMPONENT LS_ZPPCO02_01-FIELDNAME OF STRUCTURE LS_RESB_OLD TO <FS_VAL_OLD>.

*        CASE LS_RESB_NEW-VBKZ.
*          WHEN 'I'.
        IF <FS_VAL_NEW> IS ASSIGNED AND
           <FS_VAL_OLD> IS ASSIGNED.
          IF <FS_VAL_NEW> <> <FS_VAL_OLD>.
            L_RSNUM = LS_RESB_NEW-RSNUM.
            L_RSPOS = LS_RESB_NEW-RSPOS.
            PERFORM FRM_EIDT_LOG TABLES LT_ZPPCO02_LOG
                                 USING <FS_VAL_NEW>         "新值
                                       <FS_VAL_OLD>         "旧值
                                       LS_AFKO_NEW-WERKS    "工厂
                                       LS_AFKO_NEW-AUFNR    "工单号
                                       L_POSNR              "工单行号
                                       L_AUFPL              "工艺路线号
                                       L_APLZL              "订单的通用计数器
                                       L_RSNUM              "预留/相关需求的编号
                                       L_RSPOS              "预留/相关需求的项目编号
                                       LS_RESB_NEW-MATNR"L_MATNR              "物料号
                                       L_OPDAT              "操作日期
                                       L_OPTIM              "操作时间
                                       LS_RESB_NEW-VBKZ     "更新标志
                                       L_PCNAME
                                       L_NAME_TEXT
                                       LS_ZPPCO02_01
                              CHANGING L_OPNUM.             "操作流水编号
          ENDIF.
          UNASSIGN:
            <FS_VAL_NEW>,
            <FS_VAL_OLD>.
        ENDIF.
*          WHEN 'D'.
*          WHEN 'U'.
*          WHEN OTHERS.
*        ENDCASE.
      ENDLOOP.
    WHEN OTHERS.
  ENDCASE.
ENDLOOP.

* 插入日志
INSERT ZPPCO02_LOG FROM TABLE LT_ZPPCO02_LOG ACCEPTING DUPLICATE KEYS.

增强中新增INCLUDE:ZXCO1F01 

include 里面代码如下:

*----------------------------------------------------------------------*
***INCLUDE ZXCO1F01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_EIDT_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<FS_VAL_NEW>  text
*      -->P_<FS_VAL_OLD>  text
*      -->P_LS_AFKO_NEW_WERKS  text
*      -->P_LS_AFKO_NEW_AUFNR  text
*      -->P_0266   text
*      -->P_0267   text
*      -->P_L_OPDAT  text
*      -->P_L_OPTIM  text
*      -->P_LS_AFKO_NEW_VBKZ  text
*      <--P_L_OPNUM  text
*      <--P_LT_ZPPCO02_LOG  text
*----------------------------------------------------------------------*
FORM FRM_EIDT_LOG TABLES OT_ZPPCO02_LOG STRUCTURE ZPPCO02_LOG
                  USING  I_NEW    TYPE ANY
                         I_OLD    TYPE ANY
                         I_WERKS  TYPE WERKS_D
                         I_AUFNR  TYPE AUFNR
                         I_POSNR  TYPE CO_POSNR
                         I_AUFPL  TYPE CO_AUFPL
                         I_APLZL  TYPE CO_APLZL
                         I_RSNUM  TYPE RSNUM
                         I_RSPOS  TYPE RSPOS
                         I_MATNR  TYPE MATNR
                         I_OPDAT  TYPE DATS
                         I_OPTIM  TYPE TIMS
                         I_VBKZ   TYPE VBKZ
                         I_PCNAME TYPE C
                         I_NAME   TYPE AD_NAMTEXT
                         IS_ZPPCO02_01 TYPE ZPPCO02_01
                CHANGING O_OPNUM  TYPE ZPPCO02_LOG-OPNUM.
  DATA:
    LS_ZPPCO02_LOG        TYPE ZPPCO02_LOG.

  O_OPNUM = O_OPNUM + 1.

  LS_ZPPCO02_LOG-WERKS = I_WERKS.
  LS_ZPPCO02_LOG-AUFNR = I_AUFNR.
  LS_ZPPCO02_LOG-POSNR = I_POSNR.
  LS_ZPPCO02_LOG-AUFPL = I_AUFPL.
  LS_ZPPCO02_LOG-APLZL = I_APLZL.
  LS_ZPPCO02_LOG-RSNUM = I_RSNUM.
  LS_ZPPCO02_LOG-RSPOS = I_RSPOS.
  LS_ZPPCO02_LOG-MATNR = I_MATNR.
  LS_ZPPCO02_LOG-OPDAT = I_OPDAT.
  LS_ZPPCO02_LOG-OPTIM = I_OPTIM.
  LS_ZPPCO02_LOG-OPNUM = O_OPNUM.
  LS_ZPPCO02_LOG-OPTYP = I_VBKZ.
  CASE I_VBKZ.
    WHEN 'I'.
      LS_ZPPCO02_LOG-OBJTP = '创建'.
    WHEN 'U'.
      LS_ZPPCO02_LOG-OBJTP = '更新'.
    WHEN 'D'.
      LS_ZPPCO02_LOG-OBJTP = '删除'.
    WHEN OTHERS.
  ENDCASE.

  CONCATENATE:
    IS_ZPPCO02_01-DDTEXT
    IS_ZPPCO02_01-TABNAME
    '-'
    IS_ZPPCO02_01-FIELDNAME
    INTO LS_ZPPCO02_LOG-OBJNM.
*  LS_ZPPCO02_LOG-OBJLU = I_AUFNR.
*  LS_ZPPCO02_LOG-OBJLA = I_AUFNR.
  LS_ZPPCO02_LOG-VLOLD = I_OLD.
  LS_ZPPCO02_LOG-VLNEW = I_NEW.
*  LS_ZPPCO02_LOG-VLNE2 = I_AUFNR.
  LS_ZPPCO02_LOG-TCODE = SY-TCODE.
  LS_ZPPCO02_LOG-BNAME = SY-UNAME.
  LS_ZPPCO02_LOG-OPUSR = I_NAME.
  LS_ZPPCO02_LOG-OPHOS = I_PCNAME.

  APPEND LS_ZPPCO02_LOG TO OT_ZPPCO02_LOG.
ENDFORM.

涉及到的自检表内容如下

ZPPCO02_LOG
工单修改日志表
MANDT	MANDT	CLNT	3	0	0	集团
WERKS	WERKS_D	CHAR	4	0	0	工厂
AUFNR	AUFNR	CHAR	12	0	0	订单号 
POSNR	CO_POSNR	NUMC	4	0	0	订单项目号 
AUFPL	CO_AUFPL	NUMC	10	0	0	订单中工序的工艺路线号 
APLZL	CO_APLZL	NUMC	8	0	0	订单的通用计数器 
RSNUM	RSNUM	NUMC	10	0	0	预留/相关需求的编号
RSPOS	RSPOS	NUMC	4	0	0	预留 / 相关需求的项目编号
MATNR	MATNR	CHAR	40	0	0	物料编号
OPDAT	ZEL_OPDAT	DATS	8	0	0	操作日期
OPTIM	ZEL_OPTIM	TIMS	6	0	0	操作时间
OPNUM	ZEL_OPNUM	NUMC	6	0	0	操作流水号 
OPTYP	VBKZ	CHAR	1	0	0	更新标志
OBJTP	ZEL_OBJTP	CHAR	20	0	0	操作对象描述
OBJNM	ZEL_OBJNM	CHAR	50	0	0	操作对象描述
OBJLU	ZEL_OBJLU	CHAR	50	0	0	操作对象行标记(唯一) 
OBJLA	ZEL_OBJLA	CHAR	50	0	0	操作对象行标记(辅助) 
VLOLD	ZEL_VLOLD	CHAR	128	0	0	操作对象原值 
VLNEW	ZEL_VLNEW	CHAR	128	0	0	操作对象新值 
VLNE2	ZEL_VLNE2	CHAR	128	0	0	操作对象新值(补充) 
TCODE	TCODE	CHAR	20	0	0	事务代码
BNAME	ZEL_BNAME	CHAR	12	0	0	用户ID
OPUSR	ZEL_OPUSR	CHAR	12	0	0	操作SAP用户名 
OPHOS	ZEL_OPHOS	CHAR	20	0	0	操作客户端主机名
MAKTX	MAKTX	CHAR	40	0	0	物料描述

日志查询程序代码如下:

*&---------------------------------------------------------------------*
*& Report ZPPR606
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPPR606.

DATA:
  BEGIN OF GS_SCREEN,
    WERKS TYPE T001W-WERKS,  "工厂
    MATNR TYPE MARA-MATNR,  "物料号
    AUFNR TYPE AFPO-AUFNR,  "生产工单
    AENAM TYPE AENAM,       "修改人
    LAEDA TYPE LAEDA,       "上次更改日期
  END OF GS_SCREEN.


TYPE-POOLS ICON.
TABLES: SSCRFIELDS.

TYPES:
  TY_TAB_ZPPCO02_LOG TYPE STANDARD TABLE OF ZPPCO02_LOG_ALV.

DATA:
  FUNCTXT TYPE SMP_DYNTXT.

SELECT-OPTIONS:
  S_WERKS FOR GS_SCREEN-WERKS,
  S_MATNR FOR GS_SCREEN-MATNR,
  S_AUFNR FOR GS_SCREEN-AUFNR,
  S_AENAM FOR GS_SCREEN-AENAM,
  S_LAEDA FOR GS_SCREEN-LAEDA.

* 设定按钮
SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION .

  FUNCTXT-ICON_ID   = ICON_CREATE.
  FUNCTXT-QUICKINFO = 'Maintain View'.
  FUNCTXT-ICON_TEXT = '维护工单关键字段'.
  SSCRFIELDS-FUNCTXT_01 = FUNCTXT.


*&---------------------------------------------------------------------*
*&  AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM .
    WHEN 'FC01'.
*     维护工单关键字段
      PERFORM FRM_UPDATE_VIEW.

    WHEN OTHERS.
*     输入检查
      PERFORM FRM_CHK_INPUT.
  ENDCASE .
*&---------------------------------------------------------------------*
*&  START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* 主处理
  PERFORM FRM_MAIN_PROC.

*&---------------------------------------------------------------------*
*&      Form  FRM_UPDATE_VIEW
*&---------------------------------------------------------------------*
*       维护工单关键字段
*----------------------------------------------------------------------*
FORM FRM_UPDATE_VIEW .
  DATA:LT_SELT TYPE SCPRVIMSELLIST.
  CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
    EXPORTING
      ACTION                       = 'U'
      VIEW_NAME                    = 'ZPPCO02_01'
    TABLES
      DBA_SELLIST                  = LT_SELT
    EXCEPTIONS
      CLIENT_REFERENCE             = 1
      FOREIGN_LOCK                 = 2
      INVALID_ACTION               = 3
      NO_CLIENTINDEPENDENT_AUTH    = 4
      NO_DATABASE_FUNCTION         = 5
      NO_EDITOR_FUNCTION           = 6
      NO_SHOW_AUTH                 = 7
      NO_TVDIR_ENTRY               = 8
      NO_UPD_AUTH                  = 9
      ONLY_SHOW_ALLOWED            = 10
      SYSTEM_FAILURE               = 11
      UNKNOWN_FIELD_IN_DBA_SELLIST = 12
      VIEW_NOT_FOUND               = 13
      MAINTENANCE_PROHIBITED       = 14
      OTHERS                       = 15.
ENDFORM.                    "FRM_UPDATE_VIEW
*&---------------------------------------------------------------------*
*&      Form  FRM_MAIN_PROC
*&---------------------------------------------------------------------*
*       主处理
*----------------------------------------------------------------------*
FORM FRM_MAIN_PROC .
  DATA:
    LT_ZPPCO02_LOG TYPE TY_TAB_ZPPCO02_LOG.

  PERFORM FRM_GET_DATA CHANGING LT_ZPPCO02_LOG.

  PERFORM FRM_DISPLAY_ALV USING LT_ZPPCO02_LOG.

ENDFORM.                    "FRM_MAIN_PROC
*&---------------------------------------------------------------------*
*&      Form  FRM_CHK_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_CHK_INPUT .
* 检查工厂
  IF S_WERKS[] IS INITIAL .
    SET CURSOR FIELD 'S_WERKS-LOW'.
    MESSAGE '工厂为必输项目'  TYPE 'E' .
*    LEAVE LIST-PROCESSING.
  ENDIF.
* 检查日期
  IF S_LAEDA[] IS INITIAL .
    SET CURSOR FIELD 'S_LAEDA-LOW'.
    MESSAGE '修改日期为必输项'  TYPE 'E' .
  ENDIF.
ENDFORM.                    "FRM_CHK_INPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_ZPPCO02_LOG  text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA CHANGING OT_ZPPCO02_LOG TYPE TY_TAB_ZPPCO02_LOG.
  DATA:
    LT_ZPPCO02_LOG TYPE TY_TAB_ZPPCO02_LOG.
  DATA:LS_ZPPCO02_LOG TYPE  ZPPCO02_LOG_ALV .
  DATA:LT_MAKT TYPE TABLE OF MAKT,
       LS_MAKT TYPE MAKT.
  SELECT *
    INTO CORRESPONDING FIELDS OF  TABLE LT_ZPPCO02_LOG
    FROM ZPPCO02_LOG
   WHERE WERKS IN S_WERKS
     AND AUFNR IN S_AUFNR
     AND MATNR IN S_MATNR
     AND OPDAT IN S_LAEDA
     AND OPUSR IN S_AENAM.

  IF LT_ZPPCO02_LOG[] IS NOT INITIAL .
    SELECT
      MATNR
      MAKTX
      INTO CORRESPONDING FIELDS OF TABLE LT_MAKT
      FROM MAKT
      FOR ALL ENTRIES IN LT_ZPPCO02_LOG
      WHERE MATNR = LT_ZPPCO02_LOG-MATNR
      AND SPRAS = SY-LANGU .
    SORT LT_MAKT BY MATNR .
  ENDIF .
  LOOP AT LT_ZPPCO02_LOG INTO LS_ZPPCO02_LOG.
    IF LS_ZPPCO02_LOG-MATNR IS NOT INITIAL .
      READ TABLE LT_MAKT INTO LS_MAKT WITH KEY MATNR = LS_ZPPCO02_LOG-MATNR BINARY SEARCH .
      IF SY-SUBRC = 0 .
        LS_ZPPCO02_LOG-MAKTX = LS_MAKT-MAKTX .
      ENDIF .
    ENDIF .
**   权限检查
*    AUTHORITY-CHECK OBJECT 'ZWERKS8'
*                        ID 'ZWERKS8' FIELD LS_ZPPCO02_LOG-WERKS.
*    IF SY-SUBRC <> 0.
*      MESSAGE S003(ZYFPT) WITH LS_ZPPCO02_LOG-WERKS.
*      CONTINUE.
*    ENDIF.
    APPEND LS_ZPPCO02_LOG TO OT_ZPPCO02_LOG.
  ENDLOOP.

  SORT OT_ZPPCO02_LOG BY WERKS  ASCENDING
                         OPDAT  ASCENDING
                         OPTIM  ASCENDING
                         OPNUM  ASCENDING
                         AUFNR  ASCENDING
                         POSNR  ASCENDING
                         MATNR  ASCENDING
                         AUFPL  ASCENDING
                         APLZL  ASCENDING
                         RSNUM  ASCENDING
                         RSPOS  ASCENDING.
ENDFORM.                    "FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       显示ALV
*----------------------------------------------------------------------*
*      -->P_LT_ZPPCO02_LOG  text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV USING IT_ZPPCO02_LOG TYPE TY_TAB_ZPPCO02_LOG.

  DATA:
    LT_FIELDCAT TYPE LVC_T_FCAT,
    LS_LAYOUT   TYPE LVC_S_LAYO.
  DATA:LS_DISVARIANT TYPE DISVARIANT .
  LS_DISVARIANT-REPORT = SY-REPID .
  FIELD-SYMBOLS:
                 <LFS_FIELDCAT> TYPE LVC_S_FCAT .
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME       = 'ZPPCO02_LOG_ALV'
    CHANGING
      CT_FIELDCAT            = LT_FIELDCAT
    EXCEPTIONS
      INCONSISTENT_INTERFACE = 1
      PROGRAM_ERROR          = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  LOOP AT LT_FIELDCAT ASSIGNING <LFS_FIELDCAT>.
    IF <LFS_FIELDCAT>-FIELDNAME = 'MANDT'
      OR <LFS_FIELDCAT>-FIELDNAME = 'BNAME'
      OR <LFS_FIELDCAT>-FIELDNAME = 'OBJLU'
      OR <LFS_FIELDCAT>-FIELDNAME = 'OBJLA'.

      <LFS_FIELDCAT>-TECH = 'X'.
    ENDIF.
  ENDLOOP.

  LS_LAYOUT-ZEBRA      = 'X'.
  LS_LAYOUT-COL_OPT    = 'X'.
  LS_LAYOUT-CWIDTH_OPT = 'X'.
  LS_LAYOUT-SEL_MODE   = 'D'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_SAVE             = 'A'
      IS_VARIANT         = LS_DISVARIANT
      I_CALLBACK_PROGRAM = SY-CPROG
      IS_LAYOUT_LVC      = LS_LAYOUT
      IT_FIELDCAT_LVC    = LT_FIELDCAT
    TABLES
      T_OUTTAB           = IT_ZPPCO02_LOG
    EXCEPTIONS
      PROGRAM_ERROR      = 1
      OTHERS             = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM..                    "FRM_DISPLAY_ALV

涉及到的自检表如下:

ZPPCO02_01
生产工单修改字段维护表
MANDT	MANDT	CLNT	3	0	0	集团
TABNAME	TABNAME	CHAR	30	0	0	表名
FIELDNAME	FIELDNAME	CHAR	30	0	0	字段名 
DDTEXT	ZEL_DDTEXT	CHAR	60	0	0	字段描述
DEL	ZEL_DEL	CHAR	1	0	0	删除标识

这个自检表是为了给用户去维护想要记录哪些值,因为工单的里面字段太多,不需要所有的都记录,只需要记录部分影响业务的关键字段即可,效果如下

<think>好的,我需要帮助用户查找关于SAP CP_DO_OPR_CHECK的相关功能和解决方案。首先,我需要确认这个功能模块的具体用途。根据用户提供的引用[^3],里面提到了调用BAPI修改生产订单的工作中心,这可能与生产订单操作相关。CP_DO_OPR_CHECK可能属于生产计划或生产订单管理的模块。 接下来,我应该检查用户提供的引用内容。引用[^1]提到SAP PP Demand Management的功能模块,而引用涉及生产订单的工作中心修改,这可能属于PP模块中的生产订单组件。因此,CP_DO_OPR_CHECK可能是一个用于检查生产订单操作的功能模块。 用户可能需要使用这个功能模块来验证生产订单中的操作数据,或者在修改操作前进行检查。可能的解决方案包括查找官方文档、使用事务代码SE37测试模块参数、结合BAPI修改操作,以及参考类似功能的实现,比如引用[^3]中的BAPI调用示例。 另外,用户可能需要具体的步骤指南,比如如何查找相关功能模块,如何传递参数,如何处理异常等。需要提醒用户注意权限和测试环境,避免影响生产系统。 最后,生成的相关问题应围绕功能模块的使用、参数配置、错误处理和应用场景,确保覆盖用户可能遇到的后续疑问。</think>关于SAP功能模块CP_DO_OPR_CHECK,以下是逐步解决方案: 1. **功能定位** CP_DO_OPR_CHECK属于SAP生产计划(PP)模块中的生产订单操作检查功能,主要用于验证生产订单工序数据的完整性。该功能通常与工单修改事务(如CORR、CO02)结合使用。 2. **参数结构分析** 通过事务代码SE37进入模块,可见其关键参数: - `IV_OPERATION`:工序编号 - `IS_METHOD`:包含检查方法的控制结构 - `ET_MESSAGE`:返回检查结果的日志表 ```abap CALL FUNCTION 'CP_DO_OPR_CHECK' EXPORTING iv_operation = l_operation is_method = ls_method IMPORTING et_message = lt_msg. ``` 3. **典型应用场景** 当通过BAPI(如BAPI_ALM_ORDER_MAINTAIN)修改工单工序时,需先调用此模块进行数据校验,例如工作中心与工艺路线的兼容性检查。 4. **常见问题处理** - **错误E-101**:通常表示工序参数缺失,需检查传入的工序结构是否包含`PLNFL`,`AUFPL`等关键字段 - **错误W-205**:工装设备容量超限警告,需检查工作中心负载参数 5. **最佳实践** 建议在调用前先通过标准事务CO02执行相同操作,使用系统日志(ST12)捕获底层功能模块调用序列,这能帮助准确定位校验逻辑的执行路径。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值