ABAP DEMO BAPI_GOODSMVT_CREATE MIGO过账

PERFORM frm_goodsmvt_create.
*&---------------------------------------------------------------------*
*& Form frm_goodsmvt_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_goodsmvt_create .

  DATA: ls_header    TYPE bapi2017_gm_head_01,
        ls_code      TYPE bapi2017_gm_code,
        lv_mat_doc   TYPE bapi2017_gm_head_ret-mat_doc,
        lv_doc_year  TYPE bapi2017_gm_head_ret-doc_year,
        lt_return    TYPE TABLE OF bapiret2,
        lt_item      TYPE TABLE OF bapi2017_gm_item_create,
        ls_item      TYPE bapi2017_gm_item_create,
        ls_exten_val TYPE TABLE OF zmms_mseg_ext,
        lt_exten     TYPE TABLE OF bapiparex,
        ls_exten     TYPE bapiparex.


  CLEAR: ls_header, ls_code, lv_mat_doc, lv_doc_year.
  REFRESH: lt_return, lt_item, lt_exten.

  " 根据T158B移动类型过滤出M*开头的TCODE, 后在T158G表根据TCODE找GM_CODE, 选择其中一个就可以了,
  " 或参考旧版本使用哪个TCODE直接以它找对应的GM_CODE(OMJJ配置T158B内容)
  " 01  MB01
  " 02  MB31
  " 03  MB1A
  " 04  MB1B
  " 05  MB1C
  " 06  MB11
  " 07  MB04

  " 移动类型分配事务代码
  ls_code-gm_code = 'GM_CODE'.

  " 抬头
  ls_header-pstng_date          = 'BUDAT'.             " 过账日期
  ls_header-doc_date            = 'BLDAT'.             " 凭证日期
  ls_header-ref_doc_no          = 'XBLNR'.             " 参考凭证编号
  ls_header-bill_of_lading      = 'FRBNR'.             " 收货时提单号
  ls_header-gr_gi_slip_no       = 'XABLN'.             " 收货/发货单编号
  ls_header-pr_uname            = 'UNAME'.             " 用户名
  ls_header-header_txt          = 'BKTXT'.             " 抬头文本
  ls_header-ref_doc_no_long     = 'XBLNR_LONG'.        " 参考凭证号(对相关性参看长文本)
  ls_header-bill_of_lading_long = 'FRBNR_LONG'.        " 组的捡配单编号
  ls_header-bar_code            = 'SAEBARCODE'.        " 条形码

  " 行项目
  ls_item-move_type             = 'BWART'.     " 移动类型
  ls_item-material              = 'MATNR'.     " 商品编码
  ls_item-entry_qnt             = 'MENGE'.     " 数量
  ls_item-entry_uom             = 'MEINS'.     " 单位
  ls_item-item_text             = 'SGTXT'.     " 行项目文本
  ls_item-profit_ctr            = 'PRCTR'.     " 利润中心
  ls_item-costcenter            = 'KOSTL'.     " 成本中心
  ls_item-orderid               = 'AUFNR'.     " 生产订单
  ls_item-reserv_no             = 'RSNUM'.     " 预留
  ls_item-res_item              = 'RSPOS'.     " 预留行项目
  ls_item-po_number             = 'EBELN'.     " 采购订单
  ls_item-po_item               = 'EBELP'.     " 采购行项目
  ls_item-vendor                = 'LIFNR'.     " 供应商
  ls_item-customer              = 'KUNNR'.     " 客户
  ls_item-sales_ord             = 'VBELN_VA'.  " 销售订单
  ls_item-s_ord_item            = 'POSNR_VA'.  " 销售行项目
  ls_item-sched_line            = 'ETENR'.     " 计划行
  ls_item-val_type              = 'BWTAR'.     " 评估类型
  ls_item-deliv_numb_to_search  = 'VBELN_VL'.  " 交货
  ls_item-deliv_item_to_search  = 'POSNR_VL'.  " 交货项目


  CASE ls_item-move_type.
    WHEN '311'.    " 调拨
      ls_item-plant                = 'WERKS'.     " 发货工厂
      ls_item-stge_loc             = 'LGORT'.     " 发货库存地点
      ls_item-batch                = 'CHARG'.     " 发货批次
      ls_item-move_plant           = 'UMWRK'.     " 收货工厂
      ls_item-move_stloc           = 'UMLGO'.     " 收货库存地点
      ls_item-move_batch           = 'UMCHA'.     " 收货批量
    WHEN OTHERS.
      ls_item-plant                = 'WERKS'.     " 工厂
      ls_item-stge_loc             = 'LGORT'.     " 库存地点
      ls_item-batch                = 'CHARG'.     " 库存地点
  ENDCASE.


  IF ls_item-move_type = '101'.
    " B  按采购订单的货物移动
    " F  有关生产单的货物移动
    " L  有关交货通知的货物移动
    " K  看板需求的货物移动
    " O  "提供物料"消耗的后续调整
    " W  比例的后续调整/产品单位物料
    IF ls_item-po_number IS NOT INITIAL AND ls_item-po_item IS NOT INITIAL.
      ls_item-mvt_ind   = 'B'.
    ELSEIF ls_item-orderid IS NOT INITIAL.
      ls_item-mvt_ind   = 'F'.
    ENDIF.
  ENDIF.

  APPEND ls_item TO lt_item.
  CLEAR ls_item.

  " 扩展字段
  ls_exten_val = VALUE #(
    line_id = 'LINE_ID'  " 参考数据元素MB_LINE_ID NUMC06 , 赋值行项目必输
    zzmatnr = '增强字段'
    zzmaktx = '增强字段'
  ).
  ls_exten-structure = 'ZMMS_MSEG_EXT'.
  CALL METHOD cl_abap_container_utilities=>fill_container_c
    EXPORTING
      im_value               = ls_exten_val
    IMPORTING
      ex_container           = ls_exten+30
    EXCEPTIONS
      illegal_parameter_type = 1
      OTHERS                 = 2.
  APPEND ls_exten TO lt_exten.
  CLEAR ls_exten.


  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  = ls_header
      goodsmvt_code    = ls_code
      testrun          = 'TESTRUN' " 启用测试, 赋值X或变量控制
    IMPORTING
      materialdocument = lv_mat_doc
      matdocumentyear  = lv_doc_year
    TABLES
      goodsmvt_item    = lt_item
      return           = lt_return.

  IF 'TESTRUN' = abap_true.
    LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'EAX'.
      CONCATENATE lv_zmsg ls_return-message INTO DATA(lv_zmsg).
    ENDLOOP.
    IF lv_zmsg IS NOT INITIAL.
      CONCATENATE '模拟过账失败' lv_zmsg INTO lv_zmsg.
    ELSE.
      lv_zmsg = '模拟过账成功'.
    ENDIF.
  ELSE.

    IF lv_mat_doc IS NOT INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.
      " lv_mat_doc   物料凭证
      " lv_doc_year  凭证年度
      lv_zmsg = '过账成功'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      lv_zmsg = '过账失败'.
    ENDIF.

  ENDIF.

