VA05批量更新BAPI:SD_BULK_CHANGE

碰到一个需求,需要实现VA05批量更新定价的功能,前台VA05可以对销售订单进行批量更新工厂,物料,定价,货币,DEBUG了一下发现底层调用的函数为SD_BULK_CHANGE。

其实批量更新销售订单上的定价使用BAPI_SALESORDER_CHANGE就可以完成,代码如下:

  DATA:
    GV_SALESDOCUMENT    TYPE VBAK-VBELN,
    GS_ORDER_HEADER_IN  TYPE BAPISDH1,
    GS_ORDER_HEADER_INX TYPE BAPISDH1X,
    GS_LOGIC_SWITCH     TYPE BAPISDLS,
    GT_ITEM             TYPE STANDARD TABLE OF BAPISDITM,
    GS_ITEM             TYPE BAPISDITM,
    GT_ITEMX            TYPE STANDARD TABLE OF BAPISDITMX,
    GS_ITEMX            TYPE BAPISDITMX,
    GT_RETURN           TYPE BAPIRET2_T.

  GV_SALESDOCUMENT = '0000004517'.                "SO号

  GS_ORDER_HEADER_INX-UPDATEFLAG = 'U'.           "更新标识

  GS_LOGIC_SWITCH-PRICING    = 'B'.               "定价类型B
  GS_LOGIC_SWITCH-COND_HANDL = 'X'.               "重新处理条件

  GS_ITEM-ITM_NUMBER = '000010'.                  "明细号
  APPEND GS_ITEM TO GT_ITEM.

  GS_ITEMX-ITM_NUMBER = '000010'.                 "明细号
  GS_ITEMX-UPDATEFLAG = 'U'.                      "更新标识
  APPEND GS_ITEMX TO GT_ITEMX.

  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      SALESDOCUMENT    = GV_SALESDOCUMENT
      ORDER_HEADER_INX = GS_ORDER_HEADER_INX
      LOGIC_SWITCH     = GS_LOGIC_SWITCH
    TABLES
      RETURN           = GT_RETURN
      ORDER_ITEM_IN    = GT_ITEM
      ORDER_ITEM_INX   = GT_ITEMX.

  CL_DEMO_OUTPUT=>DISPLAY( GT_RETURN ) .

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT = 'X'.

VA05前台使用的则是SD_BULK_CHANGE去更新定价,该函数对应前台下拉菜单的四个批量更新功能,我这里只针对批量更新定价写了测试代码,其他的后面用到再测吧

*&---------------------------------------------------------------------*
*& Report ZTEST_UPDATE_PRICE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_UPDATE_PRICE.
TABLES:VBAP.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    S_VBELN FOR VBAP-VBELN.
SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.
  PERFORM FRM_UPDATE_PRICE.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_PRICE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPDATE_PRICE .
  DATA:
    LT_DOCUMENTS     TYPE STANDARD TABLE OF VBMTV,
    LV_FUNTION       TYPE SY-UCOMM VALUE 'MPRX',
    LS_DYNPRO_FIELDS TYPE RV45C,
    LS_ERROR         TYPE VBFS.

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE LT_DOCUMENTS
   FROM VBAP
  WHERE VBELN IN S_VBELN.

  LOOP AT LT_DOCUMENTS ASSIGNING FIELD-SYMBOL(<FS_DOCUMENTS>).
    <FS_DOCUMENTS>-SELKZ = 'X'.
  ENDLOOP.

  CALL FUNCTION 'SD_BULK_CHANGE'
    EXPORTING
      FUNCTION             = LV_FUNTION
      DYNPRO_FIELDS        = LS_DYNPRO_FIELDS
      IV_SUPPRESS_MESSAGES = 'X'
    IMPORTING
      PROTOKOLL            = LS_ERROR
    TABLES
      DOCUMENTS            = LT_DOCUMENTS.

  CL_DEMO_OUTPUT=>DISPLAY( LS_ERROR ).

*  COMMIT WORK.
ENDFORM.

 

批量更新物料、工厂等操作,可以在这个函数里面打断点,前台执行DEBUG看下系统标准逻辑是怎么传值的应该就可以。

以上。


版权声明:本文为DeveloperMrMeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。