VL31N BAPI:GN_DELIVERY_CREATE创建内向交货单同时批次拆分

翻到之前写的测试代码,记录一下,用于创建DN的同时就进行批次拆分,不需要再调用变更的BAPI再去修改一次。

REPORT ZTEST_VL31N_BATCH_SPLIT.

DATA:
  GS_VBSK_I     TYPE VBSK,                                   "構造:販売伝票ヘッダIN
  GS_VBSK_E     TYPE VBSK,                                   "構造:販売伝票ヘッダOUT
  GS_BORGR_CT   TYPE BORGR_CONTROL,                          "構造:GN_DELIVERY_CREATE の管理区分
  GT_XKOMDLGN   TYPE STANDARD TABLE OF KOMDLGN,              "T:明細
  GS_XKOMDLGN   TYPE KOMDLGN,                                "構造:明細
  GT_PARTNER    TYPE STANDARD TABLE OF PARTNER_GN,
  GS_PARTNER    TYPE PARTNER_GN,
  GT_ADDRESS    TYPE STANDARD TABLE OF BAPIADDR1,
  GS_ADDRESS    TYPE BAPIADDR1,
  GT_XVBFS      TYPE STANDARD TABLE OF VBFS,                 "T:一括処理用エラーログ
  GS_XVBFS      TYPE VBFS,                                   "構造:一括処理用エラーログ
  GT_XVBLS      TYPE STANDARD TABLE OF VBLS,                 "T:一括処理用納品書
  GS_XVBLS      TYPE VBLS,                                   "構造:一括処理用納品書
  GS_ADDR_SEL   TYPE ADDR1_SEL,
  GS_ADDR_VALUE TYPE ADDR1_VAL.


*   抬头数据
  GS_BORGR_CT-SAVE_TEXTS = ABAP_TRUE.              "グループタイプ

  GS_VBSK_I-MANDT = SY-MANDT.                      "クライアント
  GS_VBSK_I-ERNAM = SY-UNAME.                      "オブジェクト登録者名
  GS_VBSK_I-ERDAT = SY-DATUM.                      "レコード登録日
  GS_VBSK_I-UZEIT = SY-UZEIT.                      "時刻
*  GS_VBSK_I-VSTEL = '100B'.                      "装运点
  GS_VBSK_I-PROGRAMM = SY-REPID.
  GS_VBSK_I-SELSET   = SY-SLSET.
  GS_VBSK_I-BATCH    = SY-BATCH.
  GS_VBSK_I-SMART = 'L'.                           "グループタイプ

*   内部番号割当の番号範囲取得
  SELECT SINGLE NUMKI
    INTO @DATA(GV_NUMKI)                           "変数:内部番号割当の番号範囲
    FROM TVSA
   WHERE SMART = @GS_VBSK_I-SMART.                 "グループタイプ

*   NUmber range: Assigns next free number
  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      NR_RANGE_NR             = GV_NUMKI           "変数:内部番号割当の番号範囲
      OBJECT                  = 'RV_SAMMG'         "番号範囲オブジェクト名
*     QUANTITY                = '1'
*     SUBOBJECT               = ' '
*     TOYEAR                  = '0000'
*     IGNORE_BUFFER           = ' '
    IMPORTING
      NUMBER                  = GS_VBSK_I-SAMMG    "グループタイプ
*     QUANTITY                =
*     RETURNCODE              =
    EXCEPTIONS
      INTERVAL_NOT_FOUND      = 1
      NUMBER_RANGE_NOT_INTERN = 2
      OBJECT_NOT_FOUND        = 3
      QUANTITY_IS_0           = 4
      QUANTITY_IS_NOT_1       = 5
      INTERVAL_OVERFLOW       = 6
      BUFFER_OVERFLOW         = 7
      OTHERS                  = 8.

*   取得できなかた場合
  IF SY-SUBRC <> 0.
    ASSERT 0 = 0.
  ENDIF.


