关于将预留单中增强字段带入物料凭证和会计凭证中

本文讲述了如何在业务需求下,通过预留字段在创建物料凭证和会计凭证时进行界面显示增强,包括MB21/MB22/MB23字段的编辑权限,以及使用BAPI进行预留和字段维护。文章详细描述了从前台界面到接口代码的开发过程,确保字段值能在物料凭证和会计凭证中正确传递。
摘要由CSDN通过智能技术生成

1、业务需求

预留中自定义文本字段“大项修”。根据预留创建物料凭证时,将该字段带入到物料凭证中,类似标准字段“项目文本”。并在物料凭证自动产生会计凭证后,将该字段带入到会计凭证行项目中。

其中需要解决以上三张凭证对该字段的界面显示,以及预留对该字段的维护。解决接口中用BAPI对创建预留,创建物料凭证的字段维护

2、前台界面增强

2.1、预留增强

增强RESB表,添加大项修字段ZSGTXT

de7058f8bd40163d75888e6f02a51587.png

在屏幕中增加对应字段

03dff4b69e51520267d65a1abb3ef60d.png

设置MB21和MB22可编辑,MB23只读

2cb5b14a0f272c16678ee700eb4cd07c.png

代码如下

"--------------------@斌将军--------------------
MODULE screen_set_edit OUTPUT.
*预留中控制大项修字段是否可编辑
  IF sy-dynnr = 0510.
    IF sy-tcode = 'MB21' OR sy-tcode = 'MB22'.


    ELSE.
      LOOP AT SCREEN.
        IF screen-name = 'RESB-ZSGTXT'.
          screen-input = 0."设置为不可编辑
        ENDIF.
        MODIFY SCREEN.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDMODULE.
"--------------------@斌将军--------------------

其中MB22修改时,字段并不能保存到底表,需要做增强更新

9126e4d04f3b670b5c611bca3e2d8a0e.png

2.2、物料凭证增强

标准表增强该字段

MSEG

cbba84b194068ae23a5ed0408beaa109.png

 MATDOC

8ce43f39229a2d07d6d7cee7089b091f.png

创建DDL视图用于扩展NSDM_E_MSEG

ab8ff5b84fa7f0925c35630f7c37d1d4.png

为了使增强字段更能体现是由预留带入,因此直接将该字段显示到预留页签中。根据前台F1可知,预留界面所在位置,以及界面字段在结构GOITEM中

50c266cb660395aac61510393169ab6a.png

增强GOITEM结构

f4702e138d62cfb97bfbf2ee3c20bd8e.png

屏幕添加字段,因为只需要显示,所以设置为只输出

880b5f898da46ef14bba663a1b290021.png

到此,前台界面执行MIGO根据预留单创建物料凭证,就能直接带出该字段的值。但是过账时发现,该字段的值并没有保存到MSEG表中。

此处推测,应该是前台字段在保存到MSEG表的过程中,某些结构没有该增强字段,导致值传递时丢失。后经反复测试,大致摸清数据传输的过程

最终找到影响的位置,当传输给ls_imseg3时,ls_imseg3中并没有增强该字段,所以传输给ls_imseg时,增强字段的值就丢了

305841ec6005fe691cd4e49e2eeb9814.png

ls_imseg3的结构是IMSEG3,ls_imseg的结构是IMSEG。

在给IMSEG3增加ZSGTXT时,发现报错:GOITEM不能定义两个ZSGTXT

原来GOITEM和IMSEG中都包含IMSEG3结构,所以删除之前GOITEM的增强字段,直接在IMSEG3中增强该字段,则三个结构中都有了ZSGTXT

41041c674ffe7960789e7568f151a253.png

后经测试,创建物料凭证时,可以直接将预留的该字段值带入到物料凭证中

2.3、会计凭证增强

会计凭证是在创建物料凭证时自动产生的,因此DEBUG的方向还是物料凭证创建过程

在这个过程中有一个增强点MM07MFF9_F_BELEG_ERGAENZEN→CKMV_AC_DOCUMENT_CREATE,可以在生成会计凭证时,修改XACCIT表的数据,就可以改变会计凭证的行项目值,这与问题解决非常贴合。

所以需要在XACCIT中增强字段,并且在最终的会计凭证表BSEG中增强字段。

b7bff99d40c0e2189c10ff29196f4eff.png

XACCIT

e45c65b22badf9eb6b1971b7afb996e3.png

BSEG

