SAP PP 生产订单变更记录保存
*&---------------------------------------------------------------------* *& 包括 ZXCO1U01 *&---------------------------------------------------------------------* ***生产订单关键参数修改日志记录 IF HEADER_TABLE-AUTYP = '10' 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 5, L_RATE1 TYPE P DECIMALS 5. *--------------------------------------------------------------------* * 宏定义 *--------------------------------------------------------------------* DEFINE DEL_ZERO_R. SHIFT &1 RIGHT DELETING TRAILING '0'. SHIFT &1 RIGHT DELETING TRAILING '.'. CONDENSE &1 NO-GAPS. END-OF-DEFINITION. DEFINE ULOG_LINE. * &1:表名 * &2:表名差异部分 * &3:字段名 * &4:变更对象类型 * &5:变更对象的描述 IF &1-&3 <> &1_&2-&3. CLEAR IW_CO02LOG. VI_OPNUM = VI_OPNUM + 1. "记录本次操作的流水编码(自增1) IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'U'. "操作类型:U-更新 IW_CO02LOG-OBJTP = '&4'. "操作对象类型(抬头、组件、工艺等) IW_CO02LOG-OBJNM = '&5'. "操作对象描述 IW_CO02LOG-VLOLD = &1_&2-&3. "操作对象的旧值 IW_CO02LOG-VLNEW = &1-&3. "操作对象的新值 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-&3 <> &1_&2-&3. CLEAR IW_CO02LOG. VI_OPNUM = VI_OPNUM + 1. "记录本次操作的流水编码(自增1) IW_CO02LOG-CHNUM = VI_OPNUM. "记录本次操作的流水编码 IW_CO02LOG-CHTYP = 'U'. "操作类型:U-更新 IW_CO02LOG-OBJTP = '&4'. "操作对象类型(抬头、组件、工艺等) IW_CO02LOG-OBJNM = '&5'. "操作对象描述 * ------------------------------------------- * 操作对象唯一行标记,例如:预留项目号(1) * 唯一行标记一般前台不可见,但唯一且不可更改 * ------------------------------------------- IW_CO02LOG-OBJLU = &1-&7. "操作对象唯一行标记的值(例如:0001) SHIFT IW_CO02LOG-OBJLU LEFT DELETING LEADING '0'. "去除前置0 CONCATENATE '&6' '(' IW_CO02LOG-OBJLU ')' INTO IW_CO02LOG-OBJLU. "拼写描述 * ------------------------------------------- * 操作对象辅助行标记,例如:BOM项目号(0010) * 辅助行标记一般不唯一或可修改,但最常用 * ------------------------------------------- IW_CO02LOG-OBJLA = &1-&9. "操作对象辅助行标记的值(例如:0010) CONCATENATE '&8' '(' IW_CO02LOG-OBJLA ')' INTO IW_CO02LOG-OBJLA. "拼写描述 IW_CO02LOG-VLOLD = &1_&2-&3. "操作对象的旧值 IW_CO02LOG-VLNEW = &1-&3. "操作对象的新值 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. "记录本次操作的流水编码(自增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'. "去除前置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 '0'. 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 = 0. SHIFT COMPONENT_TABLE_OLD-MATNR LEFT DELETING LEADING '0'. SHIFT COMPONENT_TABLE-MATNR LEFT DELETING LEADING '0'. SHIFT COMPONENT_TABLE_OLD-LIFNR LEFT DELETING LEADING '0'. SHIFT COMPONENT_TABLE-LIFNR LEFT DELETING LEADING '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 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. "记录本次操作的流水编码(自增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'. "去除前置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 '0'. 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. "记录本次操作的流水编码(自增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'. "去除前置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 = 0. 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 = 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) 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'. "去除前置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 = 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. WHEN 'D'. VI_OPNUM = VI_OPNUM + 1. "记录本次操作的流水编码(自增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'. "去除前置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 = 0. 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 '0'. 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 <> 0. 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 <> 0. DELETE TABLE IT_CO02LOGN FROM IW_CO02LOGN. ENDIF. ENDIF. ENDLOOP. IF IT_CO02LOGN IS INITIAL. IW_CO02LOG-CHNUM = '1'. 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 = 0 MONTHS = 3 SIGNUM = '-' YEARS = 0 IMPORTING CALC_DATE = L_DATUM . DELETE FROM ZPPCO02_LOG WHERE CHDAT <= L_DATUM. ENDIF. ENDIF.
----------------凑字数-------------------------
励志美文、《抉择》 人的一生常处于抉择之中,如:念哪一间大学?选哪一种职业?娶哪一种女子?……等等伤脑筋的事情。一个人抉择力的有无,可以显示其人格成熟与否。 倒是哪些胸无主见的人,不受抉择之苦。因为逢到需要决定的时候,他总是求询别人说:"嘿,你看怎么做?" 大凡能够成大功业的人,都是抉择力甚强的人。他知道事之成败,全在乎已没有人可以代劳,更没有人能代你决定。 在抉择的哪一刻,成败实已露出端倪。1 *&---------------------------------------------------------------------* 2 ** 程序名称:Z 3 ** 程序描述: 4 ** 创建人 : 5 ** 创建日期: 6 *&---------------------------------------------------------------------* 7 ** 修改记录: 8 9 REPORT Z. 10 11 TYPE-POOLS: SLIS. 12 TABLES: AFKO,USR02,ZPPCO02_LOG. 13 14 TYPES: BEGIN OF LINE_LOG. "输出日志的结构 15 INCLUDE STRUCTURE ZPPCO02_LOG. "包含结构ZCO02_LOG_TABLE 16 TYPES: DDTEXT LIKE DD07T-DDTEXT, "更新类型描述 17 NAME_TEXT LIKE ADRP-NAME_TEXT, 18 END OF LINE_LOG. 19 20 DATA: IT_LOG TYPE STANDARD TABLE OF LINE_LOG WITH HEADER LINE, 21 BEGIN OF IT_USER OCCURS 0, 22 BNAME LIKE USR21-BNAME, 23 NAME_TEXT LIKE ADRP-NAME_TEXT, 24 END OF IT_USER. 25 26 27 ************************************************************************ 28 * SELECTION-SCREEN 29 ************************************************************************ 30 SELECTION-SCREEN BEGIN OF BLOCK FLAG1 WITH FRAME TITLE TEXT-001. 31 SELECT-OPTIONS: 32 R_AUFNR FOR AFKO-AUFNR OBLIGATORY MEMORY ID ANR, 33 R_OPDAT FOR SY-DATUM, 34 R_OPTIM FOR SY-UZEIT, 35 R_OPTYP FOR ZPPCO02_LOG-CHTYP, 36 R_OPUSR FOR USR02-BNAME MATCHCODE OBJECT USER_COMP, 37 R_CHIPA FOR ZPPCO02_LOG-CHIPA, 38 R_CHHST FOR ZPPCO02_LOG-CHHST LOWER CASE. 39 SELECTION-SCREEN END OF BLOCK FLAG1. 40 41 ************************************************************************ 42 * Initialization 43 ************************************************************************ 44 INITIALIZATION. 45 46 ************************************************************************ 47 * AT SELECTION-SCREEN 48 ************************************************************************ 49 AT SELECTION-SCREEN. 50 51 52 ************************************************************************ 53 * START-OF-SELECTION 54 ************************************************************************ 55 START-OF-SELECTION. 56 57 PERFORM FRM_GET_DATA. 58 PERFORM FRM_DISPLAY_ALV. 59 60 *&--------------------------------------------------------------------* 61 *& Form FRM_GET_DATA 62 *&--------------------------------------------------------------------* 63 * 主程序 64 *---------------------------------------------------------------------* 65 FORM FRM_GET_DATA. 66 67 LOOP AT R_AUFNR. 68 SHIFT R_AUFNR-LOW LEFT DELETING LEADING '0'. 69 MODIFY R_AUFNR. 70 ENDLOOP. 71 72 SELECT * 73 FROM ZPPCO02_LOG 74 LEFT JOIN DD07T ON ZPPCO02_LOG~CHTYP = DD07T~DOMVALUE_L AND 75 DD07T~DDLANGUAGE = SY-LANGU AND 76 DD07T~AS4LOCAL = 'A' AND 77 DD07T~DOMNAME = 'VERBUCHER' 78 INTO CORRESPONDING FIELDS OF TABLE IT_LOG 79 WHERE AUFNR IN R_AUFNR AND 80 CHDAT IN R_OPDAT AND 81 CHTIM IN R_OPTIM AND 82 CHTYP IN R_OPTYP AND 83 CHUSR IN R_OPUSR AND 84 CHIPA IN R_CHIPA AND 85 CHHST IN R_CHHST. 86 IF SY-SUBRC <> 0. 87 MESSAGE S001(00) WITH '变更日志不存在' DISPLAY LIKE 'E'. 88 LEAVE TO TRANSACTION SY-TCODE. 89 ENDIF. 90 91 SELECT A~BNAME B~NAME_TEXT 92 INTO TABLE IT_USER 93 FROM USR21 AS A 94 JOIN ADRP AS B ON A~PERSNUMBER = B~PERSNUMBER 95 FOR ALL ENTRIES IN IT_LOG 96 WHERE BNAME = IT_LOG-CHUSR. 97 IF SY-SUBRC = 0. 98 LOOP AT IT_LOG. 99 READ TABLE IT_USER WITH KEY BNAME = IT_LOG-CHUSR. 100 IF SY-SUBRC = 0. 101 IT_LOG-NAME_TEXT = IT_USER-NAME_TEXT. 102 MODIFY IT_LOG. 103 ENDIF. 104 ENDLOOP. 105 ENDIF. 106 107 * IT_LOG-DDTEXT = '删除'. 108 * MODIFY IT_LOG TRANSPORTING DDTEXT WHERE OBJNM = '组件删除'. 109 SORT IT_LOG BY CHDAT DESCENDING CHTIM DESCENDING CHNUM ASCENDING. 110 111 ENDFORM. "SUB_MAIN 112 113 114 *&--------------------------------------------------------------------* 115 *& Form FRM_DISPLAY_ALV 116 *&--------------------------------------------------------------------* 117 * 输出 118 *---------------------------------------------------------------------* 119 FORM FRM_DISPLAY_ALV. 120 121 DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE, "ALV列属性 122 GT_LAYOUT TYPE SLIS_LAYOUT_ALV, "ALV布局设置 123 ALV_TITLE TYPE LVC_TITLE. "ALV表头 124 125 GT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'. "ALV布局设置为自动优化列宽 126 GT_LAYOUT-ZEBRA = 'X'. 127 128 DEFINE GT_TITLE . 129 GT_FIELDCAT-FIELDNAME = '&1'. "字段ID 130 GT_FIELDCAT-JUST = '&2'. "对齐方式 131 GT_FIELDCAT-EMPHASIZE = &3 . "列颜色 132 * GT_FIELDCAT-NO_ZERO = &4 . "不输出前置0 133 GT_FIELDCAT-KEY = &4 . 134 GT_FIELDCAT-NO_OUT = &5 . "不输出标识 135 GT_FIELDCAT-SELTEXT_L = '&6'. "字段描述 136 137 APPEND GT_FIELDCAT. 138 CLEAR GT_FIELDCAT. 139 END-OF-DEFINITION. 140 141 GT_TITLE: 142 AUFNR C ' ' 'X' '' 生产订单号, 143 CHDAT C ' ' 'X' '' 操作日期, 144 CHTIM C ' ' 'X' '' 操作时间, 145 CHTYP C 'C600' '' 'X' 更新标志, 146 DDTEXT C ' ' 'X' '' 操作类型, 147 CHNUM C 'C410' 'X' '' 流水编号, 148 CHUSR C 'C300' '' '' SAP用户名, 149 NAME_TEXT C '' '' '' 姓名, 150 CHIPA L ' ' '' '' 客户端IP地址, 151 CHHST L ' ' '' '' 客户端主机名, 152 OBJTP L 'C300' '' '' 操作对象类别, 153 OBJNM L 'C300' '' '' 操作对象, 154 OBJLU L ' ' '' '' 行标记(唯一), 155 OBJLA L ' ' '' '' 行标记(辅助), 156 VLOLD L 'C300' '' '' 操作对象原值, 157 VLNEW L 'C500' '' '' 操作对象新值, 158 VLNE2 L 'C500' '' '' 操作对象新值(补充), 159 TCODE C 'C300' '' '' 事务代码. 160 161 DESCRIBE TABLE IT_LOG[] LINES ALV_TITLE. 162 CONDENSE ALV_TITLE NO-GAPS. 163 164 CONCATENATE '生产订单变更日志' '(' ALV_TITLE 'ROWS )' INTO ALV_TITLE 165 SEPARATED BY SPACE. 166 167 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' 168 EXPORTING 169 I_CALLBACK_PROGRAM = SY-REPID 170 I_CALLBACK_PF_STATUS_SET = 'FRM_STATUS_SET' 171 IT_FIELDCAT = GT_FIELDCAT[] 172 IS_LAYOUT = GT_LAYOUT 173 I_SAVE = 'A' 174 I_GRID_TITLE = ALV_TITLE "表头信息 175 TABLES 176 T_OUTTAB = IT_LOG 177 EXCEPTIONS 178 PROGRAM_ERROR = 1 179 OTHERS = 2. 180 181 IF SY-SUBRC <> 0. 182 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO 183 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. 184 ENDIF. 185 186 ENDFORM. " DISPLAY 187 *&---------------------------------------------------------------------* 188 *& FORM FRM_STATUS_SET 189 *&---------------------------------------------------------------------* 190 * TEXT 191 *----------------------------------------------------------------------* 192 * --> P1 TEXT 193 * <-- P2 TEXT 194 *----------------------------------------------------------------------* 195 FORM FRM_STATUS_SET USING EXTAB TYPE SLIS_T_EXTAB. 196 197 SET PF-STATUS 'ZPPR0052_GS'. 198 ENDFORM.