BDC修改已經拆分批次的內向交貨單的某些欄位
阿新 • • 發佈:2021-01-07
以下程式碼是修改已經拆分了批次的內向交貨單的一些欄位,通過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