*&---------------------------------------------------------------------*
*& 包括 ZXCO1U01
*&---------------------------------------------------------------------*
***生产订单关键参数修改日志记录
IF HEADER_TABLE-AUTYP = '' AND HEADER_TABLE-VBKZ <> 'I' AND SY-TCODE <> 'COHV'. "10-PP生产订单
*--------------------------------------------------------------------*
* 数据定义
*--------------------------------------------------------------------*
TABLES:ZPPCO02_LOG. DATA:IT_CO02LOG TYPE STANDARD TABLE OF ZPPCO02_LOG,
IT_CO02LOGN TYPE STANDARD TABLE OF ZPPCO02_LOG,
IW_CO02LOG TYPE ZPPCO02_LOG,
IW_CO02LOGN TYPE ZPPCO02_LOG. DATA:IPX TYPE MSXXLIST-HOSTADR,
IP TYPE ZPPCO02_LOG-CHIPA,
HOST TYPE ZPPCO02_LOG-CHHST. DATA:VI_OPNUM TYPE ZPPCO02_LOG-CHNUM,
VS_STR TYPE STRING. DATA:V_ARBPL_OLD LIKE CRHD-ARBPL,
V_ARBPL_NEW LIKE CRHD-ARBPL. DATA:L_DATUM TYPE SY-DATUM,
L_RATE TYPE P DECIMALS ,
L_RATE1 TYPE P DECIMALS . *--------------------------------------------------------------------*
* 宏定义
*--------------------------------------------------------------------* DEFINE DEL_ZERO_R.
SHIFT & RIGHT DELETING TRAILING ''.
SHIFT & RIGHT DELETING TRAILING '.'.
CONDENSE & NO-GAPS.
END-OF-DEFINITION. DEFINE ULOG_LINE.
* &1:表名
* &2:表名差异部分
* &3:字段名
* &4:变更对象类型
* &5:变更对象的描述
IF &-& <> &1_&-&.
CLEAR IW_CO02LOG.
VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'U'. "操作类型:U-更新
IW_CO02LOG-OBJTP = '&4'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '&5'. "操作对象描述
IW_CO02LOG-VLOLD = &1_&-&. "操作对象的旧值
IW_CO02LOG-VLNEW = &-&. "操作对象的新值 APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
ENDIF.
END-OF-DEFINITION. DEFINE ULOG_ITAB.
* ---------------------------------------------------
* &1:记录新值的内表名称
* &2:记录旧值的内表名称与新表的差异部分(通常为OLD)
* &3:比较的字段名称
* &4:操作对象类型
* &5:操作对象描述
* &6:操作对象唯一行标记描述
* &7:操作对象唯一行标记字段名
* &8:操作对象辅助行标记描述
* &9:操作对象辅助行标记字段名
* ---------------------------------------------------
IF &-& <> &1_&-&.
CLEAR IW_CO02LOG.
VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码
IW_CO02LOG-CHTYP = 'U'. "操作类型:U-更新 IW_CO02LOG-OBJTP = '&4'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '&5'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = &-&. "操作对象唯一行标记的值(例如:0001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '&6' '(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = &-&. "操作对象辅助行标记的值(例如:0010)
CONCATENATE '&8' '(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述 IW_CO02LOG-VLOLD = &1_&-&. "操作对象的旧值
IW_CO02LOG-VLNEW = &-&. "操作对象的新值 APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
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'.
CLEAR:IW_CO02LOG.
VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'I'. "操作类型:I-新增
IW_CO02LOG-OBJTP = '订单组件'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '订单组件(新增)'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = COMPONENT_TABLE-RSPOS. "预留项目号(例如:0001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '预留项目号(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = COMPONENT_TABLE-POSNR. "BOM项目号(例如:0010)
CONCATENATE 'BOM项目号(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述 * ------------------------------------------
* 将新增组件的所有信息组合为一行存入NEW字段
* ------------------------------------------
VS_STR = COMPONENT_TABLE-ERFMG. DEL_ZERO_R VS_STR. SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING ''.
CONCATENATE '物料号:' COMPONENT_TABLE-MATNR
',需求数量:' VS_STR '(' COMPONENT_TABLE-ERFME ')'
',工厂:' COMPONENT_TABLE-WERKS INTO IW_CO02LOG-VLNEW. IF NOT COMPONENT_TABLE-LGORT IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',库存地点:' COMPONENT_TABLE-LGORT INTO IW_CO02LOG-VLNEW.
ENDIF. IF NOT COMPONENT_TABLE-RGEKZ IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',反冲:' COMPONENT_TABLE-RGEKZ INTO IW_CO02LOG-VLNEW.
ENDIF. APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
* ---------------------------
* 记录组件的修改日志
* ---------------------------
WHEN 'U'.
* --------------------------------
* 根据预留及项目查询更改前的信息
* --------------------------------
READ TABLE COMPONENT_TABLE_OLD
WITH KEY RSNUM = COMPONENT_TABLE-RSNUM
RSPOS = COMPONENT_TABLE-RSPOS. CHECK SY-SUBRC = . SHIFT COMPONENT_TABLE_OLD-MATNR LEFT DELETING LEADING ''.
SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING ''.
SHIFT COMPONENT_TABLE_OLD-LIFNR LEFT DELETING LEADING ''.
SHIFT COMPONENT_TABLE-LIFNR LEFT DELETING LEADING ''. 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 SOBKZ 订单组件 特殊库存 预留项目号 RSPOS BOM项目号 POSNR,
COMPONENT_TABLE OLD LIFNR 订单组件 供应商(特殊库存) 预留项目号 RSPOS BOM项目号 POSNR,
COMPONENT_TABLE OLD XLOEK 订单组件 已删除标识 预留项目号 RSPOS BOM项目号 POSNR.
WHEN 'D'.
CLEAR:IW_CO02LOG.
VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'D'. "操作类型:I-新增
IW_CO02LOG-OBJTP = '订单组件'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '订单组件(删除)'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = COMPONENT_TABLE-RSPOS. "预留项目号(例如:0001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '预留项目号(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = COMPONENT_TABLE-POSNR. "BOM项目号(例如:0010)
CONCATENATE 'BOM项目号(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述
* ------------------------------------------
* 将新增组件的所有信息组合为一行存入NEW字段
* ------------------------------------------
VS_STR = COMPONENT_TABLE-ERFMG. DEL_ZERO_R VS_STR. SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING ''.
CONCATENATE '物料号:' COMPONENT_TABLE-MATNR
',需求数量:' VS_STR '(' COMPONENT_TABLE-ERFME ')'
',工厂:' COMPONENT_TABLE-WERKS INTO IW_CO02LOG-VLNEW. IF NOT COMPONENT_TABLE-LGORT IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',库存地点:' COMPONENT_TABLE-LGORT INTO IW_CO02LOG-VLNEW.
ENDIF. IF NOT COMPONENT_TABLE-RGEKZ IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',反冲:' COMPONENT_TABLE-RGEKZ INTO IW_CO02LOG-VLNEW.
ENDIF. APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
ENDCASE. ENDLOOP. *--------------------------------------------------------------------*
* 订单工序更改
*--------------------------------------------------------------------*
LOOP AT OPERATION_TABLE WHERE NOT VBKZ IS INITIAL. CASE OPERATION_TABLE-VBKZ.
* ---------------------------
* 记录工序的新增日志
* ---------------------------
WHEN 'I'. VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'I'. "操作类型:I-新增
IW_CO02LOG-OBJTP = '订单工序'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '订单工序(新增)'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL. "工序计数器(例如:00000001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '工序计数器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR. "工序号(例如:0010)
CONCATENATE '工序号(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-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 = .
CONCATENATE '工作中心:' V_ARBPL_NEW ',' INTO IW_CO02LOG-VLNEW.
ENDIF. CONCATENATE IW_CO02LOG-VLNEW
'工厂:' OPERATION_TABLE-WERKS
',控制码:' OPERATION_TABLE-STEUS INTO IW_CO02LOG-VLNEW. IF NOT OPERATION_TABLE-KTSCH IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',标准文本码:' OPERATION_TABLE-KTSCH INTO IW_CO02LOG-VLNEW.
ENDIF. CONCATENATE IW_CO02LOG-VLNEW ',工序短文本:' OPERATION_TABLE-LTXA1 INTO IW_CO02LOG-VLNEW. * ------------------------
* 工时部分存入NEW2字段
* ------------------------
IF NOT OPERATION_TABLE-VGW01 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW01.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',准备工时:' VS_STR '(' OPERATION_TABLE-VGE01 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-VGW02 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW02.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',机器工时:' VS_STR '(' OPERATION_TABLE-VGE02 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-VGW03 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW03.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',人工工时:' VS_STR '(' OPERATION_TABLE-VGE03 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-PREIS IS INITIAL.
VS_STR = OPERATION_TABLE-PREIS.
CONCATENATE IW_CO02LOG-VLNE2 ',外协价格:' VS_STR '(' OPERATION_TABLE-WAERS ')/' INTO IW_CO02LOG-VLNE2.
VS_STR = OPERATION_TABLE-PEINH.
CONCATENATE IW_CO02LOG-VLNE2 VS_STR '(' OPERATION_TABLE-MEINH ')' INTO IW_CO02LOG-VLNE2.
ENDIF. SHIFT IW_CO02LOG-VLNE2 LEFT DELETING LEADING ','.
CONDENSE IW_CO02LOG-VLNE2 NO-GAPS. APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
CLEAR IW_CO02LOG. * ---------------------------
* 记录工序的修改日志
* ---------------------------
WHEN 'U'.
* ----------------------------------------------
* 根据工艺路线号及计数器查询更改前的信息(AFVC)
* ----------------------------------------------
READ TABLE OPERATION_TABLE_OLD_AFVC
WITH KEY AUFPL = OPERATION_TABLE-AUFPL
APLZL = OPERATION_TABLE-APLZL. IF SY-SUBRC = .
* -------------------------------------
* 可直接记录更改的参数(工序基本信息)
* -------------------------------------
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)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'U'. "操作类型:U-更新
IW_CO02LOG-OBJTP = '订单工序'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '工作中心'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL. "工序计数器(例如:00000001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '工序计数器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR. "工序号(例如:0010)
CONCATENATE '工序号(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述 IW_CO02LOG-VLOLD = V_ARBPL_OLD. "操作对象的旧值
IW_CO02LOG-VLNEW = V_ARBPL_NEW. "操作对象的新值 APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
CLEAR IW_CO02LOG.
ENDIF. ENDIF. ENDIF. * ----------------------------------------------
* 根据工艺路线号及计数器查询更改前的信息(AFVV)
* ----------------------------------------------
READ TABLE OPERATION_TABLE_OLD_AFVV
WITH KEY AUFPL = OPERATION_TABLE-AUFPL
APLZL = OPERATION_TABLE-APLZL. IF SY-SUBRC = .
* ---------------------------------------------
* 可直接记录更改的参数(工时信息)
* ---------------------------------------------
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.
WHEN 'D'.
VI_OPNUM = VI_OPNUM + . "记录本次操作的流水编码(自增1)
IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'D'. "操作类型:I-新增
IW_CO02LOG-OBJTP = '订单工序'. "操作对象类型(抬头、组件、工艺等)
IW_CO02LOG-OBJNM = '订单工序(删除)'. "操作对象描述 * -------------------------------------------
* 操作对象唯一行标记,例如:预留项目号(1)
* 唯一行标记一般前台不可见,但唯一且不可更改
* -------------------------------------------
IW_CO02LOG-OBJLU = OPERATION_TABLE-APLZL. "工序计数器(例如:00000001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING ''. "去除前置0 CONCATENATE '工序计数器(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * -------------------------------------------
* 操作对象辅助行标记,例如:BOM项目号(0010)
* 辅助行标记一般不唯一或可修改,但最常用
* -------------------------------------------
IW_CO02LOG-OBJLA = OPERATION_TABLE-VORNR. "工序号(例如:0010)
CONCATENATE '工序号(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述 * -------------------------------------------------------------------
* 将新增工序的所有信息组合为一行存入NEW字段
* 由于ALV的列宽最大为128字符,所以将工时部分组合为一行存入NEW2字段
* -------------------------------------------------------------------
CLEAR: V_ARBPL_NEW,
IW_CO02LOG-VLNEW. SELECT SINGLE ARBPL
FROM CRHD
INTO V_ARBPL_NEW
WHERE OBJTY = 'A' AND
OBJID = OPERATION_TABLE-ARBID.
IF SY-SUBRC = .
CONCATENATE '工作中心:' V_ARBPL_NEW ',' INTO IW_CO02LOG-VLNEW.
ENDIF. CONCATENATE IW_CO02LOG-VLNEW
'工厂:' OPERATION_TABLE-WERKS
',控制码:' OPERATION_TABLE-STEUS INTO IW_CO02LOG-VLNEW. IF NOT OPERATION_TABLE-KTSCH IS INITIAL.
CONCATENATE IW_CO02LOG-VLNEW ',标准文本码:' OPERATION_TABLE-KTSCH INTO IW_CO02LOG-VLNEW.
ENDIF. CONCATENATE IW_CO02LOG-VLNEW ',工序短文本:' OPERATION_TABLE-LTXA1 INTO IW_CO02LOG-VLNEW. * ------------------------
* 工时部分存入NEW2字段
* ------------------------
IF NOT OPERATION_TABLE-VGW01 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW01.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',准备工时:' VS_STR '(' OPERATION_TABLE-VGE01 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-VGW02 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW02.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',机器工时:' VS_STR '(' OPERATION_TABLE-VGE02 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-VGW03 IS INITIAL.
VS_STR = OPERATION_TABLE-VGW03.
DEL_ZERO_R VS_STR.
CONCATENATE IW_CO02LOG-VLNE2 ',人工工时:' VS_STR '(' OPERATION_TABLE-VGE03 ')' INTO IW_CO02LOG-VLNE2.
ENDIF. IF NOT OPERATION_TABLE-PREIS IS INITIAL.
VS_STR = OPERATION_TABLE-PREIS.
CONCATENATE IW_CO02LOG-VLNE2 ',外协价格:' VS_STR '(' OPERATION_TABLE-WAERS ')/' INTO IW_CO02LOG-VLNE2.
VS_STR = OPERATION_TABLE-PEINH.
CONCATENATE IW_CO02LOG-VLNE2 VS_STR '(' OPERATION_TABLE-MEINH ')' INTO IW_CO02LOG-VLNE2.
ENDIF. SHIFT IW_CO02LOG-VLNE2 LEFT DELETING LEADING ','.
CONDENSE IW_CO02LOG-VLNE2 NO-GAPS. APPEND IW_CO02LOG TO IT_CO02LOG. "追加记录
CLEAR IW_CO02LOG. ENDCASE. ENDLOOP. *--------------------------------------------------------------------*
* 更新到数据库表
*--------------------------------------------------------------------*
IF NOT IT_CO02LOG[] 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. "获取最新的时间 IW_CO02LOG-AUFNR = HEADER_TABLE-AUFNR. "订单编码
SHIFT IW_CO02LOG-AUFNR LEFT DELETING LEADING ''.
IW_CO02LOG-CHDAT = SY-DATUM. "操作日期(服务器)
IW_CO02LOG-CHTIM = SY-UZEIT. "操作时间(服务器)
IW_CO02LOG-TCODE = SY-TCODE. "事务代码
IW_CO02LOG-CHUSR = SY-UNAME. "操作客户端用户名
IW_CO02LOG-CHIPA = IP. "操作客户端IP地址
IW_CO02LOG-CHHST = HOST. "操作客户端主机名 MODIFY IT_CO02LOG FROM IW_CO02LOG
TRANSPORTING AUFNR CHDAT CHTIM TCODE CHUSR CHIPA CHHST
WHERE AUFNR IS INITIAL. "全部更新 *--------------------------------------------------------------------*
* 读生产计划数据时 特殊处理
*--------------------------------------------------------------------*
SORT IT_CO02LOG DESCENDING BY CHTYP.
CLEAR:IW_CO02LOG.
LOOP AT IT_CO02LOG INTO IW_CO02LOG.
CONDENSE:IW_CO02LOG-VLNEW NO-GAPS,
IW_CO02LOG-VLOLD NO-GAPS.
IF IW_CO02LOG-CHTYP <> 'D'.
APPEND IW_CO02LOG TO IT_CO02LOGN.
ELSE.
DELETE IT_CO02LOGN WHERE AUFNR = IW_CO02LOG-AUFNR
AND CHTYP = 'I'
AND CHDAT = IW_CO02LOG-CHDAT
AND CHTIM = IW_CO02LOG-CHTIM
AND OBJTP = IW_CO02LOG-OBJTP
AND VLNEW = IW_CO02LOG-VLNEW
AND VLNE2 = IW_CO02LOG-VLNE2
.
IF SY-SUBRC <> .
APPEND IW_CO02LOG TO IT_CO02LOGN.
ENDIF.
ENDIF. ENDLOOP.
*--------------------------------------------------------------------*
* 订单总需求量变更时,只记录总需求量的变更,删除组件的同比例变更记录
*--------------------------------------------------------------------*
SORT IT_CO02LOGN BY CHNUM.
LOOP AT IT_CO02LOGN INTO IW_CO02LOGN.
* * 订单总需求量变更时,只记录总需求量的变更,删除组件的同比例变更记录
IF IW_CO02LOGN-OBJTP = '订单抬头' AND IW_CO02LOGN-OBJNM = '订单总数量'
AND IW_CO02LOGN-CHTYP = 'U' AND IW_CO02LOGN-VLNEW <> '0.000'.
CLEAR: L_RATE.
L_RATE = IW_CO02LOGN-VLOLD / IW_CO02LOGN-VLNEW.
ENDIF. IF IW_CO02LOGN-OBJTP = '订单组件' AND IW_CO02LOGN-OBJNM = '需求数量'
AND IW_CO02LOGN-CHTYP = 'U' AND IW_CO02LOGN-VLNEW <> '0.000'.
CLEAR: L_RATE1.
L_RATE1 = IW_CO02LOGN-VLOLD / IW_CO02LOGN-VLNEW.
IF L_RATE = L_RATE1 AND L_RATE <> .
DELETE TABLE IT_CO02LOGN FROM IW_CO02LOGN.
ENDIF.
ENDIF.
ENDLOOP. IF IT_CO02LOGN IS INITIAL.
IW_CO02LOG-CHNUM = ''.
IW_CO02LOG-CHTYP = 'U'.
IW_CO02LOG-OBJTP = '读生产主数据'.
IW_CO02LOG-OBJNM = '组件、工序均未变更,可能是重读主数据'.
CLEAR:IW_CO02LOG-OBJLU,
IW_CO02LOG-OBJLA,
IW_CO02LOG-VLNEW,
IW_CO02LOG-VLNE2.
APPEND IW_CO02LOG TO IT_CO02LOGN.
ENDIF.
* ---------------------------
* 将日志保存至数据库
* ---------------------------
INSERT ZPPCO02_LOG FROM TABLE IT_CO02LOGN ACCEPTING DUPLICATE KEYS. "忽略索引相同的记录 * ---------------------------
* 删除过早历史数据
* ---------------------------
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = SY-DATUM
DAYS =
MONTHS =
SIGNUM = '-'
YEARS =
IMPORTING
CALC_DATE = L_DATUM
.
DELETE FROM ZPPCO02_LOG WHERE CHDAT <= L_DATUM. ENDIF. ENDIF.

