考虑到交货单有多种情况
1个行项目 多个数量,需要对应多个序列号
多个行项目,多个数量,需要多个序列号
最终形成的FM如下
FUNCTION ZIF_BDC_VLPOD_RE_S.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(PVBELN) TYPE VBELN OPTIONAL
*" VALUE(PBUDAT) TYPE BUDAT OPTIONAL
*" VALUE(LV_MODE) TYPE APQI-PUTACTIVE DEFAULT 'N'
*" VALUE(PLGORT) TYPE ZE_UMLGO OPTIONAL
*" EXPORTING
*" VALUE(OSTATUS) TYPE BAPI_MTYPE
*" VALUE(OMESSAGE) TYPE BAPI_MSG
*" TABLES
*" T_GERNR STRUCTURE ZMMS_STO_GERNR OPTIONAL
*"----------------------------------------------------------------------
DATA:LT_BDCMESSAGE LIKE TABLE OF BDCMSGCOLL.
DATA:LS_BDCMESSAGE LIKE BDCMSGCOLL.
DATA:LT_RETURN TYPE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA:LVNAME TYPE STRING.
DATA:ITEMC(2) TYPE C.
DATA:LTLIPS TYPE TABLE OF LIPS WITH HEADER LINE.
DATA:LSLIPS LIKE LIPS.
CLEAR BDCDATA[].
SELECT * INTO TABLE LTLIPS FROM LIPS WHERE VBELN = PVBELN.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '4006'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIKP-VBELN'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=ENT2'.
PERFORM BDC_FIELD USING 'LIKP-VBELN' PVBELN.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=T\02'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1502SUBSCREEN_HEADER'.
PERFORM BDC_FIELD USING 'LIKP-BLDAT' PBUDAT.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1110SUBSCREEN_BODY'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'TVPODVB-GRUND(01)'.
PERFORM BDC_FIELD USING 'GV_XSIT' '2'.
* PERFORM BDC_FIELD USING 'LIKP-PODAT' PBUDAT.
LOOP AT LTLIPS[] INTO LSLIPS.
IF SY-TABIX < 10.
ITEMC = '0' && SY-TABIX.
ELSE.
ITEMC = SY-TABIX.
ENDIF.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=T\01'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1502SUBSCREEN_HEADER'.
PERFORM BDC_FIELD USING 'LIKP-BLDAT' SY-DATUM.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1104SUBSCREEN_BODY'.
IF ITEMC = '01'.
LVNAME = 'LIPS-LGORT('&& ITEMC &&')'.
PERFORM BDC_FIELD USING LVNAME PLGORT.
ENDIF.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=PODQ'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1502SUBSCREEN_HEADER'.
PERFORM BDC_FIELD USING 'LIKP-BLDAT' SY-DATUM.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1104SUBSCREEN_BODY'.
PERFORM BDC_FIELD USING 'GV_XSIT' '2'.
IF T_GERNR[] IS NOT INITIAL.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=PSER_T'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1502SUBSCREEN_HEADER'.
PERFORM BDC_FIELD USING 'LIKP-BLDAT' SY-DATUM.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1104SUBSCREEN_BODY'.
LVNAME = 'LIPS-POSNR(' && ITEMC &&')'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' LVNAME.
PERFORM BDC_FIELD USING 'GV_XSIT' '2'.
LVNAME = 'TVPODVB-SELKZ(' && ITEMC &&')'.
PERFORM BDC_FIELD USING LVNAME 'X'.
LOOP AT T_GERNR INTO DATA(LSGERNR) WHERE POSNR = LSLIPS-POSNR.
AT NEW POSNR.
PERFORM BDC_DYNPRO USING 'SAPLIPW1' '0300'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=RWS'.
ENDAT.
SHIFT LSGERNR-ZZROW LEFT DELETING LEADING '0'.
IF LSGERNR-ZZROW < 10.
ITEMC = '0' && LSGERNR-ZZROW.
ELSE.
ITEMC = LSGERNR-ZZROW.
ENDIF.
LVNAME = 'RIPW0-SERNR('&& ITEMC &&')'.
PERFORM BDC_FIELD USING LVNAME LSGERNR-GERNR.
ENDLOOP.
ENDIF.
ENDLOOP.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SICH_T'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1502SUBSCREEN_HEADER'.
PERFORM BDC_FIELD USING 'LIKP-BLDAT' SY-DATUM.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 1104SUBSCREEN_BODY'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'TVPODVB-GRUND(03)'.
PERFORM BDC_FIELD USING 'GV_XSIT' '2'.
DATA:LS_PARAMS TYPE CTU_PARAMS.
LS_PARAMS-DISMODE = 'N'.
LS_PARAMS-RACOMMIT = 'X'.
LS_PARAMS-UPDMODE = 'S'.
CALL TRANSACTION 'VLPOD' USING BDCDATA
* OPTIONS FROM ls_params
MODE LV_MODE UPDATE 'S'
MESSAGES INTO LT_BDCMESSAGE.
CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
TABLES
IMT_BDCMSGCOLL = LT_BDCMESSAGE
EXT_RETURN = LT_RETURN.
* 上面这个主要为了看具体报错的原因,做了BDCMESSAGe与BAPIRET2的转换
READ TABLE LT_BDCMESSAGE TRANSPORTING NO FIELDS
WITH KEY
MSGTYP = 'S'
MSGID = 'VL' "表示保存成功
MSGNR = '311'.
IF SY-SUBRC <> 0.
OSTATUS = 'E'.
OMESSAGE = 'pod确认失败!'.
LOOP AT LT_BDCMESSAGE INTO LS_BDCMESSAGE.
OMESSAGE = OMESSAGE && LS_BDCMESSAGE-MSGID && LS_BDCMESSAGE-MSGNR && LS_BDCMESSAGE-MSGV1 && LS_BDCMESSAGE-MSGV2 && LS_BDCMESSAGE-MSGV3 && LS_BDCMESSAGE-MSGV4.
ENDLOOP.
ELSE .
OSTATUS = 'S'.
OMESSAGE = 'pod确认成功!'.
ENDIF.
ENDFUNCTION.