*  GS_XKOMDLGN-POSNR = '000010'.
  GS_XKOMDLGN-SPE_POSNR = '000010'.
  GS_XKOMDLGN-LIFNR = '5000000000'.
  GS_XKOMDLGN-LFIMG = '0'.
  GS_XKOMDLGN-KCMENG = '50'.
  GS_XKOMDLGN-MATNR = '000000010000000047'.
  GS_XKOMDLGN-EMATN = '000000010000000047'.
  GS_XKOMDLGN-PSTYV = 'ELN'.
  GS_XKOMDLGN-BLDAT = SY-DATUM.
  GS_XKOMDLGN-WERKS = '100B'.
  GS_XKOMDLGN-LGORT = 'JA06'.
  GS_XKOMDLGN-MTART = 'Z001'.
  GS_XKOMDLGN-VGBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-VGPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-VGTYP = 'V'.                       "販売管理伝票カテゴリ
  GS_XKOMDLGN-RFBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-RFPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-LFART = 'EL'.
  GS_XKOMDLGN-AKMNG = 'A'.
  GS_XKOMDLGN-KZBEW = 'B'.
  GS_XKOMDLGN-LFDAT = SY-DATUM.
  GS_XKOMDLGN-VRKME = 'ST'.
  GS_XKOMDLGN-MEINS = 'ST'.
  GS_XKOMDLGN-KZAZU = 'X'.                       "受注結合区分
  GS_XKOMDLGN-XCHAR = 'X'.                       "
  GS_XKOMDLGN-XCHPF = 'X'.                       "
  APPEND GS_XKOMDLGN TO GT_XKOMDLGN.
  CLEAR GS_XKOMDLGN.

*  GS_XKOMDLGN-POSNR = '900001'.
  GS_XKOMDLGN-SPE_POSNR = '900001'.
  GS_XKOMDLGN-UECHA = '000010'.
  GS_XKOMDLGN-LIFNR = '5000000000'.
  GS_XKOMDLGN-LFIMG = '20'.
  GS_XKOMDLGN-LGMNG = '20'.
  GS_XKOMDLGN-CHARG = '90D128_80'.
  GS_XKOMDLGN-KCMENG = '0'.
  GS_XKOMDLGN-MATNR = '000000010000000047'.
  GS_XKOMDLGN-PSTYV = 'ELN'.
  GS_XKOMDLGN-BLDAT = SY-DATUM.
  GS_XKOMDLGN-WERKS = '100B'.
  GS_XKOMDLGN-LGORT = 'JA06'.
  GS_XKOMDLGN-MTART = 'Z001'.
  GS_XKOMDLGN-VGBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-VGPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-VGTYP = 'V'.                       "販売管理伝票カテゴリ
  GS_XKOMDLGN-RFBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-RFPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-LFART = 'EL'.
  GS_XKOMDLGN-AKMNG = 'A'.
  GS_XKOMDLGN-KZBEW = 'B'.
  GS_XKOMDLGN-LFDAT = SY-DATUM.
  GS_XKOMDLGN-VRKME = 'ST'.
  GS_XKOMDLGN-MEINS = 'ST'.
  GS_XKOMDLGN-KZAZU = 'X'.                       "受注結合区分
  GS_XKOMDLGN-XCHAR = 'X'.                       "
  GS_XKOMDLGN-XCHPF = 'X'.                       "
*  GS_XKOMDLGN-MFRGR = '02'.                     "便
  APPEND GS_XKOMDLGN TO GT_XKOMDLGN.

  GS_XKOMDLGN-SPE_POSNR = '900002'.
  GS_XKOMDLGN-UECHA = '000010'.
  GS_XKOMDLGN-LIFNR = '5000000000'.
  GS_XKOMDLGN-LFIMG = '30'.
  GS_XKOMDLGN-LGMNG = '30'.
  GS_XKOMDLGN-CHARG = '90D128_81'.
  GS_XKOMDLGN-KCMENG = '0'.
  GS_XKOMDLGN-MATNR = '000000010000000047'.
  GS_XKOMDLGN-PSTYV = 'ELN'.
  GS_XKOMDLGN-BLDAT = SY-DATUM.
  GS_XKOMDLGN-WERKS = '100B'.
  GS_XKOMDLGN-LGORT = 'JA06'.
  GS_XKOMDLGN-MTART = 'Z001'.
  GS_XKOMDLGN-VGBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-VGPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-VGTYP = 'V'.                       "販売管理伝票カテゴリ
  GS_XKOMDLGN-RFBEL = '4100002508'.              "参照伝票番号
  GS_XKOMDLGN-RFPOS = '000001'.                  "参照明細番号
  GS_XKOMDLGN-LFART = 'EL'.
  GS_XKOMDLGN-AKMNG = 'A'.
  GS_XKOMDLGN-KZBEW = 'B'.
  GS_XKOMDLGN-LFDAT = SY-DATUM.
  GS_XKOMDLGN-VRKME = 'ST'.
  GS_XKOMDLGN-MEINS = 'ST'.
  GS_XKOMDLGN-KZAZU = 'X'.                       "受注結合区分
  GS_XKOMDLGN-XCHAR = 'X'.                       "
  GS_XKOMDLGN-XCHPF = 'X'.                       "