----------------凑字数-------------------------

励志美文、《抉择》
  
人的一生常处于抉择之中,如:念哪一间大学?选哪一种职业?娶哪一种女子?……等等伤脑筋的事情。一个人抉择力的有无,可以显示其人格成熟与否。
  
倒是哪些胸无主见的人,不受抉择之苦。因为逢到需要决定的时候,他总是求询别人说:"嘿,你看怎么做?"
  
大凡能够成大功业的人,都是抉择力甚强的人。他知道事之成败,全在乎已没有人可以代劳,更没有人能代你决定。
  
在抉择的哪一刻,成败实已露出端倪。
 *&---------------------------------------------------------------------*
** 程序名称:Z
** 程序描述:
** 创建人 :
** 创建日期:
*&---------------------------------------------------------------------*
** 修改记录: REPORT Z. TYPE-POOLS: SLIS.
TABLES: AFKO,USR02,ZPPCO02_LOG. TYPES: BEGIN OF LINE_LOG. "输出日志的结构
INCLUDE STRUCTURE ZPPCO02_LOG. "包含结构ZCO02_LOG_TABLE
TYPES: DDTEXT LIKE DD07T-DDTEXT, "更新类型描述
NAME_TEXT LIKE ADRP-NAME_TEXT,
END OF LINE_LOG. DATA: IT_LOG TYPE STANDARD TABLE OF LINE_LOG WITH HEADER LINE,
BEGIN OF IT_USER OCCURS ,
BNAME LIKE USR21-BNAME,
NAME_TEXT LIKE ADRP-NAME_TEXT,
END OF IT_USER. ************************************************************************
* SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK FLAG1 WITH FRAME TITLE TEXT-.
SELECT-OPTIONS:
R_AUFNR FOR AFKO-AUFNR OBLIGATORY MEMORY ID ANR,
R_OPDAT FOR SY-DATUM,
R_OPTIM FOR SY-UZEIT,
R_OPTYP FOR ZPPCO02_LOG-CHTYP,
R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP,
R_CHIPA FOR ZPPCO02_LOG-CHIPA,
R_CHHST FOR ZPPCO02_LOG-CHHST LOWER CASE.
SELECTION-SCREEN END OF BLOCK FLAG1. ************************************************************************
* Initialization
************************************************************************
INITIALIZATION. ************************************************************************
* AT SELECTION-SCREEN
************************************************************************
AT SELECTION-SCREEN. ************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION. PERFORM FRM_GET_DATA.
PERFORM FRM_DISPLAY_ALV. *&--------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&--------------------------------------------------------------------*
* 主程序
*---------------------------------------------------------------------*
FORM FRM_GET_DATA. LOOP AT R_AUFNR.
SHIFT R_AUFNR-LOW LEFT DELETING LEADING ''.
MODIFY R_AUFNR.
ENDLOOP. SELECT *
FROM ZPPCO02_LOG
LEFT JOIN DD07T ON ZPPCO02_LOG~CHTYP = 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
CHDAT IN R_OPDAT AND
CHTIM IN R_OPTIM AND
CHTYP IN R_OPTYP AND
CHUSR IN R_OPUSR AND
CHIPA IN R_CHIPA AND
CHHST IN R_CHHST.
IF SY-SUBRC <> .
MESSAGE S001() WITH '变更日志不存在' DISPLAY LIKE 'E'.
LEAVE TO TRANSACTION SY-TCODE.
ENDIF. SELECT A~BNAME B~NAME_TEXT
INTO TABLE IT_USER
FROM USR21 AS A
JOIN ADRP AS B ON A~PERSNUMBER = B~PERSNUMBER
FOR ALL ENTRIES IN IT_LOG
WHERE BNAME = IT_LOG-CHUSR.
IF SY-SUBRC = .
LOOP AT IT_LOG.
READ TABLE IT_USER WITH KEY BNAME = IT_LOG-CHUSR.
IF SY-SUBRC = .
IT_LOG-NAME_TEXT = IT_USER-NAME_TEXT.
MODIFY IT_LOG.
ENDIF.
ENDLOOP.
ENDIF. * IT_LOG-DDTEXT = '删除'.
* MODIFY IT_LOG TRANSPORTING DDTEXT WHERE OBJNM = '组件删除'.
SORT IT_LOG BY CHDAT DESCENDING CHTIM DESCENDING CHNUM ASCENDING. ENDFORM. "SUB_MAIN *&--------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&--------------------------------------------------------------------*
* 输出
*---------------------------------------------------------------------*
FORM FRM_DISPLAY_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布局设置为自动优化列宽
GT_LAYOUT-ZEBRA = 'X'. DEFINE GT_TITLE .
GT_FIELDCAT-FIELDNAME = '&1'. "字段ID
GT_FIELDCAT-JUST = '&2'. "对齐方式
GT_FIELDCAT-EMPHASIZE = & . "列颜色
* GT_FIELDCAT-NO_ZERO = &4 . "不输出前置0
GT_FIELDCAT-KEY = & .
GT_FIELDCAT-NO_OUT = & . "不输出标识
GT_FIELDCAT-SELTEXT_L = '&6'. "字段描述 APPEND GT_FIELDCAT.
CLEAR GT_FIELDCAT.
END-OF-DEFINITION. GT_TITLE:
AUFNR C ' ' 'X' '' 生产订单号,
CHDAT C ' ' 'X' '' 操作日期,
CHTIM C ' ' 'X' '' 操作时间,
CHTYP C 'C600' '' 'X' 更新标志,
DDTEXT C ' ' 'X' '' 操作类型,
CHNUM C 'C410' 'X' '' 流水编号,
CHUSR C 'C300' '' '' SAP用户名,
NAME_TEXT C '' '' '' 姓名,
CHIPA L ' ' '' '' 客户端IP地址,
CHHST L ' ' '' '' 客户端主机名,
OBJTP L 'C300' '' '' 操作对象类别,
OBJNM L 'C300' '' '' 操作对象,
OBJLU L ' ' '' '' 行标记(唯一),
OBJLA L ' ' '' '' 行标记(辅助),
VLOLD L 'C300' '' '' 操作对象原值,
VLNEW L 'C500' '' '' 操作对象新值,
VLNE2 L 'C500' '' '' 操作对象新值(补充),
TCODE C 'C300' '' '' 事务代码. DESCRIBE TABLE IT_LOG[] LINES ALV_TITLE.
CONDENSE ALV_TITLE NO-GAPS. CONCATENATE '生产订单变更日志' '(' ALV_TITLE 'ROWS )' INTO ALV_TITLE
SEPARATED BY SPACE. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'FRM_STATUS_SET'
IT_FIELDCAT = GT_FIELDCAT[]
IS_LAYOUT = GT_LAYOUT
I_SAVE = 'A'
I_GRID_TITLE = ALV_TITLE "表头信息
TABLES
T_OUTTAB = IT_LOG
EXCEPTIONS
PROGRAM_ERROR =
OTHERS = . IF SY-SUBRC <> .
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF. ENDFORM. " DISPLAY
*&---------------------------------------------------------------------*
*& FORM FRM_STATUS_SET
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM FRM_STATUS_SET USING EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'ZPPR0052_GS'.
ENDFORM.

