以下代码是修改已经拆分了批次的内向交货单的一些字段,通过BDC的技术实现,以供参考。
FORM VL32N_BDC_DGTRK TABLES P_DLVR STRUCTURE LS_DGTRK
USING P_VBELN LIKE LIPS-VBELN.
DATA: L_NUMB TYPE N LENGTH 2,
L_NUMB_SUB TYPE N LENGTH 2.
DATA: L_LICHN_FIELD TYPE C LENGTH 30.
DATA: L_POSNR_FIELD TYPE C LENGTH 30,
L_POSNR_VALUE LIKE LIPS-POSNR,
PO_NUMBER LIKE LIPS-VGBEL,
PO_ITEM LIKE LIPS-VGPOS,
L_LICHN_VALUE LIKE LIPS-POSNR.
DATA: L_CHMULT_FIELD TYPE C LENGTH 30.
DATA: L_LICHN_FIELD_SUB TYPE C LENGTH 30.
DATA: L_POSNR_FIELD_SUB TYPE C LENGTH 30.
DATA: L_CHPL_T_CODE TYPE C LENGTH 30.
DATA: LT_LIPS LIKE TABLE OF LIPS WITH HEADER LINE.
DATA: L_TEXT TYPE CHAR200.
DATA: L_DB_CNT TYPE P DECIMALS 0, "总笔数
L_INT TYPE P DECIMALS 0, "整数部分
LV_DB_CNT_SUB TYPE P DECIMALS 0, "总笔数
LV_INT_SUB TYPE P DECIMALS 0, "整数部分
LV_DECIMAL_SUB TYPE P DECIMALS 0, "余数
L_INDEX LIKE SY-TABIX, "当前笔
L_DECIMAL TYPE P DECIMALS 0. "余数
DATA: LV_HSDAT(10) TYPE C,
LV_VFDAT(10) TYPE C.
DATA:IT_TAB TYPE STANDARD TABLE OF TLINE, "传入内容
WA_TAB LIKE LINE OF IT_TAB,
G_NAME TYPE THEAD-TDNAME. "文本对象名称
DATA:L_LIFEXPOS LIKE LIPS-LIFEXPOS. "外部项目号
****创建临时变量用于存储数据
DATA: TEMP_LICHN LIKE LIPS-LICHN,
TEMP_HSDAT LIKE LIPS-HSDAT,
TEMP_VFDAT LIKE LIPS-VFDAT,
TEMP_KDMAT LIKE LIPS-KDMAT,
TEMP_EAN11 LIKE LIPS-EAN11.
DATA: LV_TIME TYPE I,
LV_TIME_SUB TYPE I.
DATA(LT_DLVR) = P_DLVR[].
CLEAR: L_DB_CNT.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_LIPS
FROM LIPS
WHERE VBELN = P_VBELN.
DELETE LT_LIPS WHERE POSNR(1) = '9'.
L_DB_CNT = LINES( LT_LIPS ).
CLEAR:BDCDATA,BDCDATA[].
*=================填充BDC=======================*
*---------------------选择屏幕-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '4104'."屏幕
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIKP-VBELN'."光标
PERFORM BDC_FIELD USING 'BDC_OKCODE' '/00'."OK_CODE
PERFORM BDC_FIELD USING 'LIKP-VBELN' P_VBELN."内向交货单
CLEAR: L_NUMB,L_INDEX.
SORT LT_LIPS BY POSNR.
* L_DB_CNT = SY-DBCNT.
L_INT = L_DB_CNT DIV 8.
L_DECIMAL = L_DB_CNT MOD 8.
LOOP AT LT_LIPS WHERE POSNR+0(1) NE '9'.
SELECT *
FROM LIPS
INTO TABLE @DATA(LT_SUB_LIPS)
WHERE VBELN = @LT_LIPS-VBELN
AND UECHA = @LT_LIPS-POSNR
AND POSNR LIKE '9%'.
DATA(LV_DB_CN_SUB) = LINES( LT_SUB_LIPS ).
L_INDEX = SY-TABIX.
******以下为添加文本内容*******
**** 调用BAPI:CREATE_TEXT
CLEAR: G_NAME, WA_TAB, IT_TAB.
CONCATENATE LT_LIPS-VBELN LT_LIPS-POSNR INTO G_NAME.
IF STRLEN( L_TEXT ) > 120.
WA_TAB-TDFORMAT = '01'.
WA_TAB-TDLINE = L_TEXT+0(120).
APPEND WA_TAB TO IT_TAB.
WA_TAB-TDFORMAT = '02'.
WA_TAB-TDLINE = L_TEXT+120(*).
APPEND WA_TAB TO IT_TAB.
ELSE.
WA_TAB-TDFORMAT = '01'.
WA_TAB-TDLINE = L_TEXT.
APPEND WA_TAB TO IT_TAB.
ENDIF.
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
FID = '0001' "Text ID
FLANGUAGE = SY-LANGU "语言代码
FNAME = G_NAME "文本名称
FOBJECT = 'VBBP' "文本对象
SAVE_DIRECT = 'X' "直接保存标识
TABLES
FLINES = IT_TAB
EXCEPTIONS
NO_INIT = 1
NO_SAVE = 2
OTHERS = 3.
L_NUMB = L_NUMB + 1.
CONCATENATE 'LIPS-POSNR(' L_NUMB ')' INTO L_POSNR_FIELD.
CONCATENATE 'RV50A-CHMULT(' L_NUMB ')' INTO L_CHMULT_FIELD.
CONCATENATE '=CHPL_T' L_NUMB INTO L_CHPL_T_CODE.
IF LT_SUB_LIPS[] IS NOT INITIAL.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' L_CHPL_T_CODE.
PERFORM BDC_FIELD USING 'BDC_CURSOR' L_CHMULT_FIELD.
ENDIF.
CLEAR L_NUMB_SUB.
L_NUMB_SUB = 1.
LV_INT_SUB = LV_DB_CN_SUB DIV 8.
LV_DECIMAL_SUB = LV_DB_CN_SUB MOD 8.
LOOP AT LT_SUB_LIPS INTO DATA(LS_SUB_LIPS).
DATA(LV_INDEX_SUB) = SY-TABIX.
LV_INDEX_SUB = LV_INDEX_SUB + 1.
L_NUMB_SUB = L_NUMB_SUB + 1.
IF L_NUMB_SUB = 2.
DATA(LV_FLAG) = 'X'.
ENDIF.
READ TABLE LT_DLVR INTO DATA(LS_DLVR) WITH KEY EBELN = LS_SUB_LIPS-VGBEL
EBELP = LS_SUB_LIPS-VGPOS+1(5)
DLVNUM = LS_SUB_LIPS-LFIMG.
IF SY-SUBRC = 0.
DATA(LV_TABIX) = SY-TABIX.
TEMP_LICHN = LS_DLVR-LICHN. "供应商批号
TEMP_HSDAT = LS_DLVR-HSDAT. "生产日期
TEMP_VFDAT = LS_DLVR-VFDAT. "有效期至
TEMP_KDMAT = LS_DLVR-KDMAT. "炉号
TEMP_EAN11 = LS_DLVR-EAN11. "检验要求
L_TEXT = LS_DLVR-REMARK. "备注
DELETE LT_DLVR INDEX LV_TABIX.
ENDIF.
CLEAR:L_LIFEXPOS.
L_LIFEXPOS = LS_DLVR-POSNR.
CONCATENATE 'LIPS-POSNR(' L_NUMB_SUB ')' INTO L_POSNR_FIELD_SUB.
CONCATENATE 'LIPS-LICHN(' L_NUMB_SUB ')' INTO L_LICHN_FIELD.
*---------------------选择屏幕1-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=IDET_T'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_CURSOR' L_POSNR_FIELD_SUB.
PERFORM BDC_FIELD USING 'BDC_CURSOR' L_LICHN_FIELD.
PERFORM BDC_FIELD USING L_LICHN_FIELD TEMP_LICHN. "供应商批号
*---------------------选择屏幕2-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '3000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=T\09'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 3502SUBSCREEN_HEADER'."
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-POSNR'.
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 3202SUBSCREEN_BODY'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 0611SUBSCREEN_BOTTOM'."OK_CODE "
*---------------------选择屏幕21-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '3000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=T\02'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 3502SUBSCREEN_HEADER'."
PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPMV50A 3216SUBSCREEN_BODY'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-POSNR'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-LIFEXPOS'.
PERFORM BDC_FIELD USING 'LIPS-LIFEXPOS' L_LIFEXPOS.
*---------------------选择屏幕3-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '3000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BACK_T'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-EAN11'. "
IF TEMP_HSDAT IS NOT INITIAL.
PERFORM CHANGE_DATE USING TEMP_HSDAT
LV_HSDAT.
PERFORM BDC_FIELD USING 'LIPS-HSDAT' LV_HSDAT. "生产日期
ENDIF.
IF TEMP_VFDAT IS NOT INITIAL.
PERFORM CHANGE_DATE USING TEMP_VFDAT
LV_VFDAT.
PERFORM BDC_FIELD USING 'LIPS-VFDAT' LV_VFDAT. "有效期至
ENDIF.
PERFORM BDC_FIELD USING 'RV50A-KDMAT_LA' TEMP_KDMAT. " 炉号
PERFORM BDC_FIELD USING 'LIPS-EAN11' TEMP_EAN11. "检验要求
* 拆分的子项目超过8行以后,需要点击下一页的按钮
AT LAST.
DATA(LV_LAST_SUB) = 'X'.
ENDAT.
IF LV_LAST_SUB = ''.
IF L_NUMB_SUB = 8.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=NPAG_T'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-POSNR(01)'.
LV_TIME_SUB = LV_TIME_SUB + 1.
CLEAR: L_NUMB_SUB.
IF LV_INDEX_SUB = LV_INT_SUB * 8.
L_NUMB_SUB = 8 - LV_DECIMAL_SUB.
L_NUMB_SUB = L_NUMB_SUB - 1.
ENDIF.
ENDIF.
ENDIF.
CLEAR: TEMP_LICHN, "供应商批号
TEMP_HSDAT, "生产日期
TEMP_VFDAT, "有效期至
TEMP_KDMAT, "炉号
TEMP_EAN11. "检验要求
CLEAR: L_POSNR_FIELD_SUB,LS_DLVR.
ENDLOOP.
IF LT_SUB_LIPS[] IS NOT INITIAL.
IF LV_TIME_SUB > 0.
DO LV_TIME_SUB TIMES.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=PPAG_T'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-POSNR(01)'.
ENDDO.
ENDIF.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=CHPL_T01'."L_CHPL_T_CODE.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'RV50A-CHMULT(01)'."L_CHMULT_FIELD.
ENDIF.
* 主项目超过8行以后,需要点击下一页的按钮
AT LAST.
DATA(LV_LAST) = 'X'.
ENDAT.
IF LV_LAST = ''.
IF L_NUMB = 8.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=NPAG_T'."OK_CODE
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'LIPS-POSNR(01)'.
CLEAR: L_NUMB.
IF L_INDEX = L_INT * 8.
L_NUMB = 8 - L_DECIMAL.
ENDIF.
ENDIF.
ENDIF.
CLEAR:L_CHMULT_FIELD,L_POSNR_FIELD,L_CHPL_T_CODE,
LS_DLVR,LV_INDEX_SUB,LV_TIME_SUB,LV_LAST_SUB.
ENDLOOP.
*---------------------选择屏幕4-------------------*
PERFORM BDC_DYNPRO USING 'SAPMV50A' '1000'."屏幕
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SICH_T'."OK_CODE
* PERFORM bdc_field USING 'LV70T-SPRAS' 'ZH'."OK_CODE
OPTION-DISMODE = 'N'.
OPTION-UPDMODE = 'S'.
OPTION-DEFSIZE = 'A'.
L_TCODE = 'VL32N'.
PERFORM CALL_BDC_TRANSACTION USING L_TCODE 'X'.
FORM bdc_field USING fnam fval.
IF fval IS NOT INITIAL.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDIF.
ENDFORM. "bdc_field
*&---------------------------------------------------------------------*
*& Form bdc_field_null
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FNAM text
*----------------------------------------------------------------------*
FORM bdc_field_null USING fnam.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = ''.
APPEND bdcdata.
ENDFORM. "bdc_field
FORM call_bdc_transaction USING p_tcode LIKE sy-tcode fill_msg.
CLEAR:messtab,messtab[].
***add by mark 2015-12-05 >>>>
* IF p_tcode = 'XK01'.
* option-NOBINPT = 'X'.
* option-NOBIEND = 'J'.
* ENDIF.
***add by mark 2015-12-05 >>>>
CALL TRANSACTION p_tcode USING bdcdata
OPTIONS FROM option
MESSAGES INTO messtab.
READ TABLE messtab WITH KEY msgtyp = 'E'.
IF sy-subrc <> 0.
READ TABLE messtab WITH KEY msgtyp = 'S' msgid = 'F2'.
IF sy-subrc NE 0.
READ TABLE messtab WITH KEY msgtyp = 'S'.
messtab-msgtyp = 'E'.
ELSEIF messtab-msgnr NOT IN r_msgnr[].
messtab-msgtyp = 'E'.
ENDIF.
ENDIF.
CHECK fill_msg = 'X'.
gt_return-type = messtab-msgtyp.
PERFORM read_message USING gt_return-message.
gt_return-message_v1 = messtab-msgv1.
gt_return-message_v2 = messtab-msgv2.
gt_return-message_v3 = messtab-msgv3.
gt_return-message_v4 = messtab-msgv4.
APPEND gt_return.
ENDFORM. "call_bdc_transaction