*  GS_XKOMDLGN-MFRGR = '02'.                     "便
  APPEND GS_XKOMDLGN TO GT_XKOMDLGN.

  CALL FUNCTION 'GN_DELIVERY_CREATE'
    EXPORTING
      VBSK_I           = GS_VBSK_I
*     NO_COMMIT        = ' '
*     IF_SYNCHRON      = 'X'
*     VBLS_POS_RUECK   = ' '
*     IF_CREATE_DEC    = ' '
*     IF_NO_DEQUE      = ' '
*     IT_HANDLING_UNITS          =
*     IF_QUAN_NO_CHECK =
*     IF_MASS_READ_MAT_SW        = ' '
*     IS_DELIVERY_EXTEND         =
*     IS_CONTROL       =
      IS_BORGR_CONTROL = GS_BORGR_CT
*     IF_NO_INIT       = ' '
*     IF_NO_PARTNER_DIALOG       = 'X'
*     IF_CHECK_UOM     = ' '
*     IT_LECOMP        =
*     IF_CALL_ACTIVITY = ' '
    IMPORTING
      VBSK_E           = GS_VBSK_E
*     ET_SPLITPROT     =
*     ET_VBADR         =
*     ET_VBPA          =
    TABLES
      XKOMDLGN         = GT_XKOMDLGN
      XVBFS            = GT_XVBFS
      XVBLS            = GT_XVBLS
*     XXLIPS           =
*     XVERKO           =
*     XVERPO           =
      IT_GN_PARTNER    = GT_PARTNER
*     IT_GN_LIPSPO     =
*     IT_GN_LIPSRF     =
*     IT_GN_TEXTH      =
*     IT_GN_TEXTL      =
*     IT_GN_HUSERNR    =
*     IT_GN_SERNR      =
*     IT_TMSTMP        =
*     ET_SPE_VBFS      =
      IT_BAPIADDR1     = GT_ADDRESS
*     IT_GN_HU_HEADER_EPC        =
*     IT_GN_HU_ITEMS_EPC         =
*     IT_GN_HURES      =
    .

  READ TABLE GT_XVBLS INTO GS_XVBLS INDEX 1.
  IF GS_XVBLS-VBELN_LIF IS NOT INITIAL.
*   コミット
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = ABAP_TRUE.

    WRITE GS_XVBLS-VBELN_LIF.
  ELSE.
*   ロールバック
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    DATA:
      LT_MESSAGE_TAB TYPE ESP1_MESSAGE_TAB_TYPE,
      LS_MESSAGE     TYPE ESP1_MESSAGE_WA_TYPE.

    LOOP AT GT_XVBFS INTO GS_XVBFS.

      LS_MESSAGE-MSGID  = GS_XVBFS-MSGID.
      LS_MESSAGE-MSGTY  = GS_XVBFS-MSGTY.
      LS_MESSAGE-MSGNO  = GS_XVBFS-MSGNO.
      LS_MESSAGE-MSGV1  = GS_XVBFS-MSGV1.
      LS_MESSAGE-MSGV2  = GS_XVBFS-MSGV2.
      LS_MESSAGE-MSGV3  = GS_XVBFS-MSGV3.
      LS_MESSAGE-MSGV4  = GS_XVBFS-MSGV4.
      LS_MESSAGE-LINENO = SY-TABIX.
      APPEND LS_MESSAGE TO LT_MESSAGE_TAB.

    ENDLOOP.

    CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
      TABLES
        I_MESSAGE_TAB = LT_MESSAGE_TAB.

*    CL_DEMO_OUTPUT=>DISPLAY( GT_XVBFS ).
  ENDIF.

以上。

