CK40N成本滚算增强
一、需求
-
在使用事务码CK40N对物料进行成本核算的时候,核算价格需要通过自定义的逻辑来得到对应的价格。
二、增强实现
- 使用第二代客户出口 CMOD
-
增强代码
*&---------------------------------------------------------------------* *& 包含 ZXCKAU08 *&---------------------------------------------------------------------* "定义全局变量用于传递参数 BY HAND YLX BEGIN OF 20230914 DATA: ls_tab TYPE zstab. "定义全局变量用于传递参数 BY HAND YLX END OF 20230914 *1、 根据物料、工厂、销售订单、行项目取关联的STO及相关行项目 *STO1=ZTMM2074-ZEBELN1 *STO1行项目=ZTMM2074-ZEBELP1 *STO2=ZTMM2074-ZEBELN2 *STO2行项目=ZTMM2074-ZEBELP2 * *2、 根据STO及行项目取对应的采购单价 *EKPO-EBELN=ZTMM2074-ZEBELN1 *EKPO-EBELP=ZTMM2074-ZEBELP1 *EKPO-WERKS=3002为成本估算的工厂 *取EKPO-NETWR采购净价作为标准成本 * *EKPO-EBELN=ZTMM2074-ZEBELN2 *EKPO-EBELP=ZTMM2074-ZEBELP2 *EKPO-WERKS=1000为成本估算的工厂 *取EKPO-NETWR采购净价作为标准成本 *DATA:g_id TYPE char10. *IMPORT g_id TO g_id FROM MEMORY ID 'ZSDR030_A'. *FREE MEMORY ID 'ZSDR030_A'. *IF ( f_matbw-werks = '1000' OR f_matbw-werks = '3002' ) AND g_id = 'ZSDR030_A'. ********************************************************************** *BEGIN OF ADD BY HANDHJY ON ED1K908623 19.09.2022 18:23:50 IF imp_ekorg = '' OR imp_ekorg IS INITIAL. imp_ekorg = '1000'. ENDIF. *END OF ADD BY HANDHJY ON ED1K908623 19.09.2022 18:23:50 ********************************************************************** "Modify by ABAP1 requested by ED1K906953 on 20220418 for 标准成本取值逻辑修改 begin *IF ( f_matbw-werks = '1000' OR f_matbw-werks = '3002' OR f_matbw-werks = '3001' ) . ********************************************************************** *BEGIN OF MOD BY HANDHJY ON ED1K908625 19.09.2022 18:34:11 * IF ( f_matbw-werks = '1000' AND imp_klvar NE 'PPC1') OR f_matbw-werks = '3002' OR f_matbw-werks = '3001'. IF ( ( f_matbw-werks = '1000' OR f_matbw-werks = '1300' ) AND imp_klvar NE 'PPC1') OR f_matbw-werks = '3002' OR f_matbw-werks = '3001'. *END OF MOD BY HANDHJY ON ED1K908625 19.09.2022 18:34:11 ********************************************************************** "Modify by ABAP1 requested by ED1K906953 on 20220418 for 标准成本取值逻辑修改 end SELECT SINGLE ekpo~netwr INTO exp_preis FROM ekpo JOIN ekkn ON ekpo~ebeln = ekkn~ebeln AND ekpo~ebelp = ekkn~ebelp WHERE ekkn~vbeln = imp_vbeln AND ekkn~vbelp = imp_posnr AND ekpo~werks = f_matbw-werks AND ekpo~matnr = f_matbw-matnr AND ekpo~loekz = ''. "Add by ABAP1 requested by ED1K906953 on 20220418 for 标准成本取值逻辑修改 begin "当执行CK40N发布标准成本,成本核算变式为PPC1时,逻辑调整 ********************************************************************** *BEGIN OF MOD BY HANDHJY ON ED1K908625 19.09.2022 18:34:11 * ELSEIF f_matbw-werks = '1000' AND imp_klvar = 'PPC1'. ELSEIF ( f_matbw-werks = '1000' OR f_matbw-werks = '1300' ) AND imp_klvar = 'PPC1'. *END OF MOD BY HANDHJY ON ED1K908625 19.09.2022 18:34:11 ********************************************************************** TYPES: BEGIN OF ty_data, datab TYPE a017-datab, knumh TYPE a017-knumh, kbetr TYPE konp-kbetr, kpein TYPE konp-kpein, END OF ty_data. DATA: lt_a017 TYPE STANDARD TABLE OF ty_data, lt_a901 TYPE STANDARD TABLE OF ty_data, lt_a903 TYPE STANDARD TABLE OF ty_data. DATA: ls_data TYPE ty_data. DATA: lv_peinh TYPE mbew-peinh. * A017-WERKS=1000、根据A017-MATNR,优先取A017-DATAB距离当前期间最近的A017-KUNMH; *如A017-WERKS=1000时,A017-MATNR在A017-KUNMH为空或不存在,则根据同样条件取表A901-KNUMH * 根据KUNMH取表KONP-KBETR/KONP-KPFIN*MBEW-MATNR中的MBEW-PEINH的值作为标准成本价; "取PB00 - 正式价 SELECT a~datab a~knumh b~kbetr b~kpein FROM a017 AS a INNER JOIN konp AS b ON a~knumh = b~knumh INTO TABLE lt_a017 WHERE a~werks = f_matbw-werks AND a~matnr = f_matbw-matnr AND a~ekorg = imp_ekorg AND a~kschl = 'PB00' AND a~datab <= f_matbw-bwdat AND a~datbi >= f_matbw-bwdat "结束日期>=评估日期,ADD BY HANDHJY ON 20220919 AND b~loevm_ko = ''. SORT: lt_a017 BY datab DESCENDING. READ TABLE lt_a017 INTO ls_data INDEX 1. IF ls_data-knumh IS INITIAL. CLEAR: ls_data. "取ZP01 - 暂定价 SELECT a~datab a~knumh b~kbetr b~kpein FROM a901 AS a INNER JOIN konp AS b ON a~knumh = b~knumh INTO TABLE lt_a901 WHERE a~werks = f_matbw-werks AND a~matnr = f_matbw-matnr AND a~ekorg = imp_ekorg AND a~kschl = 'ZP01' AND a~datab <= f_matbw-bwdat AND a~datbi >= f_matbw-bwdat "结束日期>=评估日期,ADD BY HANDHJY ON 20220919 AND b~loevm_ko = ''. SORT: lt_a901 BY datab DESCENDING. READ TABLE lt_a901 INTO ls_data INDEX 1. IF ls_data-knumh IS INITIAL. CLEAR: ls_data. "取ZP00 - 预估价 SELECT a~datab a~knumh b~kbetr b~kpein FROM a903 AS a INNER JOIN konp AS b ON a~knumh = b~knumh INTO TABLE lt_a903 WHERE a~werks = f_matbw-werks AND a~matnr = f_matbw-matnr AND a~ekorg = imp_ekorg AND a~kschl = 'ZP00' AND a~datab <= f_matbw-bwdat AND a~datbi >= f_matbw-bwdat "结束日期>=评估日期,ADD BY HANDHJY ON 20220919 AND b~loevm_ko = ''. SORT: lt_a903 BY datab DESCENDING. READ TABLE lt_a903 INTO ls_data INDEX 1. ENDIF. ENDIF. SELECT SINGLE peinh FROM mbew INTO lv_peinh WHERE bwkey = f_matbw-werks AND matnr = f_matbw-matnr. "KONP-KBETR/KONP-KPFIN*MBEW-PEINH IF ls_data-kpein NE 0. exp_preis = ls_data-kbetr / ls_data-kpein * lv_peinh. ENDIF. CLEAR: lv_peinh,ls_data. FREE: lt_a017,lt_a901,lt_a903. "Add by ABAP1 requested by ED1K906953 on 20220418 for 标准成本取值逻辑修改 end ********************************************************************** *REASON:包裹的代码原本被注释,2023-10-24 取消注释 *BEGIN OF MODIFY BY HAND_WANGXE OF ED1K913340 ON 24.10.2023 16:36:50 ***_add_begin of ED1K911876 by handfww 10.07.2023 13:52:08 ***描述:新增5000工厂逻辑 ELSEIF f_matbw-werks = '5000' AND imp_klvar = 'PPC1'. IF imp_ekorg = '1000'. "默认赋值的数据 SELECT SINGLE ekorg INTO imp_ekorg FROM t024w WHERE werks = f_matbw-werks. ENDIF. CLEAR lt_a017. "取PB00 - 正式价 SELECT a~datab a~knumh b~kbetr b~kpein FROM a017 AS a INNER JOIN konp AS b ON a~knumh = b~knumh INTO TABLE lt_a017 WHERE a~werks = f_matbw-werks AND a~matnr = f_matbw-matnr AND a~ekorg = imp_ekorg AND a~kschl = 'PB00' AND a~datab <= f_matbw-bwdat AND a~datbi >= f_matbw-bwdat AND b~loevm_ko = ''. SORT: lt_a017 BY datab DESCENDING. CLEAR ls_data. READ TABLE lt_a017 INTO ls_data INDEX 1. IF ls_data-knumh IS INITIAL. CLEAR: ls_data,lt_a901. "取ZP01 - 暂定价 SELECT a~datab a~knumh b~kbetr b~kpein FROM a901 AS a INNER JOIN konp AS b ON a~knumh = b~knumh INTO TABLE lt_a901 WHERE a~werks = f_matbw-werks AND a~matnr = f_matbw-matnr AND a~ekorg = imp_ekorg AND a~kschl = 'ZP01' AND a~datab <= f_matbw-bwdat AND a~datbi >= f_matbw-bwdat AND b~loevm_ko = ''. SORT: lt_a901 BY datab DESCENDING. READ TABLE lt_a901 INTO ls_data INDEX 1. ENDIF. SELECT SINGLE peinh FROM mbew INTO lv_peinh WHERE bwkey = f_matbw-werks AND matnr = f_matbw-matnr. "KONP-KBETR/KONP-KPFIN*MBEW-PEINH IF ls_data-kpein NE 0. exp_preis = ls_data-kbetr / ls_data-kpein * lv_peinh. ENDIF. CLEAR: lv_peinh,ls_data. FREE: lt_a017,lt_a901. ***_add_end of ED1K911876 by handfww 10.07.2023 13:52:08 *END OF MODIFY BY HAND_WANGXE OF ED1K913340 ON 24.10.2023 16:36:50 ********************************************************************** ********************************************************************** *REASON: 添加锐湃 5000 工厂 成本核算变式:ZRP1 *BEGIN OF ADD BY HAND_WANGXE OF ED1K913340 ON 24.10.2023 16:25:56 ELSEIF f_matbw-werks = '5000' AND imp_klvar = 'ZRP1'. PERFORM frm_get_data_zrp1 USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat CHANGING ls_tab. CLEAR: lv_peinh. SELECT SINGLE peinh FROM mbew INTO lv_peinh WHERE bwkey = f_matbw-werks AND matnr = f_matbw-matnr. "KONP-KBETR/KONP-KPFIN*MBEW-PEINH IF ls_tab-kpein NE 0. exp_preis = ls_tab-kbetr / ls_tab-kpein * lv_peinh. ENDIF. CLEAR: lv_peinh,ls_tab. *END OF ADD BY HAND_WANGXE OF ED1K913340 ON 24.10.2023 16:25:56 ********************************************************************** "添加1200工厂逻辑 BY_HAND_YLX BEGIN OF 20230914 ELSEIF f_matbw-werks = '1200' AND imp_klvar = 'PPC1'. PERFORM frm_get_data USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat 'PT12' 'ZP07' CHANGING ls_tab. IF ls_tab-knumh IS INITIAL. PERFORM frm_get_data USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat 'PT11' 'ZP06' CHANGING ls_tab. IF ls_tab-knumh IS INITIAL. PERFORM frm_get_data USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat 'PT00' 'ZP05' CHANGING ls_tab. IF ls_tab-knumh IS INITIAL. PERFORM frm_get_data USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat 'ET10' 'ZP04' CHANGING ls_tab. IF ls_tab-knumh IS INITIAL. PERFORM frm_get_data USING f_matbw-werks f_matbw-matnr imp_ekorg f_matbw-bwdat 'ET00' 'ZP03' CHANGING ls_tab. ENDIF. ENDIF. ENDIF. ENDIF. SELECT SINGLE peinh FROM mbew INTO lv_peinh WHERE bwkey = f_matbw-werks AND matnr = f_matbw-matnr. "KONP-KBETR/KONP-KPFIN*MBEW-PEINH IF ls_tab-kpein NE 0. exp_preis = ls_tab-kbetr / ls_tab-kpein * lv_peinh. ENDIF. CLEAR: lv_peinh,ls_tab. "添加1200工厂逻辑 BY_HAND_YLX BEGIN OF 20230914 ENDIF.