ENDFORM.
*--------------------------------------------------------------------*
* BADI: MB_BAPI_GOODSMVT_CREATE
*       EXTENSIONIN_TO_MATDOC
* 扩展字段时先确认CS_IMKPF和CT_IMSEG结构中有字段, 否则赋值无效
*--------------------------------------------------------------------*
* EXTENSION_IN  TYPE BAPIPAREX_T
* CS_IMKPF  TYPE IMKPF
* CT_IMSEG  TYPE TY_T_IMSEG
* CT_RETURN  TYPE BAPIRET2
DATA: wa_extension   TYPE bapiparex,
      ext_value(960) TYPE c,
      wa_accit       TYPE accit,
      l_ref          TYPE REF TO data.

FIELD-SYMBOLS: <l_struc> TYPE any,
               <l_field> TYPE any.

CHECK NOT extension_in[] IS INITIAL.

SORT extension_in BY structure.

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 DATA(wa_extension_in).

  AT NEW structure.
    CREATE DATA lr_data TYPE (wa_extension_in-structure).
    ASSIGN lr_data->* TO <l_struc>.
  ENDAT.

  ex_value = wa_extension_in+30.
**  CONCATENATE wa_extension_in-valuepart1
**              wa_extension_in-valuepart2
**              wa_extension_in-valuepart3
**              wa_extension_in-valuepart4 INTO ex_value.
  <l_struc> = ext_value.

  ASSIGN COMPONENT 'LINE_ID' OF STRUCTURE <l_struc> TO <l_field>.
  IF <l_field> IS ASSIGNED.
    READ TABLE ct_imseg WITH KEY line_id = <l_field> ASSIGNING FIELD-SYMBOL(<fs_imseg>).
    IF sy-subrc EQ 0.
      MOVE-CORRESPONDING <l_struc> TO <fs_imseg>.
    ELSE.
      MOVE-CORRESPONDING <l_struc> TO cs_imkpf.
    ENDIF.
  ENDIF.

ENDLOOP.
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BAPI_GOODSMVT_CREATE是一个用于生成物料凭证的BAPI。它有多个参数需要提供值,其中包括goodsmvt_header、goodsmvt_code和gt_good等。\[2\]在调用该BAPI时,需要将这些参数赋予相应的值。goodsmvt_header用于存储过账日期、操作者和抬头文本等抬头数据,goodsmvt_code用于指定使用的过账事务码。gt_good是一个重要的表,用于存储要进行货物移动的物料、数量等信息。调用BAPI后,可以通过返回参数goodsmvt_headret获取物料凭证编号和年份。\[2\] 以下是一个示例代码,展示了如何使用BAPI_GOODSMVT_CREATE进行物料凭证的生成: ```ABAP DATA: goodsmvt_header TYPE bapi2017_gm_head_01, goodsmvt_code TYPE bapi2017_gm_code, gt_good TYPE TABLE OF bapi2017_gm_item_create, gw_good TYPE bapi2017_gm_item_create, goodsmvt_headret TYPE bapi2017_gm_head_ret, return LIKE TABLE OF bapiret2 WITH HEADER LINE, materialdocument TYPE bapi2017_gm_head_ret-mat_doc, matdocumentyear TYPE bapi2017_gm_head_ret-doc_year, ev_msgty TYPE BAPI_MTYPE, ev_mestx TYPE BAPI_MSG. "设置好goodsmvt_header、goodsmvt_code和gt_good的值 CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING goodsmvt_header = goodsmvt_header goodsmvt_code = goodsmvt_code TABLES goodsmvt_item = gt_good IMPORTING goodsmvt_headret = goodsmvt_headret materialdocument = materialdocument matdocumentyear = matdocumentyear return = return. "处理返回的日志消息 LOOP AT return WHERE type = 'A' OR type = 'E'. ev_msgty = 'E'. ev_mestx = return-message. EXIT. ENDLOOP. ``` 以上是一个示例代码,展示了如何使用BAPI_GOODSMVT_CREATE进行物料凭证的生成。你可以根据自己的需求,设置相应的参数值,并根据返回的日志消息进行处理。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [金色传说:SAP-BAPI-BAPI_GOODSMVT_CREATE创建物料凭证bapi的使用及参数值讲解](https://blog.csdn.net/weixin_43675474/article/details/122258115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值