*&---------------------------------------------------------------------*
*& 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(BS) WITH 'Released order' 'change'.
RAISE NO_CHANGES_ALLOWED.
ENDIF.
ENDIF.
IF IS_COMPONENT-BDMNG < IS_COMPONENT-ENMNG.
MESSAGE E752(CN) WITH IS_COMPONENT-MATNR IS_COMPONENT-BDMNG IS_COMPONENT-ENMNG.
RAISE NO_CHANGES_ALLOWED.
ENDIF.
ENDIF.
1、增强出口:
Exit name: PPCO0001(开发应用程序: PP订单)
Exit function:EXIT_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 name:ZCO02_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