SAP PP 生产订单变更记录保存的更多相关文章

  1. 【ABAP系列】SAP 读取生产订单 记入文档的货物移动明细

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 读取生产订单 记入文档的 ...

  2. SAP 生产订单变更管理 OCM Order Changement Management

    SAP OCM Order Changement Management  一.目的 订单变更管理系统是当我们的订单(生产订单.计划订单.采购订单)已经存在的时候,其物料主数据或销售数据有变更时,我们可 ...

  3. PP生产订单创建、下达、报工、收货、投料

    转自http://blog.sina.com.cn/s/blog_69fb8eb60102vpjd.html SAP 物料订单创建.下达.报工.收货与投料(ABAP代码) (2015-06-03 22 ...

  4. PP生产订单成本的计划、控制和结算

    SAP系统成本分析功能关注订单的成本,通过对计划成本和实际成本的比较分析,可以发现成本控制上的问题,以便及时解决问题.1.订单成本计划在基础数据齐全的基础上,系统可以自动滚算生产订单的成本.生产订单计 ...

  5. PP生产订单的BADI增强 WORKORDER_UPDATE

    METHOD if_ex_workorder_update~before_update. *---------------------->增强1 开始* "当生产订单类型为PP01时, ...

  6. SAP PP- OPK8生产订单打印 配置Smart form.

    OPK8 正常情况下是不可以配置Smart form 的 OPK8进入工单打印配置界面,选择Forms, 你会发现只有Script form 和PDF form(Adobe form)可选的,没有配置 ...

  7. 物料BOM和生产订单BOM的区别

    物料BOM和生产订单BOM的区别[@more@] 一般企业生产部在SAP创建生产订单的时候,就会产生一个生产订单BOM,这里的生产订单BOM是读取的物料BOM. 由于其它原因,需要修改成品的某几个零部 ...

  8. SAP生产订单状态

    SAP系统的常见订单状态如下: ·        CRTD (创建):标识生产订单刚刚创建,此时禁止做后续发料和报工确认等操作: ·        PREL (部分下达):当生产订单部分下达时,如仅下 ...

  9. SAP S/4HANA生产订单创建时使用的工厂数据是从什么地方带出来的

    大家如果使用我github上的这段代码创建S/4HANA的生产订单时,一定会发现,我在代码里并没有硬编码来指定生产订单的ID,然而运行时会发现我在系统里配置的这个2800被自动使用了,这是怎么做到的呢 ...

