背景:客户在日常操作中,经常会发现有人修改了工单的信息,为了追溯工单的修改历史,找到责任人,那么工单的修改需要做一个记录,便于查找。 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 删除标识
这个自检表是为了给用户去维护想要记录哪些值,因为工单的里面字段太多,不需要所有的都记录,只需要记录部分影响业务的关键字段即可,效果如下