5

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

 1 year ago
source link: https://www.cnblogs.com/BinGeneral/p/17615750.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1、业务需求

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

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

2、前台界面增强

2.1、预留增强

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

1225252-20230808225855198-1189495461.png

在屏幕中增加对应字段

1225252-20230808225922419-1297021885.png

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

1225252-20230809095645723-170329761.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修改时,字段并不能保存到底表,需要做增强更新

1225252-20230809095144245-1794440655.png

2.2、物料凭证增强

标准表增强该字段

1225252-20230808230153358-1562682987.png

 MATDOC

1225252-20230808230300606-1307642943.png

创建DDL视图用于扩展NSDM_E_MSEG

1225252-20230808230359366-1834358864.png

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

1225252-20230808231335264-1673608434.png

增强GOITEM结构

1225252-20230808230923003-1644811487.png

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

1225252-20230808231524422-1419074713.png

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

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

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

1225252-20230808232555541-957506039.png

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

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

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

1225252-20230808233150245-264096757.png

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

2.3、会计凭证增强

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

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

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

1225252-20230808233726467-393907049.png

XACCIT

1225252-20230808234315645-49236943.png
1225252-20230808234612183-1561018137.png

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

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

1225252-20230808234943870-788895294.png

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

1225252-20230808235256014-1747344021.png

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

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

1225252-20230808235550022-1295743773.png

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

1225252-20230809113136255-830707722.png

更改布局,显示在列表中

1225252-20230809113353667-1035561055.png

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

3、接口代码

3.1、预留

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

1225252-20230809101259955-386019483.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传值增强也已完成


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK