VA01
增强点:MV45AFZZ (包含文件,SE38直接搜就行)
点击“保存”后的事件,写在子例程USEREXIT_SAVE_DOCUMENT之中。
VL01N
对“过账发货”进行限制,当没有审核,就不能“过账发货”,这里用到了第三代增强,SE19创建典型业务加载项
只需要用到一种方法CHANGE_INPUT_HEADER_AND_ITEMS
双击该方法,进行编辑代码
METHOD if_ex_le_shp_goodsmovement~change_input_header_and_items.
LOOP AT it_xlips INTO DATA(gs_xlips).
SELECT SINGLE vkorg INTO @DATA(lv_vbak) FROM vbak
WHERE vbeln = @gs_xlips-vbeln.
"只有4600、4700、4800的销售组织才需限制
IF lv_vbak = '4600' OR lv_vbak = '4700' OR lv_vbak = '4800'.
SELECT SINGLE status INTO @DATA(gs_status) FROM ztmm084b
WHERE vbeln = @gs_xlips-vbeln.
"status为OA返回的审核状态,A通过,B驳回,C已下发
IF gs_status <> 'A'.
MESSAGE'未经过OA审批,不允许过账!' TYPE 'E'.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
CO02
工单变更,需用到第二代增强 CMOD ,创建增强的项目,添加组件
双击那个功能出口,再点击其包含文件ZXCO1U01,就可添加代码
*++++++++++++++++++++++++++++++++++++++++++++++
* 增强1:记录修改生产订单中关键字段的日志
*++++++++++++++++++++++++++++++++++++++++++++++
IF header_table-plauf <> header_table_old-plauf OR header_table-aufld <> header_table_old-aufld.
ELSE.
READ TABLE status_table INTO DATA(ls_table) WITH KEY stat = 'I0045'.
READ TABLE status_table_old INTO DATA(ls_table_old) WITH KEY stat = 'I0045'.
IF ls_table-inact <> ls_table_old-inact.
ELSE.
IF ls_table_old IS NOT INITIAL OR ls_table IS INITIAL.
*========================================
* 当为生产订单时才继续执行
*========================================
CHECK header_table-autyp = '10'. "订单类别:10-PP生产订单
*========================================
* 当不是创建时才继续执行
*========================================
CHECK header_table-vbkz <> 'I'. "抬头更新标识:I-新增
*---------------
* 数据定义
*---------------
DATA: it_log LIKE zpco02 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.
"-----------------------------------------------------------20170905 zhangyong
DEFINE ulog_itab1.
* ---------------------------------------------------
* &1:记录新值的内表名称
* &2:记录旧值的内表名称与新表的差异部分(通常为OLD)
* &3:比较的字段名称
* &4:操作对象类型
* &5:操作对象描述
* &6:操作对象唯一行标记描述
* &7:操作对象唯一行标记字段名
* &8:操作对象辅助行标记描述
* &9:操作对象辅助行标记字段名
* ---------------------------------------------------
"COMPONENT_TABLE OLD MATNR 订单组件 项目删除 预留项目号 RSPOS BOM项目号 POSNR.
* IF &1-&3 <> &1_&2-&3.
VI_OPNUM = VI_OPNUM + 1. "记录本次操作的流水编码(自增1)
IT_LOG-OPNUM = VI_OPNUM. "记录本次操作的流水编码
IT_LOG-OPTYP = 'D'. "操作类型: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. "操作对象的新值
CONCATENATE '物料号:' IT_LOG-VLNEW '被删除' into IT_LOG-VLNEW.
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 kzear 订单组件 最后发货 预留项目号 rspos bom项目号 posnr,
component_table old xloek 订单组件 已删除 预留项目号 rspos bom项目号 posnr.
WHEN 'D'.
READ TABLE component_table_old
WITH KEY rsnum = component_table-rsnum
rspos = component_table-rspos.
CHECK sy-subrc = 0.
ulog_itab1: component_table old matnr 订单组件 项目删除 预留项目号 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-lifnr.
CONCATENATE it_log-vlne2 ',厂商:' vs_str '(' operation_table-lifnr ')/' 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 lifnr 订单工序 厂商 工序计数器 aplzl 工序号 vornr,
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 zpco02 FROM TABLE it_log ACCEPTING DUPLICATE KEYS. "忽略索引相同的记录
ENDIF.
ENDIF.
ENDIF.
ENDIF.
可以再写个报表程序来方便用户了解工单组件的变更情况
REPORT ZPPR018.
TYPE-POOLS: SLIS.
TABLES: AFKO,USR02,ZPCO02.
TYPES: BEGIN OF LINE_LOG. "输出日志的结构
INCLUDE STRUCTURE ZPCO02. "包含结构ZPCO02
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 ZPCO02-OPTYP,
R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP,
R_OPIPA FOR ZPCO02-OPIPA,
R_OPHOS FOR ZPCO02-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 ZPCO02 LEFT JOIN DD07T ON ZPCO02~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