[MM] SAP 寄售发票 修改开票金额 差生差异凭证 MRKO 增强

2021-06-08 00:05发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

http://www.itpub.net/thread-2091351-1-1.html


注意事项写在前面:
1.我做的这个增强有bug,比如:
  a.价格改成 100  MRKO 开票
  b.冲销411K 形成412K
  c.价格改成200 对412K凭证 做MRKO 开冲销发票
  这时正向发票与反向发票就不平了.
  这里可以修改下代码:412K的凭证取对应411K的凭证的金额进行反向会计凭证生成.
  由于最近比较忙,还没有做调整,财务凭证看起来就头疼.

2.寄售物料凭证冲销时是实时取的表[RKWA] 里面的金额,出口的地方不还原为411K凭证金额的话,去看412K对应的会计凭证会有惊喜.
  说人话就是造成 411K 与 412K 的会计凭证不平

3.如果当月差异过大,进行平均分摊会造成成本失真,所以有必要让财务每月关注差异,并进行分摊操作.



SAP 寄售发票 正常流程说明:1.创建寄售采购订单:ME21N 订单上无价格
2.寄售转自有:MIGO 411K (需要寄售采购信息记录)
3.MRKO 对411K收货凭证,按照凭证收货金额形成会计凭证
4.如果寄售发票开错,需要冲销则需要MIGO: 取消对应411K凭证
5.MRKO 对冲销的412K凭证形成会计凭证
业务需求:
    1.要求供应商送大量物资到生产现场,并要求不占用库存资金.
    2.物资价格波动很大,客户不愿意每日维护寄售采购价格
    3.每月会与供应商协商一个开票价格,对使用的原料进行开票处理

系统需求点:
    1.MRKO开票时可以按照最新金额进行开票
    2.开票可冲销,修改金额重新开
难点:
    1.形成的差异不能进入物料分类账,只能进入主营业务成本.

实现过程:
1.创建自建表 [ZTMM_JSJG 寄售价格]


2.对MRKO做增强  
  a.增强查询显示:效果是,在MRKO选择显示进行查询时,总金额为 [凭证数量 * 自定义表单价]
     SE38 输入程序:RMVKON00
    在  FORM rkwa_partitionieren TABLES it_rkwa  TYPE typ_tab_rkwa it_block TYPE typ_tab_block.
我的SAP版本是:461行
    开始的位置增加显示增强

  1. FORM rkwa_partitionieren TABLES it_rkwa  TYPE typ_tab_rkwa

  2.                                 it_block TYPE typ_tab_block.

  3. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form RKWA_PARTITIONIEREN, Start                                                                                                                   A

  4. *$*$-Start: (1)---------------------------------------------------------------------------------$*$*

  5. ENHANCEMENT 1  ZEMM_RMVKON00.    "active version

  6. * MRKO 增强,在结算时,使用配置表中价格 替换物料移动凭证金额


  7. DATA: lt_ztmm_jsjg TYPE STANDARD TABLE OF ztmm_jsjg INITIAL SIZE 0 WITH HEADER LINE,

  8.       lv_date      TYPE datum.


  9. FIELD-SYMBOLS: <fs_rkwa> TYPE rkwa.


  10. lv_date = sy-datum.


  11. LOOP AT it_rkwa ASSIGNING <fs_rkwa>  .


  12.   REFRESH: lt_ztmm_jsjg.


  13.   SELECT * INTO TABLE lt_ztmm_jsjg

  14.                  FROM ztmm_jsjg

  15.                 WHERE matnr EQ <fs_rkwa>-matnr

  16.                   AND lifnr EQ <fs_rkwa>-lifnr

  17.                   AND werks EQ <fs_rkwa>-werks

  18.                   AND datbi GE lv_date.


  19.   IF sy-subrc EQ 0.


  20.     SORT lt_ztmm_jsjg BY datab DESCENDING.


  21.     LOOP AT lt_ztmm_jsjg WHERE datab LE lv_date.


  22.       <fs_rkwa>-wrbtr = <fs_rkwa>-bstmg * lt_ztmm_jsjg-netpr.


  23.       EXIT.


  24.     ENDLOOP.


  25.   ENDIF.


  26. ENDLOOP.


  27. ENDENHANCEMENT.

  28. *$*$-End:   (1)---------------------------------------------------------------------------------$*$*

复制代码

