利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号

   某项目中,根据客户需求,在VL02N发货过账之前,需要先更改发货单行项目的数量和序列号,下面程序一是VL02N发货过账并更改拣配数量的函数,程序二是程序一的FUNCTION-POOL ,里面有定义的全局变量以及更改发货单行项目数量和序列号的子程序,希望对用到的兄弟有帮助。  

程序一:

FUNCTION ZWMS_VL02N.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  TABLES
*"      INPUT STRUCTURE  ZWMS_VL02N_INPUT OPTIONAL
*"      INPUT_SN STRUCTURE  ZWMS_VL02N_INPUT_SN OPTIONAL
*"      INPUT_QN STRUCTURE  ZWMS_INPUT_QN OPTIONAL
*"      OUTPUT STRUCTURE  ZWMS_VL02N_OUTPUT OPTIONAL
*"----------------------------------------------------------------------

DATA:I_VBKOK TYPE VBKOK.
DATA:BEGIN OF I_VBPOK_TAB OCCURS 12.
        INCLUDE STRUCTURE VBPOK.
DATA:END OF I_VBPOK_TAB.
DATA:I_EF_ERROR_ANY_0 TYPE XFELD.
DATA:P_FLAG(1),
     P_MESSAGE(200).

DATA:G_LIKP LIKE  LIKP.
DATA:G_LIPS LIKE  LIPS.
DATA GV_14(14TYPE C.
DATA:P_VBELN LIKE LIKP-VBELN.

DATA:I_PROTT TYPE PROTT OCCURS 0 WITH HEADER LINE .

FREE MEMORY ID 'INPUT'.
EXPORT INPUT TO MEMORY ID 'INPUT'.

FREE MEMORY ID 'INPUT_SN'.
EXPORT INPUT_SN TO MEMORY ID 'INPUT_SN'.

CLEAR P_FLAG.CLEAR P_MESSAGE.
PERFORM FRM_CHANGE_DELIVERY CHANGING P_FLAG
                                     P_MESSAGE.
IF P_FLAG = 'E'.
   REFRESH OUTPUT.
   CLEAR OUTPUT.
   OUTPUT-FLAG = 'E'.
   OUTPUT-NOTES = P_MESSAGE.
   APPEND OUTPUT.
   CLEAR OUTPUT.
ELSE.
    CLEAR P_VBELN.
    CLEAR INPUT.
    READ TABLE INPUT INDEX 1.
    IF SY-SUBRC EQ 0.
       P_VBELN = INPUT-VBELN.
    ENDIF.

    CLEAR I_VBKOK.
    CLEAR I_EF_ERROR_ANY_0.
    MOVE-CORRESPONDING INPUT TO OUTPUT.
*     ---交货抬头数据
    I_VBKOK-VBELN_VL        = P_VBELN.        "DELIVERY NUMBER
    I_VBKOK-WABUC           = 'X'.            "AUTOMATIC PGI
    I_VBKOK-WADAT_IST       = SY-DATUM.


    LOOP AT INPUT.
         SELECT SINGLE * INTO G_LIPS FROM LIPS
              WHERE VBELN = INPUT-VBELN
                AND POSNR = INPUT-POSNR.
          I_VBPOK_TAB-VBELN_VL    = G_LIPS-VBELN.      "DELIVERY NUMBER
          I_VBPOK_TAB-POSNR_VL    = G_LIPS-POSNR.
          I_VBPOK_TAB-VBELN       = G_LIPS-VBELN.
          I_VBPOK_TAB-POSNN       = G_LIPS-POSNR.
          I_VBPOK_TAB-MATNR       = G_LIPS-MATNR.
          I_VBPOK_TAB-LFIMG       = INPUT-LFIMG.
          I_VBPOK_TAB-CHARG       = INPUT-CHARG.
          I_VBPOK_TAB-LGORT       = INPUT-LGORT.
          GV_14                   = INPUT-LFIMG.
          CONDENSE GV_14.
          I_VBPOK_TAB-PIKMG       = GV_14 .
          APPEND I_VBPOK_TAB.
    ENDLOOP.




*   ---发货过账
    REFRESH I_PROTT.
    CLEAR I_PROTT.
    CALL FUNCTION 'WS_DELIVERY_UPDATE'
       EXPORTING
         VBKOK_WA       = I_VBKOK
         COMMIT         = 'X'
         DELIVERY       = P_VBELN
         UPDATE_PICKING = 'X'
       IMPORTING
         EF_ERROR_ANY_0 = I_EF_ERROR_ANY_0
       TABLES
         VBPOK_TAB      = I_VBPOK_TAB
         PROT           = I_PROTT
       EXCEPTIONS
         ERROR_MESSAGE  = 1
         OTHERS         = 2.
    IF I_EF_ERROR_ANY_0 = 'X'.
        LOOP AT I_PROTT WHERE MSGTY = 'E'.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
               EXPORTING
                 MSGID = I_PROTT-MSGID
                 MSGNR = I_PROTT-MSGNO
                 MSGV1 = I_PROTT-MSGV1
                 MSGV2 = I_PROTT-MSGV2
                 MSGV3 = I_PROTT-MSGV3
                 MSGV4 = I_PROTT-MSGV4
               IMPORTING
                 MESSAGE_TEXT_OUTPUT = OUTPUT-NOTES.
        ENDLOOP.

        OUTPUT-FLAG = 'E'.
        CONCATENATE '发货过账失败:' OUTPUT-NOTES INTO OUTPUT-NOTES.
    ELSE.

        SELECT MAX( VBELN )
               INTO OUTPUT-MBLNR
               FROM VBFA
               WHERE VBELV = P_VBELN
                 AND VBTYP_N = 'R'.

        IF OUTPUT-MBLNR <> ''.
            OUTPUT-FLAG = 'S'.
            OUTPUT-NOTES = '发货过账成功!'.

          "更新D类物资库存(不合格品库更新)
            CALL FUNCTION 'ZWMS_UNQUALIF_DTYPE_UPDATE'
              EXPORTING
                QNDEX = '1000000000'
              TABLES
                INPUT = INPUT_QN.
        ELSE.
            OUTPUT-FLAG = 'E'.
            OUTPUT-NOTES = '发货过账失败!'.
        ENDIF.
    ENDIF.

    APPEND OUTPUT.
    CLEAR OUTPUT.

ENDIF.

*--------------------------日志信息start--------------------------
*日志信息定义
DATA:LOG1 TYPE TABLE OF ZWMS_LOG013_01 WITH HEADER LINE,
     LOG2 TYPE TABLE OF ZWMS_LOG013_02 WITH HEADER LINE,
     LOG3 TYPE TABLE OF ZWMS_LOG013_03 WITH HEADER LINE,
     LOG4 TYPE TABLE OF ZWMS_LOG013_04 WITH HEADER LINE.
DATA:LV_FKEY(100),
     LV_FINDX TYPE I,
     LV_UUID TYPE SYSUUID-X,
     TM_UUID(100).

CLEAR LV_UUID.CLEAR TM_UUID.
CALL FUNCTION 'SYSTEM_UUID_CREATE'
     IMPORTING
        UUID = LV_UUID.

TM_UUID = LV_UUID.

CLEAR LV_FKEY.
CONCATENATE SY-UNAME SY-DATUM SY-UZEIT TM_UUID INTO LV_FKEY.

CLEAR LV_FINDX.
REFRESH LOG1.
CLEAR LOG1.
LOOP AT INPUT.
     LV_FINDX = LV_FINDX + 1.
     MOVE-CORRESPONDING INPUT TO LOG1.
     LOG1-FKEY  = LV_FKEY.
     LOG1-FINDX = LV_FINDX.
     APPEND LOG1.
     CLEAR LOG1.
ENDLOOP.


CLEAR LV_FINDX.
REFRESH LOG2.
CLEAR LOG2.
LOOP AT INPUT_SN.
     LV_FINDX = LV_FINDX + 1.
     MOVE-CORRESPONDING INPUT_SN TO LOG2.
     LOG2-FKEY  = LV_FKEY.
     LOG2-FINDX = LV_FINDX.
     APPEND LOG2.
     CLEAR LOG2.
ENDLOOP.


CLEAR LV_FINDX.
REFRESH LOG3.
CLEAR LOG3.
LOOP AT OUTPUT.
     LV_FINDX = LV_FINDX + 1.
     MOVE-CORRESPONDING OUTPUT TO LOG3.
     LOG3-FKEY  = LV_FKEY.
     LOG3-FINDX = LV_FINDX.
     APPEND LOG3.
     CLEAR LOG3.
ENDLOOP.

CLEAR LV_FINDX.
REFRESH LOG4.
CLEAR LOG4.
LOOP AT INPUT_QN.
     LV_FINDX = LV_FINDX + 1.
     MOVE-CORRESPONDING INPUT_QN TO LOG4.
     LOG4-FKEY  = LV_FKEY.
     LOG4-FINDX = LV_FINDX.
     APPEND LOG4.
     CLEAR LOG4.
ENDLOOP.


IF LOG1[] IS NOT INITIAL.
   MODIFY ZWMS_LOG013_01 FROM TABLE LOG1.
ENDIF.

IF LOG2[] IS NOT INITIAL.
   MODIFY ZWMS_LOG013_02 FROM TABLE LOG2.
ENDIF.

IF LOG3[] IS NOT INITIAL.
   MODIFY ZWMS_LOG013_03 FROM TABLE LOG3.
ENDIF.

IF LOG4[] IS NOT INITIAL.
   MODIFY ZWMS_LOG013_04 FROM TABLE LOG4.
ENDIF.
*--------------------------日志信息end--------------------------


ENDFUNCTION.



程序二:

FUNCTION-POOL ZWMS_VL02N.                    "MESSAGE-ID ..

   TABLES LIKP.
   DATA:HEADER_DATA  LIKE BAPIOBDLVHDRCHG,
       HEADER_CONTROL  LIKE BAPIOBDLVHDRCTRLCHG.

   DATA:IT_RETURN  TYPE  STANDARD  TABLE  OF BAPIRET2  WITH  HEADER  LINE.
   DATA:IT_HEADER_DEADLINES  TYPE  STANDARD  TABLE  OF BAPIDLVDEADLN  WITH  HEADER  LINE.

   DATA:ITEM_DATA  LIKE BAPIOBDLVITEMCHG  OCCURS  0  WITH  HEADER  LINE,
       ITEM_CONTROL  LIKE BAPIOBDLVITEMCTRLCHG  OCCURS  0  WITH  HEADER  LINE,
       WA_LIPS  LIKE LIPS  OCCURS  0  WITH  HEADER  LINE.

   DATA:ITEM_DATA_SPL  LIKE /SPE/BAPIOBDLVITEMCHG  OCCURS  0  WITH  HEADER  LINE.


   DATA:V_16( 16TYPE  C.
   DATA:V_DEL  LIKE BAPIOBDLVHDRCHG-DELIV_NUMB.
   DATA: INPUT  TYPE  TABLE  OF ZWMS_VL02N_INPUT  WITH  HEADER  LINE.
   DATA:INPUT_SN  TYPE  TABLE  OF ZWMS_VL02N_INPUT_SN  WITH  HEADER  LINE.

   DATA:P_VBELN  LIKE LIKP-VBELN.

*  DATA:VBKOK_WA TYPE VBKOK,
*       VBPOK_TAB TYPE VBPOK OCCURS 0 WITH HEADER LINE.
*
*
*  DATA:LT_PROTT TYPE PROTT OCCURS 0 WITH HEADER LINE .

   DATA:DN_HEADER_DATA       LIKE BAPIOBDLVHDRCHG  OCCURS  0  WITH  HEADER  LINE,
       DN_HEADER_CONTROL    LIKE BAPIOBDLVHDRCTRLCHG,
       DN_DELIVERY          LIKE LIKP-VBELN,
       DN_RETURN            LIKE BAPIRET2  OCCURS  0  WITH  HEADER  LINE,
       DN_ITEM_DATA         LIKE  TABLE  OF BAPIOBDLVITEMCHG  WITH  HEADER  LINE,
       DN_ITEM_CONTROL      LIKE BAPIOBDLVITEMCTRLCHG  OCCURS  0  WITH  HEADER  LINE,
       DN_ITEM_SERIAL_NO    LIKE  TABLE  OF BAPIDLVITMSERNO  WITH  HEADER  LINE,
       DN_TECHN_CONTROL     LIKE BAPIDLVCONTROL. "ADD BY CHANGGF 20110219
* INCLUDE LZWMS_VL02ND...                    " Local class definition
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANGE_DELIVERY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHANGE_DELIVERY  CHANGING P_FLAG
                                  P_MESSAGE.
   REFRESH  INPUT. CLEAR  INPUT.
   IMPORT  INPUT  FROM  MEMORY  ID  'INPUT'.

   REFRESH INPUT_SN. CLEAR INPUT_SN.
   IMPORT INPUT_SN  FROM  MEMORY  ID  'INPUT_SN'.

   IF  INPUT[]  IS  NOT  INITIAL.
      CLEAR P_VBELN.
      READ  TABLE  INPUT  INDEX  1.
      IF SY-SUBRC  EQ  0.
        P_VBELN =  INPUT-VBELN.
      ENDIF.

      "更改交货数量和序列号
      SELECT  SINGLE *  FROM LIKP  WHERE VBELN = P_VBELN.
      CONCATENATE SY-DATUM SY-UZEIT  INTO V_16.

     HEADER_DATA-UNLOAD_PT = LIKP-ABLAD.
     HEADER_DATA-UNIT_OF_WT = LIKP-GEWEI.
     HEADER_DATA-INCOTERMS1 = LIKP-INCO1.
     HEADER_DATA-INCOTERMS2 = LIKP-INCO2.
     HEADER_DATA-DOOR = LIKP-LGTOR.
     HEADER_DATA-DLV_BLOCK = LIKP-LIFSK.
     HEADER_DATA-DLV_PRIO = LIKP-LPRIO.
     HEADER_DATA-NET_WEIGHT = LIKP-NTGEW.
     HEADER_DATA-ROUTE = LIKP-ROUTE.
     HEADER_DATA-DELIV_NUMB = LIKP-VBELN.
     HEADER_DATA-VOLUMEUNIT = LIKP-VOLEH.
     HEADER_DATA-VOLUME = LIKP-VOLUM.
     HEADER_DATA-SHIP_COND = LIKP-VSBED.

     V_DEL = LIKP-VBELN.
     HEADER_DATA-DELIV_NUMB = LIKP-VBELN.
     HEADER_CONTROL-GDSI_DATE_FLG =  'X'.
     IT_HEADER_DEADLINES-TIMETYPE =  'WSHDRWADTI'.
     IT_HEADER_DEADLINES-TIMESTAMP_UTC = V_16.
      APPEND IT_HEADER_DEADLINES.

      REFRESH ITEM_DATA.
      CLEAR ITEM_DATA.

      REFRESH DN_HEADER_DATA.
      CLEAR DN_HEADER_DATA.

      LOOP  AT  INPUT.
           REFRESH WA_LIPS.
           CLEAR WA_LIPS.
           SELECT   SINGLE *  INTO WA_LIPS  FROM LIPS  WHERE VBELN = P_VBELN  AND POSNR =  INPUT-POSNR.
           IF WA_LIPS-LFIMG <>  INPUT-LFIMG  OR WA_LIPS-CHARG <>  INPUT-CHARG.
             ITEM_DATA-DELIV_NUMB = WA_LIPS-VBELN.
             ITEM_DATA-DELIV_ITEM = WA_LIPS-POSNR.
             ITEM_DATA-MATERIAL = WA_LIPS-MATNR.
              IF WA_LIPS-CHARG <>  INPUT-CHARG.
                ITEM_DATA-BATCH =  INPUT-CHARG.
              ELSE.
                ITEM_DATA-BATCH = WA_LIPS-CHARG.
              ENDIF.

              IF WA_LIPS-LFIMG <>  INPUT-LFIMG.
                 ITEM_DATA-DLV_QTY =  INPUT-LFIMG.
                 ITEM_DATA-DLV_QTY_IMUNIT =  INPUT-LFIMG.
              ELSE.
                 ITEM_DATA-DLV_QTY = WA_LIPS-LFIMG.
                 ITEM_DATA-DLV_QTY_IMUNIT = WA_LIPS-LFIMG.
              ENDIF.
             ITEM_DATA-FACT_UNIT_NOM = WA_LIPS-UMVKZ.
             ITEM_DATA-FACT_UNIT_DENOM = WA_LIPS-UMVKN.
             ITEM_DATA-CONV_FACT = WA_LIPS-UMREF.
             ITEM_DATA-GROSS_WT = WA_LIPS-BRGEW.
             ITEM_DATA-NET_WEIGHT = WA_LIPS-NTGEW.
             ITEM_DATA-UNIT_OF_WT = WA_LIPS-GEWEI.
             ITEM_DATA-VOLUMEUNIT = WA_LIPS-VOLEH.
             ITEM_DATA-SALES_UNIT = WA_LIPS-VRKME.
             ITEM_DATA-BASE_UOM = WA_LIPS-MEINS.
             ITEM_DATA-STOCK_TYPE = WA_LIPS-INSMK.
             ITEM_DATA-VAL_TYPE = WA_LIPS-BWTAR.
             ITEM_DATA-INSPLOT = WA_LIPS-QPLOS.
             ITEM_DATA-VOLUME = WA_LIPS-VOLUM.
              APPEND ITEM_DATA.
              CLEAR ITEM_DATA.

             ITEM_CONTROL-DELIV_NUMB = WA_LIPS-VBELN.
             ITEM_CONTROL-DELIV_ITEM = WA_LIPS-POSNR.
             ITEM_CONTROL-CHG_DELQTY =  'X'.
              APPEND ITEM_CONTROL.
           ENDIF.

           LOOP  AT INPUT_SN  WHERE VBELN = P_VBELN  AND POSNR =  INPUT-POSNR.
               DN_ITEM_SERIAL_NO-DELIV_NUMB = P_VBELN.
               DN_ITEM_SERIAL_NO-ITM_NUMBER =  INPUT-POSNR.
               DN_ITEM_SERIAL_NO-SERIALNO = INPUT_SN-SERNR.
                APPEND DN_ITEM_SERIAL_NO.
                CLEAR DN_ITEM_SERIAL_NO.
           ENDLOOP.

           IF WA_LIPS-LGORT <>  INPUT-LGORT.
              CLEAR ITEM_DATA_SPL.
             ITEM_DATA_SPL-DELIV_NUMB = WA_LIPS-VBELN.
             ITEM_DATA_SPL-DELIV_ITEM = WA_LIPS-POSNR.
             ITEM_DATA_SPL-PICK_DENIAL =  'X'.
             ITEM_DATA_SPL-STGE_LOC =  INPUT-LGORT.
              APPEND ITEM_DATA_SPL  TO ITEM_DATA_SPL.
           ENDIF.
      ENDLOOP.

      IF ITEM_DATA[]  IS  NOT  INITIAL  OR DN_ITEM_SERIAL_NO[]  IS  NOT  INITIAL  OR ITEM_DATA_SPL[]  IS  NOT  INITIAL.
          CALL  FUNCTION  'BAPI_OUTB_DELIVERY_CHANGE'
            EXPORTING
             HEADER_DATA      = HEADER_DATA
             HEADER_CONTROL   = HEADER_CONTROL
             DELIVERY         = V_DEL
            TABLES
             HEADER_DEADLINES = IT_HEADER_DEADLINES
             ITEM_DATA        = ITEM_DATA
             ITEM_CONTROL     = ITEM_CONTROL
             ITEM_SERIAL_NO   = DN_ITEM_SERIAL_NO
             ITEM_DATA_SPL    = ITEM_DATA_SPL
              RETURN           = IT_RETURN.

          READ  TABLE IT_RETURN  WITH  KEY  TYPE =  'E'.
          IF SY-SUBRC <>  0.
            COMMIT  WORK  AND  WAIT.
           P_FLAG =  'S'.
           P_MESSAGE =  '修改交货单成功'.
          ELSE.
           P_FLAG =  'E'.
            LOOP  AT IT_RETURN  WHERE  TYPE =  'E'.
              CALL  FUNCTION  'MESSAGE_TEXT_BUILD'
                   EXPORTING
                    MSGID = IT_RETURN- ID
                    MSGNR = IT_RETURN- NUMBER
                    MSGV1 = IT_RETURN-MESSAGE_V1
                    MSGV2 = IT_RETURN-MESSAGE_V2
                    MSGV3 = IT_RETURN-MESSAGE_V3
                    MSGV4 = IT_RETURN-MESSAGE_V4
                   IMPORTING
                    MESSAGE_TEXT_OUTPUT = P_MESSAGE.
            ENDLOOP.
          ENDIF.
      ELSE.
         P_FLAG =  'S'.
         P_FLAG =  '没有要修改的交货单明细'.
      ENDIF.




   ENDIF.
ENDFORM.                     " FRM_CHANGE_DELIVERY


函数用到的输入参数(INPUT、INPUT_SN、INPUT_QN)、输出参数(OUTPUT)参数如下图:

利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号_第1张图片

利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号_第2张图片

利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号_第3张图片

利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号_第4张图片

利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号_第5张图片





你可能感兴趣的:(利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号)