主营业务成本替代增强

对销售发货凭证(物料凭证类型 = WL),主营业务成本科目、其他业务成本科目需要区分集团内和集团外。

增强点:INCLUDE  MM07MFK0_KONTIERUNG_LESEN (隐式增强)

1、 增强的处理逻辑

当MKPF-BLART(物料凭证类型)='WL' 并且MKPF-XBLNR(参考凭证号)不为空时进行检查和科目替代:

1)   获取客户账户分配组

从KNVV和LIKP表查找客户账户分配组字段。

表关联:inner join

关联条件

likp~kunag(售达方) = knvv~kunnr(客户编号) and

likp~vkorg (销售组织) = v~vkorg (销售组织)

筛选条件

likp~kunag(售达方)不为空 and

likp~vbeln = MKPF-XBLNR

输出字段

KNVV- KTGRD (客户账户分配组)

如果sql语句返回记录为空(sy-subrc <> 0),则继续从KNVVLIKP表中根据likp-kunnr(客户编号)字段继续查找账户分配组字段(将LIKP的kunag(售达方)替换kunnr(客户编号)。

表关联:inner join

关联条件

likp~kunnr(售达方) = knvv~kunnr(客户编号) and

likp~vkorg (销售组织) = v~vkorg (销售组织)

筛选条件

likp~kunnr(售达方)不为空 and

likp~vbeln = MKPF-XBLNR

输出字段:KNVV- KTGRD (客户账户分配组)

 

执行上面的sql语句之后,还需要针对退货交货单场景取数(sy-subrc <> 0)继续查找客户账户分配组,因为在退货订单立即过账的场景中LIKP表没有数据。退货场景直接从knvv表获取数据:

筛选条件

KNVV~VKORG (销售组织) = MSEG-BUKRS (公司代码) AND

KNVV~KUNNR (客户编号) = MSEG-KUNNR (客户编号)

输出字段:KNVV- KTGRD (客户账户分配组)

 

2)获取物料的科目分配组

从MVKE表获取KTGRM(物料的科目分配组)字段

筛选条件

mvke~matnr = mseg~matnr (物料编码)   AND 

mvke~vkorg (销售组织)= mseg~bukrs (公司代码)

输出字段:MVKE- KTGRM (物料的科目分配组)

 

3)根据客户的账户分配组和物料的账户分配组查找对应的成本科目

从配置表C901中获取数据:

筛选条件

kappl = 'V'  (应用程序)

AND kschl = 'KOFI' (条件类型,)

AND ktopl = '1000' (科目表)

AND kvsl1 = 'ZCT'     (科目代码)

AND ktgrd = 步骤1获取的客户账户分配组

AND ktgrm =步骤2获取的物料账户分配组

输出字段:C901- sakn1 (总账科目号)

 

4) 执行科目替代

如果获取的科目代码不为空,则将dm07m-konto替换为获取的科目(C901-sakn1)。

    DATA lv_flg TYPE c .
    CLEAR lv_flg .

    IF dm07m-konto IS NOT INITIAL .
      lv_flg = 'X' .
    ENDIF.

 

 

    DATA : lv_ktgrd TYPE knvv-ktgrd.
    DATA : lv_ktgrm TYPE mvke-ktgrm.
    DATA : lv_hkont TYPE konto.

    CLEAR:lv_ktgrd,lv_ktgrm,lv_hkont.

    IF lv_flg IS INITIAL AND mkpf-blart = 'WL' AND  mkpf-xblnr IS NOT INITIAL ..  "如果前面没有指定科目,且按规则找到科目,进行替代
      SELECT SINGLE v~ktgrd INTO lv_ktgrd
      FROM knvv AS v
      INNER JOIN likp AS p ON p~kunag = v~kunnr AND p~kunag <> '' AND p~vkorg = v~vkorg     "取售达方科目类别组 20250319
*     INNER JOIN likp AS p ON p~kunnr = v~kunnr AND p~vkorg = v~vkorg    "取送达方科目类别组
      WHERE p~vbeln = mkpf-xblnr. "mseg-xblnr_mkpf.
      IF sy-subrc <> 0 . " 会出现售达方为空的情况,为空取不到值的时候,用收货方取数
        SELECT SINGLE v~ktgrd INTO lv_ktgrd
        FROM knvv AS v
        INNER JOIN likp AS p ON p~kunnr = v~kunnr  AND p~kunnr <> '' AND p~vkorg = v~vkorg     "取售达方科目类别组 20250319
        WHERE p~vbeln = mkpf-xblnr.

        IF sy-subrc <> 0 . " 针对退货交货单,会出现创建完立马过账的情况,此时LIKP表无数据,直接取客户主数据中的 ktgrd 20250603
          SELECT SINGLE v~ktgrd INTO lv_ktgrd
          FROM knvv AS v WHERE v~vkorg = mseg-bukrs AND v~kunnr = mseg-kunnr.
        ENDIF.
      ENDIF.

      SELECT SINGLE ktgrm INTO lv_ktgrm FROM mvke
      WHERE matnr = mseg-matnr
      AND   vkorg = mseg-bukrs.

      SELECT SINGLE sakn1 INTO lv_hkont FROM c901
      WHERE kappl = 'V'
      AND kschl = 'KOFI'
      AND ktopl = 'INST'
      AND kvsl1 = 'ZCT'
      AND ktgrd = lv_ktgrd
      AND ktgrm = lv_ktgrm.

      IF lv_hkont IS NOT INITIAL.
        dm07m-konto = lv_hkont.
      ENDIF.
    ENDIF.

 

posted @ 2025-07-01 21:01  艾靑  阅读(27)  评论(0)    收藏  举报