b.增强凭证生成:效果是 物料凭证金额完全抵扣,同时将产生的差异写入主营业务成本科目中.并记录物料号,凭证号,供应商号,以便财务手工分摊差异
   SMOD  -->  RMVKON00  -->  EXIT_RMVKON00_001



  1. IF sy-tcode = 'MRKO'.

  2.   CLEAR sdmbtr.

  3.   sbuzei = lines( t_bseg ).

  4. *获取调整前 RKWA的值

  5.   SELECT * INTO CORRESPONDING FIELDS OF TABLE tm_rkwa FROM rkwa FOR ALL ENTRIES IN t_rkwa

  6.     WHERE mblnr = t_rkwa-mblnr

  7.       AND mjahr = t_rkwa-mjahr

  8.       AND zeile = t_rkwa-zeile.


  9.   LOOP AT tm_rkwa.

  10.     CLEAR:szuonr,t_bseg,sdmbtr,t_rkwa.

  11. *读取内存表 t_rkwa 将显示值修改回凭证金额 否则冲销物料凭证时,将取该数量

  12.     READ TABLE t_rkwa WITH KEY mblnr = tm_rkwa-mblnr mjahr = tm_rkwa-mjahr zeile = tm_rkwa-zeile.

  13.     IF sy-subrc = 0 AND t_rkwa-wrbtr <> tm_rkwa-wrbtr.

  14.       "将rkwa 数量改回原值

  15.       t_rkwa-wrbtr = tm_rkwa-wrbtr.

  16.       MODIFY t_rkwa TRANSPORTING wrbtr

  17.       WHERE mblnr = tm_rkwa-mblnr

  18.         AND mjahr = tm_rkwa-mjahr

  19.         AND zeile = tm_rkwa-zeile.


  20.       CONCATENATE tm_rkwa-mblnr tm_rkwa-mjahr INTO szuonr.

  21.       READ TABLE t_bseg WITH KEY zuonr = szuonr.

  22.       IF sy-subrc = 0.

  23.         CASE tm_rkwa-shkzg.

  24.           WHEN 'H'."正向

  25.             sdmbtr = tm_rkwa-wrbtr - t_bseg-wrbtr .

  26.             t_bseg-wrbtr = tm_rkwa-wrbtr.

  27.             t_bseg-txbfw = tm_rkwa-wrbtr.

  28.             t_bseg-rewwr = tm_rkwa-wrbtr.

  29.             IF   sdmbtr < 0  . "负: 50 H  正:40 S

  30.               MODIFY t_bseg TRANSPORTING  wrbtr txbfw rewwr

  31.                   WHERE bukrs = t_bseg-bukrs

  32.                     AND belnr = t_bseg-belnr

  33.                     AND gjahr = t_bseg-gjahr

  34.                     AND buzei = t_bseg-buzei.

  35.               t_bseg-buzid = 'P'.

  36.               t_bseg-bschl = '40'.

  37.               t_bseg-shkzg = 'S'.

  38.               t_bseg-dmbtr = 0 - sdmbtr.

  39.               t_bseg-wrbtr = 0 - sdmbtr.

  40.               t_bseg-pswbt = 0 - sdmbtr.

  41.               t_bseg-txbfw = '0'.

  42.               t_bseg-ktosl = ''.

  43.               CONCATENATE  'MRKO差异结转 ' szuonr INTO  t_bseg-sgtxt  .

  44.               t_bseg-vorgn = 'RFBU'.

  45.               t_bseg-saknr = '6401990000'.

  46.               t_bseg-hkont = '6401990000'.

  47.               t_bseg-lifnr = tm_rkwa-lifnr.

  48.               t_bseg-bustw = ''.

  49.               t_bseg-rewwr = '0'.

  50.               sbuzei = sbuzei + 1 .

  51.               t_bseg-buzei = sbuzei.

  52.               APPEND t_bseg.

  53.             ENDIF.

  54.             IF   sdmbtr > 0   . "负: 50 H  正:40 S

  55.               MODIFY t_bseg TRANSPORTING  wrbtr txbfw rewwr

  56.                   WHERE bukrs = t_bseg-bukrs

  57.                     AND belnr = t_bseg-belnr

  58.                     AND gjahr = t_bseg-gjahr

  59.                     AND buzei = t_bseg-buzei.

  60.               t_bseg-buzid = 'P'.

  61.               t_bseg-bschl = '50'.

  62.               t_bseg-shkzg = 'H'.

  63.               t_bseg-dmbtr =   sdmbtr.

  64.               t_bseg-wrbtr =  sdmbtr.

  65.               t_bseg-pswbt =  sdmbtr.

  66.               t_bseg-txbfw = '0'.

  67.               t_bseg-ktosl = ''.

  68.               CONCATENATE  'MRKO差异结转 ' szuonr INTO  t_bseg-sgtxt  .

  69.               t_bseg-vorgn = 'RFBU'.

  70.               t_bseg-saknr = '6401990000'.

  71.               t_bseg-hkont = '6401990000'.

  72.               t_bseg-lifnr = tm_rkwa-lifnr.

  73.               t_bseg-bustw = ''.

  74.               t_bseg-rewwr = '0'.

  75.               sbuzei = sbuzei + 1 .

  76.               t_bseg-buzei = sbuzei.

  77.               APPEND t_bseg.

  78.             ENDIF.

  79.           WHEN 'S'."逆向

  80.             sdmbtr =  tm_rkwa-wrbtr - t_bseg-wrbtr.

  81.             t_bseg-wrbtr = tm_rkwa-wrbtr.

  82.             t_bseg-txbfw = tm_rkwa-wrbtr.

  83.             t_bseg-rewwr = tm_rkwa-wrbtr.

  84.             IF   sdmbtr > 0  . "负: 50 H  正:40 S

  85.               MODIFY t_bseg TRANSPORTING  wrbtr txbfw rewwr

  86.                   WHERE bukrs = t_bseg-bukrs

  87.                     AND belnr = t_bseg-belnr

  88.                     AND gjahr = t_bseg-gjahr

  89.                     AND buzei = t_bseg-buzei.

  90.               t_bseg-buzid = 'P'.

  91.               t_bseg-bschl = '40'.

  92.               t_bseg-shkzg = 'S'.

  93.               t_bseg-dmbtr = sdmbtr.

  94.               t_bseg-wrbtr = sdmbtr.

  95.               t_bseg-pswbt = sdmbtr.

  96.               t_bseg-txbfw = '0'.

  97.               t_bseg-ktosl = ''.

  98.               CONCATENATE  'MRKO差异结转 ' szuonr INTO  t_bseg-sgtxt  .

  99.               t_bseg-vorgn = 'RFBU'.

  100.               t_bseg-saknr = '6401990000'.

  101.               t_bseg-hkont = '6401990000'.

  102.               t_bseg-lifnr = tm_rkwa-lifnr.

  103.               t_bseg-bustw = ''.

  104.               t_bseg-rewwr = '0'.

  105.               sbuzei = sbuzei + 1 .

  106.               t_bseg-buzei = sbuzei.

  107.               APPEND t_bseg.

  108.             ENDIF.

  109.             IF   sdmbtr < 0   . "负: 50 H  正:40 S

  110.               MODIFY t_bseg TRANSPORTING  wrbtr txbfw rewwr

  111.                   WHERE bukrs = t_bseg-bukrs

  112.                     AND belnr = t_bseg-belnr

  113.                     AND gjahr = t_bseg-gjahr

  114.                     AND buzei = t_bseg-buzei.

  115.               t_bseg-buzid = 'P'.

  116.               t_bseg-bschl = '50'.

  117.               t_bseg-shkzg = 'H'.

  118.               t_bseg-dmbtr = 0 - sdmbtr.

  119.               t_bseg-wrbtr = 0 - sdmbtr.

  120.               t_bseg-pswbt = 0 - sdmbtr.

  121.               t_bseg-txbfw = '0'.

  122.               t_bseg-ktosl = ''.

  123.               CONCATENATE  'MRKO差异结转 ' szuonr INTO  t_bseg-sgtxt  .

  124.               t_bseg-vorgn = 'RFBU'.

  125.               t_bseg-saknr = '6401990000'.

  126.               t_bseg-hkont = '6401990000'.

  127.               t_bseg-lifnr = tm_rkwa-lifnr.

  128.               t_bseg-bustw = ''.

  129.               t_bseg-rewwr = '0'.

  130.               sbuzei = sbuzei + 1 .

  131.               t_bseg-buzei = sbuzei.

  132.               APPEND t_bseg.

  133.             ENDIF.

  134.         ENDCASE.

  135.       ENDIF.

  136.     ENDIF.


  137.   ENDLOOP.

  138. ENDIF.

