【BDC】BDC錄屏實現
1.簡單屏幕
1 REPORT ztest. 2 3 DATA: lt_bdcdata TYPE tab_bdcdata. 4 5 *建BDC數據 6 PERFORM frm_build_bdc. 7 *執行BDC 8 PERFORM frm_proc_bdc. 9 10 FORM frm_build_bdc. 11 * init 12 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '0101'. 13 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 14 PERFORM bdc_field TABLES lt_bdcdata USING 'VBAK-AUART' 'S001'. 15 16 * header 17 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 18 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 19 PERFORM bdc_field TABLES lt_bdcdata USING 'KUAGV-KUNNR' 'H001'. 20 21 * header 22 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMSSY0' '0120'. 23 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_CURSOR' '05/07'. "彈出屏幕,雙擊選擇,需要CURSOR光標點 24 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=CHOO'. 25 26 * items 27 * lv_posnr = lv_posnr + 10. 28 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 29 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KETDAT' '2016.03.10'. 30 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KPRGBZ' 'D'. 31 PERFORM bdc_field TABLES lt_bdcdata USING 'VBKD-PRSDT' '2016.03.10'. 32 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-MABNR(01)' 'A21005'. 33 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KWMENG(01)' '2'. 34 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KPRGBZ' 'D'. 35 36 * 保存邏輯 37 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 38 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=SICH'. 39 PERFORM bdc_field TABLES lt_bdcdata USING 'KUAGV-KUNNR' 'H001'. 40 PERFORM bdc_field TABLES lt_bdcdata USING 'KUWEV-KUNNR' 'H001'. 41 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KETDAT' '2016.03.10'. 42 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KPRGBZ' 'D'. 43 PERFORM bdc_field TABLES lt_bdcdata USING 'VBKD-PRSDT' '2016.03.10'. 44 ENDFORM. 45 46 FORM frm_proc_bdc . 47 48 DATA: l_mode(1) VALUE 'P'. 49 DATA: l_opt LIKE ctu_params. 50 DATA: l_message TYPE bapiret1-message. 51 DATA: lt_messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE. 52 53 CLEAR: l_opt. 54 l_opt-dismode = l_mode. 55 l_opt-updmode = 'S'. 56 57 CALL TRANSACTION 'VA01' USING lt_bdcdata 58 OPTIONS FROM l_opt MESSAGES INTO lt_messtab. 59 ENDFORM. " FRM_PROC_BDC 60 *&---------------------------------------------------------------------* 61 *& Form bdc_dynpro 62 *&---------------------------------------------------------------------* 63 FORM bdc_dynpro TABLES pt_bdcdata STRUCTURE bdcdata 64 "插入正確名稱 <...> 65 USING p_program TYPE bdc_prog 66 p_dynpro TYPE bdc_dynr. 67 CLEAR: pt_bdcdata. 68 pt_bdcdata-program = p_program. "BDC程序名 69 pt_bdcdata-dynpro = p_dynpro. "BDC屏幕編號 70 pt_bdcdata-dynbegin = 'X'. "BDC 屏幕啟動 71 APPEND pt_bdcdata. 72 ENDFORM. " BDC_DYNPRO 73 *&---------------------------------------------------------------------* 74 *& Form bdc_field 75 *&---------------------------------------------------------------------* 76 * text 77 *----------------------------------------------------------------------* 78 * -->PT_BDCDATA text 79 * -->P_FNAM text 80 * -->P_FVAL text 81 *----------------------------------------------------------------------* 82 FORM bdc_field TABLES pt_bdcdata STRUCTURE bdcdata 83 "插入正確名稱 <...> 84 USING p_fnam TYPE fnam_____4 85 p_fval TYPE bdc_fval. 86 87 CLEAR: pt_bdcdata. 88 pt_bdcdata-fnam = p_fnam. "BDC屏幕編號 89 pt_bdcdata-fval = p_fval. "BDC 屏幕啟動 90 APPEND pt_bdcdata. 91 ENDFORM. " BDC_DYNPRO
2.涉及行
1 *&---------------------------------------------------------------------* 2 *& Report ZBDC 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 9 REPORT zbdc. 10 11 DATA: lt_bdcdata TYPE tab_bdcdata. 12 13 * 建BDC數據 14 PERFORM frm_build_bdcdata. 15 * 執行BDC 16 PERFORM frm_proc_bdc. 17 18 FORM frm_build_bdcdata. 19 DATA: lv_posnr TYPE vbap-posnr. 20 DATA: lv_kwmeng TYPE vbap-kwmeng. 21 DATA: lv_matnr TYPE vbap-matnr. 22 * init:初始化屏幕 23 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '0101' . 24 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 25 PERFORM bdc_field TABLES lt_bdcdata USING 'VBAK-AUART' 'S001'. 26 27 * header 28 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 29 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 30 PERFORM bdc_field TABLES lt_bdcdata USING 'KUAGV-KUNNR' 'H001'. 31 32 *選擇銷售組織屏幕,必須光標 33 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMSSY0' '0120'. 34 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_CURSOR' '05/07'. "彈出屏幕,雙擊選擇,需要CURSOR光標點 35 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=CHOO'. 36 37 * items 38 DO 3 TIMES. 39 lv_posnr = lv_posnr + 10. 40 lv_kwmeng = lv_kwmeng + 1. 41 42 IF lv_posnr = '000010'. 43 lv_matnr = 'A21005'. 44 ELSEIF lv_posnr = '000020'. 45 lv_matnr = 'A21011'. 46 ELSEIF lv_posnr = '000030'. 47 lv_matnr = 'A21014'. 48 ENDIF. 49 *處理數值字段在右側問題 50 * WRITE lv_kwmeng TO l_fval NO-GROUPING LEFT-JUSTIFIED. 51 * 主要問題集中在處理新增行的問題,從第二行開始循環,每次填入值在RV45A-MABNR(02)中 52 * 通過定位按鈕來處理 53 IF sy-tabix = 1. 54 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 55 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 56 57 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-MABNR(01)' lv_matnr. 58 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KWMENG(01)' '1'. 59 60 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 61 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=POPO'. 62 63 * 屏幕編號 64 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '0251'. 65 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=POSI'. 66 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-POSNR' lv_posnr. 67 ELSE. 68 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 69 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'. 70 71 72 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-MABNR(02)' lv_matnr. 73 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-KWMENG(02)' '1'. 74 75 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 76 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=POPO'. 77 78 * 屏幕編號 79 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '0251'. 80 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=POSI'. 81 PERFORM bdc_field TABLES lt_bdcdata USING 'RV45A-POSNR' lv_posnr. 82 ENDIF. 83 84 ENDDO. 85 86 *保存邏輯 87 PERFORM bdc_dynpro TABLES lt_bdcdata USING 'SAPMV45A' '4001'. 88 PERFORM bdc_field TABLES lt_bdcdata USING 'BDC_OKCODE' '=SICH'. 89 90 ENDFORM. 91 FORM frm_proc_bdc . 92 93 DATA: l_mode(1) VALUE 'A'. 94 DATA: l_opt LIKE ctu_params. 95 DATA: l_message TYPE bapiret1-message. 96 DATA: lt_messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE. 97 98 CLEAR: l_opt. 99 l_opt-dismode = l_mode. 100 l_opt-updmode = 'S'. 101 102 CALL TRANSACTION 'VA01' USING lt_bdcdata 103 OPTIONS FROM l_opt MESSAGES INTO lt_messtab. 104 ENDFORM. " FRM_PROC_BDC 105 106 107 * &---------------------------------------------------------------------* 108 * & Form bdc_dynpro 109 * &---------------------------------------------------------------------* 110 FORM bdc_dynpro TABLES pt_bdcdata STRUCTURE bdcdata 111 "插入正確名稱 <...> 112 USING p_program TYPE bdc_prog 113 p_dynpro TYPE bdc_dynr. 114 CLEAR: pt_bdcdata. 115 pt_bdcdata-program = p_program. "BDC程序名 116 pt_bdcdata-dynpro = p_dynpro. "BDC屏幕編號 117 pt_bdcdata-dynbegin = 'X'. "BDC 屏幕啟動 118 APPEND pt_bdcdata. 119 ENDFORM. " BDC_DYNPRO 120 * &---------------------------------------------------------------------* 121 * & Form bdc_field 122 * &---------------------------------------------------------------------* 123 * text 124 * ----------------------------------------------------------------------* 125 * -->PT_BDCDATA text 126 * -->P_FNAM text 127 * -->P_FVAL text 128 * ----------------------------------------------------------------------* 129 FORM bdc_field TABLES pt_bdcdata STRUCTURE bdcdata 130 "插入正確名稱 <...> 131 USING p_fnam 132 p_fval . 133 CLEAR: pt_bdcdata. 134 pt_bdcdata-fnam = p_fnam. "BDC屏幕編號 135 pt_bdcdata-fval = p_fval. "BDC 屏幕啟動 136 APPEND pt_bdcdata. 137 ENDFORM. " BDC_DYNPRO
問題:
遇到的問題:
1.源字段是一個數值類型,目標字段是一個字符類型,賦值后,從調試中看到字符類型字段里始終為空,百思不得其解。后來我想到,由于字符類型字段長度過長(255),而數值類型賦值到字符類型時默認使用了右對齊,造成實際內容在字符串的右端,從調試器中看不到,賦值到屏幕上也被截斷了。
這個問題跟上面一樣可以用兩種方法解決:
1)target = source.
CONDENSE target. "去出多余空格,保留一個
2)WRITE source TO target LEFT-JUSTIFIED. "左移
DATA: source TYPE p DECIMALS 5 VALUE '20.10392'.
DATA: target TYPE char50.
target = source.
WRITE source TO target LEFT-JUSTIFIED.
2.錄屏后會出現同一個字段對應不同的東西,比如 NEWKO 這里我既表示資產號,又表示供應商號。
前面FUNCTION里的輸入參數你就要定義2個了,然后再付給NEWKO。
3.轉換數據
有的客戶系統屏幕用的是歐洲的金額的顯示,像10.000,00
錄屏時,給的金額顯示10000.00,這里就需要轉換數據才能完成錄屏。
DATA LV_WRBTR(10) TYPE C.
** 轉換數據\
DATA:
STRING1(1) TYPE C VALUE '.',
STRING2(1) TYPE C VALUE ','.
LV_WRBTR = I_WRBTR.
CONDENSE LV_WRBTR.
REPLACE STRING1 WITH STRING2 INTO LV_WRBTR.
posted on 2020-06-03 09:13 color_story 閱讀(443) 評論(0) 收藏 舉報
浙公網安備 33010602011771號