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


    1、业务需求

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

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

    2、前台界面增强

    2.1、预留增强

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

    在屏幕中增加对应字段

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

    代码如下

    复制代码
    "-----------------------------@斌将军-----------------------------
    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修改时,字段并不能保存到底表,需要做增强更新

    2.2、物料凭证增强

    标准表增强该字段

    MSEG

     MATDOC

    创建DDL视图用于扩展NSDM_E_MSEG

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

    增强GOITEM结构

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

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

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

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

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

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

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

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

    2.3、会计凭证增强

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

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

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

    XACCIT

    BSEG

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

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

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

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

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

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

    更改布局,显示在列表中

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

    3、接口代码

    3.1、预留

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

    增强实施

     添加代码

    复制代码
    "-----------------------------@斌将军-----------------------------
    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:
                  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 .
            IF sy-subrc EQ 0.
              MOVE-CORRESPONDING wa_bapi_mb_item TO .
            ENDIF.
        ENDCASE.
      ENDLOOP.
    
    ENDMETHOD.
    "--------------------@斌将军--------------------
    复制代码

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

     

    欢迎关注,定期更文

     

  • 相关阅读:
    10 个杀手级的 Python 自动化脚本
    JVM常用的一些参数
    C++ 重载运算符,语法+示例,非常详细!!!
    Linux-命令行命令
    Ubuntu下载odbc驱动
    QGIS创建要素与属性
    Web版RSS阅读器yarr
    你可能需要的vue相关考点汇总
    CYQ.Data 操作 Json 性能测试:对比 Newtonsoft.Json
    OpenAI内斗剧情反转!微软力保ChatGPT之父回归?
  • 原文地址:https://www.cnblogs.com/BinGeneral/p/17615750.html