CK40N成本滚算增强

文章详细描述了如何在使用事务码CK40N进行物料成本核算时,通过自定义逻辑获取标准成本,包括针对不同工厂(如1000、3002、5000等)和成本核算变式(如PPC1、ZRP1)的特殊处理。同时,文章还提及了多个数据表的查询和成本计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CK40N成本滚算增强
一、需求
  1. 在使用事务码CK40N对物料进行成本核算的时候,核算价格需要通过自定义的逻辑来得到对应的价格。

    在这里插入图片描述

二、增强实现
  1. 使用第二代客户出口 CMOD

在这里插入图片描述

  1. 增强代码

    *&---------------------------------------------------------------------*
    *& 包含               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.
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值