复制代码

c.退出前,将显示的内容改回物料凭证金额,否则冲销的时候,形成的会计凭证,会根据新的金额进行,会导致会计凭证不平.
SE38 --> RMVKON00  --> FORM user_exit001_aufrufen TABLES it_bkpf TYPE typ_tab_bkpf
我的SAP版本是:1687行
  在结束的位置写入显示增强

  1. FORM user_exit001_aufrufen TABLES it_bkpf TYPE typ_tab_bkpf

  2.                                   it_bseg TYPE typ_tab_bseg

  3.                                   it_bset TYPE typ_tab_bset

  4.                                   it_rkwa TYPE typ_tab_rkwa

  5.                             USING bukrs    LIKE bkpf-bukrs

  6.                                   lifnr    LIKE bseg-lifnr

  7.                          CHANGING x_fehler TYPE c

  8.                                   s_msg    TYPE typ_msg

  9.                                   e_gjahr  TYPE gjahr

  10.                                   e_monat  TYPE monat.


  11.   DATA: tab_bset TYPE typ_tab_bset,

  12.         tab_rkwa TYPE typ_tab_rkwa.

  13.   DATA: f_gjahr TYPE gjahr,

  14.         f_monat TYPE monat.


  15.   DATA: s_bseg TYPE bseg, s_bkpf TYPE bkpf.


  16.   CLEAR: x_fehler,

  17.          tab_bset,

  18.          tab_rkwa.


  19.   tab_bset[] = it_bset[].

  20.   tab_rkwa[] = it_rkwa[].

  21.   DATA: s_bset TYPE bset.

  22.   DATA: f_bset_gjahr TYPE bset-gjahr.

  23.   IF NOT it_bset[] IS INITIAL.

  24.     READ TABLE it_bset INDEX 1 INTO s_bset.

  25.     f_bset_gjahr = s_bset-gjahr.

  26.   ENDIF.


  27.   sy-subrc = 0.

  28.   CALL CUSTOMER-FUNCTION '001'

  29.     EXPORTING

  30.       i_bukrs = bukrs

  31.       i_lifnr = lifnr

  32.     TABLES

  33.       t_bkpf  = it_bkpf

  34.       t_bseg  = it_bseg

  35.       t_bset  = tab_bset

  36.       t_rkwa  = tab_rkwa

  37.     EXCEPTIONS

  38.       error   = 1.


  39.   IF ( sy-subrc <> 0 ).

  40.     PERFORM msg_fuellen_sysvar CHANGING s_msg.

  41.     x_fehler = x.

  42.     EXIT.                              "---------->

  43.   ENDIF.


  44.   READ TABLE it_bkpf INTO s_bkpf INDEX 1.

  45.   IF sy-subrc = 0.

  46.     IF NOT s_bkpf-bukrs IS INITIAL.

  47.       CALL FUNCTION 'FI_PERIOD_DETERMINE'

  48.         EXPORTING

  49.           i_budat = s_bkpf-budat

  50.           i_bukrs = s_bkpf-bukrs

  51.           i_monat = s_bkpf-monat

  52.         IMPORTING

  53.           e_gjahr = f_gjahr

  54.           e_monat = f_monat.

  55.       IF f_gjahr = s_bkpf-gjahr AND f_monat = s_bkpf-monat.

  56.         e_gjahr = f_gjahr.

  57.         e_monat = f_monat.

  58.       ELSE.

  59.         CLEAR s_msg.

  60.         s_msg-msgid = c_msgid_m8.

  61.         s_msg-msgty = c_msgty_error.

  62.         s_msg-msgno = '008'.

  63.         s_msg-msgv1 = 'user_exit001_aufrufen'.

  64.         x_fehler = x.

  65.         EXIT.                            "---------->

  66.       ENDIF.


  67.       LOOP AT it_bseg INTO s_bseg WHERE gjahr <> s_bkpf-gjahr.

  68.       ENDLOOP.

  69.       IF sy-subrc = 0.

  70.         CLEAR s_msg.

  71.         s_msg-msgid = c_msgid_m8.

  72.         s_msg-msgty = c_msgty_error.

  73.         s_msg-msgno = '008'.

  74.         s_msg-msgv1 = 'user_exit001_aufrufen'.

  75.         x_fehler = x.

  76.         EXIT.

  77.       ENDIF.

  78.     ENDIF.

  79.   ELSE.

  80.     CLEAR s_msg.

  81.     s_msg-msgid = c_msgid_m8.

  82.     s_msg-msgty = c_msgty_error.

  83.     s_msg-msgno = '008'.

  84.     s_msg-msgv1 = 'user_exit001_aufrufen'.

  85.     x_fehler = x.

  86.     EXIT.

  87.   ENDIF.

  88.   IF NOT it_bset[] IS INITIAL.

  89.     IF s_bkpf-gjahr <> f_bset_gjahr.

  90.       LOOP AT it_bset INTO s_bset.

  91.         s_bset-gjahr = s_bkpf-gjahr.

  92.         MODIFY it_bset FROM s_bset.

  93.       ENDLOOP.

  94.     ENDIF.

  95.   ENDIF.


  96. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(2) Form USER_EXIT001_AUFRUFEN, End                                                                                                                   A

  97. *$*$-Start: (2)---------------------------------------------------------------------------------$*$*

  98. ENHANCEMENT 2  ZEMM_RMVKON00.    "active version

  99. *

  100.   it_rkwa[] = tab_rkwa[].


  101. ENDENHANCEMENT.

  102. *$*$-End:   (2)---------------------------------------------------------------------------------$*$*

  103. ENDFORM.                    "user_exit001_aufrufen

复制代码

主要代码是:
ENHANCEMENT 2 ZEMM_RMVKON00. "active version
it_rkwa[] = tab_rkwa[].
ENDENHANCEMENT.

到这里全部增强做完了.
还是效果图:

赞赏支持