67f75648c631a1ea462b996ad796e6ec.png

但是经过测试,数据仍然没有通过物料凭证带入到会计凭证中,推测也是和物料凭证遇到的问题一样,数据传递时,有结构没有增加该字段

进入到CKMV_AC_DOCUMENT_CREATE函数中调试后,发现其中一个表p_acc对应的结构中没有该字段

e7e8b605e9f6031232cb8a212dca0a12.png

对应的结构是通过代码定义的,因此直接在代码中增加了该字段

84ecfe7fa7524d84b90a8c618af37c48.png

然后ZSGTXT的值就可以存入BSEG中。

之后在前台界面添加该字段用于展示即可

a02703efde16a7e7ab6ef6be7aebd5de.png

增强BSEG_ALV结构,在行项目表中显示

000ea3419eeaf6bfcdf4636b60eeb50d.png

更改布局,显示在列表中

9a27a73e527ca0e6125d25d3dcc53099.png

至此,预留单中的“大项修”字段,就可以传递到物料凭证中,并传递到会计凭证中

3、接口代码

3.1、预留

通过BAPI创建预留时,需要将ZSGTXT传递到预留中

增强实施

b47e3115cadad9d928d64db923eb35a2.png

 添加代码

"--------------------@斌将军--------------------
METHOD if_ex_mb_res_bapi_create1~extensionin_to_resb.
    CONSTANTS: lc_vbkok    TYPE char5  VALUE 'VBKOK',           
    "Enhance the structure for more z fields in LIKP
               lc_vbpok    TYPE char5  VALUE 'VBPOK',           
    "Enhance the structure for more z fields in LIPS
               lc_cs_vbkok TYPE char8  VALUE 'CS_VBKOK'.
    DATA: ls_zresb TYPE zresb_append,
          lv_rspos TYPE resb-rspos.


    LOOP AT it_extension_in INTO DATA(ls_extension).


      IF ls_extension-structure = 'ZRESB_APPEND'.
        lv_rspos = ls_extension-valuepart1.
        ls_zresb = ls_extension-valuepart2.
        READ TABLE resb INTO DATA(ls_resb) INDEX lv_rspos.
        IF sy-subrc = 0.
          ls_resb-zsgtxt = ls_zresb-zsgtxt."大项修
          MODIFY resb FROM ls_resb INDEX lv_rspos 
          TRANSPORTING zsgtxt.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.
"--------------------@斌将军--------------------

3.2、物料凭证

BADI:MB_BAPI_GOODSMVT_CREATE

调用方法IF_EX_MB_BAPI_GOODSMVT_CREATE~EXTENSIONIN_TO_MATDOC

IMSEG结构中也要新增增强字段,用于传值,上文已经新增过了

增强代码

"--------------------@斌将军--------------------
METHOD IF_EX_MB_BAPI_GOODSMVT_CREATE~EXTENSIONIN_TO_MATDOC.


  DATA:
    c_lenstruc          TYPE i VALUE 30,
    wa_bapi_mb_header   TYPE bapi_te_xmkpf,
    wa_bapi_mb_item     TYPE bapi_te_xmseg,
    wa_extension_in     TYPE bapiparex.


  FIELD-SYMBOLS:
    <fs_imseg>          TYPE imseg.


  CHECK NOT extension_in[] IS INITIAL.


* Analyze IMSEG for document structure 
"and assign LINE_IDs if necessary
  CALL METHOD cl_mmim_line_id_manager=>analyze_mb_create
    CHANGING
      ct_imseg          = ct_imseg[]
    EXCEPTIONS
      duplicate_line_id = 1
      OTHERS            = 2.


  LOOP AT extension_in INTO wa_extension_in.
    CASE wa_extension_in-structure.
* extension of MKPF
      WHEN 'BAPI_TE_XMKPF'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_header.
        MOVE-CORRESPONDING wa_bapi_mb_header TO cs_imkpf.
* extension of MSEG
      WHEN 'BAPI_TE_XMSEG'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_item.
        READ TABLE ct_imseg
          WITH KEY line_id = wa_bapi_mb_item-matdoc_itm
          ASSIGNING <fs_imseg>.
        IF sy-subrc EQ 0.
          MOVE-CORRESPONDING wa_bapi_mb_item TO <fs_imseg>.
        ENDIF.
    ENDCASE.
  ENDLOOP.


ENDMETHOD.
"--------------------@斌将军--------------------

至此,BAPI传值增强也已完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值