<think>好的,我现在需要回答用户关于SAP中BADI MB_MIGO_BADI是否会在BAPI BAPI_GOODSMVT_CREATE中被调用,以及它们的调用关系和实现机制的问题。首先,我需要回顾一下SAP中BADI和BAPI的基本概念。 BADI(Business Add-In)是SAP的一种增强技术,允许用户在不修改标准代码的情况下扩展功能。MB_MIGO_BADI应该与MIGO事务相关,可能在货物移动时触发。而BAPI_GOODSMVT_CREATE是一个用于创建货物移动的BAPI,通常用于后台处理,比如通过外部系统调用。 用户的问题核心是:当使用BAPI_GOODSMVT_CREATE时,是否会触发MB_MIGO_BADI这个BADI。根据经验,BADI的触发通常依赖于特定的事务代码或应用模块。例如,在MIGO事务中执行操作时,相关的BADI会被调用。但BAPI可能不会触发同样的BADI,因为它们可能绕过了某些前端检查或增强点。 接下来需要验证这一点。查阅相关资料,特别是用户提供的引用,其中引用[3]提到使用BAPI_GOODSMVT_CREATE时,可以通过EXTENSIONIN参数传递扩展字段,这可能涉及到BADI增强。但具体到MB_MIGO_BADI是否被调用,可能需要更深入的分析。 考虑到SAP的机制,BADI的实现通常与特定应用程序关联。如果MB_MIGO_BADI是为MIGO事务设计的,可能在BAPI调用时不会自动触发,除非BAPI显式调用了相关增强。需要检查BAPI_GOODSMVT_CREATE的文档或源代码,看是否有调用MB_MIGO_BADI的逻辑。 另外,用户引用[3]提到通过EXTENSIONIN传递扩展字段,这可能涉及到不同的BADI,例如在BAPI层面定义的增强点,而不是MIGO事务中的BADI。因此,MB_MIGO_BADI可能不会被BAPI_GOODSMVT_CREATE直接调用。 总结:MB_MIGO_BADI主要用于MIGO事务的前端处理,而BAPI_GOODSMVT_CREATE作为后台接口,可能不会触发该BADI。但需要注意是否有隐式的调用或配置使两者关联。建议通过实际测试或查看SAP官方文档确认。</think>关于MB_MIGO_BADI增强在BAPI_GOODSMVT_CREATE中的调用关系,需从SAP增强机制和业务逻辑实现两个层面分析: ### 一、调用关系结论 **MB_MIGO_BADI不会在标准BAPI_GOODSMVT_CREATE调用过程中自动触发**。该BADI设计用于MIGO事务界面操作,与BAPI存在以下差异: 1. **执行路径差异** - MIGO事务通过$$TCODE$$驱动前端校验和界面交互,会触发$$MB_MIGO_BADI$$[^3] - BAPI_GOODSMVT_CREATE直接访问物料凭证创建函数模块$$MB_CREATE_GOODS_MOVEMENT$$,绕过了MIGO界面层 2. **增强机制差异** BAPI增强需通过: - 扩展结构$$EXTENSIONIN$$参数传递增强字段[^3] - 特定BAPI增强点(如$$BADI_GOODSMVT$$) - 隐式增强点插入 ### 二、实现机制验证方法 || MIGO事务 | BAPI调用 | |---------|----------|----------| | **BADI触发** | 自动触发MB_MIGO_BADI | 需显式配置增强 | | **表更新** | 通过MKPF/MSEG更新[^2] | 同MKPF/MSEG但跳过部分检查[^1] | | **增强方式** | 标准BADI实现 | 需使用BAPI专用增强点 | ### 三、解决方案建议 若需要在BAPI调用中实现类似MB_MIGO_BADI逻辑: 1. 创建新BADI实现$$MB_CREATE_GOODS_MOVEMENT$$的隐式增强 2. 使用$$USEREXIT_SAVE_DOCUMENT$$等标准出口 3. 通过$$CALL BADI$$语句在自定义增强中显式调用 ```abap METHOD if_ex_goodsmvt_create~save_document_prepare. " 在此处插入自定义逻辑 CALL BADI l_mb_migo_badi->item_check EXPORTING is_mseg = cs_mseg. ENDMETHOD. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

觉得有用的佛系投币哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值