随机推荐

  1. caffe简易上手指南(三)—— 使用模型进行fine tune

    之前的教程我们说了如何使用caffe训练自己的模型,下面我们来说一下如何fine tune. 所谓fine tune就是用别人训练好的模型,加上我们自己的数据,来训练新的模型.fine tune相当于 ...

  2. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  3. 编程概念--使用async和await的异步编程

    Asynchronous Programming with Async and Await You can avoid performance bottlenecks and enhance the ...

  4. Android学习Service中遇到的问题

    今天学习service,然后遇到了一个force close,log中存在这个一句话: 05-23 14:13:26.408: E/AndroidRuntime(17616): android.con ...

  5. 1890. Money out of Thin Air(线段树 dfs转换区间)

    1890 将树的每个节点都转换为区间的形式 然后再利用线段树对结点更新 这题用了延迟标记 相对普通线段树 多了dfs的转换 把所要求的转换为某段区间 RE了N次 最后没办法了 记得有个加栈的语句 拿来 ...

  6. Asp.Net 高性能框架 SqlSugar.ORM 2.3

    一.前言 SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.3 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢. ...

  7. 7、四大组件之二-Service高级

    一.Native Service 1>什么是Native Service 使用JNI编写,在系统启动完成之前启动的系统级服务. 2>哪些服务是Native Service ACCESSIB ...

  8. 《Python基础教程(第二版)》学习笔记 -> 第三章 使用字符串

    本章讲话介绍如何使用字符串格式化其他的值,并简单了解一下利用字符串的分割.联接.搜索等方法能做些什么. 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最大最小值)对字符 ...

  9. python 连接oracle 数据库

    我们在测试中可能需要对oracle 数据库进行操纵,比如这样一个场景,在往oracle 里面插数据的同时,另一个工具从里面读,如何能保证读出来的数据是有顺序的,即:先插入进去的先读出来,根据这个场景们 ...

  10. viedeo

    http://download.farsight.com.cn/download/Android.htm