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

6 篇文章 0 订阅

背景:客户在日常操作中,经常会发现有人修改了工单的信息,为了追溯工单的修改历史,找到责任人,那么工单的修改需要做一个记录,便于查找。 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	删除标识

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SAP CO02 TECO工单增强可以通过以下步骤实现。 1. 首先,在CMOD中创建一个项目ZCO02并增加增强PPCO0001。这将允许我们修改PPCO0001的功能。 2. 查看和调试SAP源代码,了解数据流向。特别是要了解在变更工单组件和表头未保存之前,这些数据存储在哪里。根据研究结果,我们发现这些数据存储在调用出口函数参数表中的component_table和header_table中。 3. 接下来,设计数据表结构ZPCO02,用于记录更改的信息。表结构包括字段如下:MANDT(客户端)、AUFNR(工单号)、MATNR(物料号)、FILED(字段名)、AENAM(更改人员)、LAEDA(更改日期)、TCODE(事务码)、CHNID(更改指标)、HOSTIP(主机IP)、HOST(主机)、VALUE_OLD(旧值)、VALUE_NEW(新值)、TIMES(更改时间)。 4. 在EXIT_SAPLCOBT_001的ZXCO1U01中编写代码,用于比较component_table中的数据与RESB(组件需求表)中相应保护字段的值,以确定组件的更改记录。对于表头的更改记录,则通过将header_table与视图CAUFV进行比较来确定。如果工单总数更改导致组件数量更改,则可以编写一个程序从ZPCO02中分离出这些记录,并为用户提供使用。其他更改情况需要进一步研究。 5. 最后,根据SAP的要求,启用FLG_DOC标记来控制是否将更改记录写入CDHDR和CDPOS。请注意,批量处理过多的组件可能会导致程序运行出错,因此要谨慎使用这个标记。 通过以上步骤,就可以实现SAP CO02 TECO工单增强功能,使得可以记录和追踪更改记录。如果你有更好的方法和想法,欢迎分享和讨论。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值