SAP BDC(Batch Data Conversion )技术之我见
一、概述
在SAP系統里,重復輸入數據時,(數據不同,但是操作是相同的,典型的情形就是主數據導入),大致過程不外乎是這樣: 輸入一個t-code,
進入一個某個屏幕,然后輸入一個值(有時還要加上一些附加的checkbox選項等),點執行或者確定按鈕,
進入另一個屏幕,在某些字段輸入值(也可能是標注checkbox選中或者不選中)或者修改這些字段里的值。
然后按“Eneter”……
最后按“SAVE”……,
一條記錄完成了,繼續下一條,如此循環。?
如果數據量非常大的話,讓一個“人”來做的話,可能是真是受不了的。但是對于計算機來說,就很簡單了。
SAP通過一個特殊的程序(T-code:SHDB)把用戶的一次業務操作的所有過程記錄下來。
從用戶輸入transaction code(事務代碼),點下“Start Recording”開始,對于用戶的來說是一次普通的業務操作,但是SAP卻在記錄:
1.光標放到哪個字段,(在程序中不用改變)
2.填入了什么值,(變量,循環中的Internal Table 某個字段)
3.點擊了什么按鈕(在程序中不用改變)
本次操作的作為一個“代表”,是一個“模板”,告訴SAP系統以怎樣的方式來執行程序,也就是用計算機的語言來描述如果手工操作的話應該是怎樣的一個過程。
在實際應用中,有兩種方法生成BDC數據,一種就是上面提到的先把數據導入到內表中,另一種就是直接通過程序中處理的數據循環調用BDC子程序。
BDC中的兩個非常重要的子例程是
*----------------------------------------------------------------------*
*??????? Start new screen????????????????????????????????????????????? *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
? CLEAR BDCDATA.
? BDCDATA-PROGRAM? = PROGRAM.
? BDCDATA-DYNPRO?? = DYNPRO.
? BDCDATA-DYNBEGIN = 'X'.
? APPEND BDCDATA.
ENDFORM.
*----------------------------------------------------------------------*
*??????? Insert field????????????????????????????????????????????????? *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
? IF FVAL <> NODATA.
??? CLEAR BDCDATA.
??? BDCDATA-FNAM = FNAM.
??? BDCDATA-FVAL = FVAL.
??? APPEND BDCDATA.
? ENDIF.
ENDFORM.
第一個子程序是記錄當前程序進入了哪個屏幕,第二個程序是記錄用戶想要在屏幕字段上輸入的字段值,
只要循環調用這兩個子程序,即可生成bdcdata.
生成bdcdata之后,調用事務碼如下:
??? CALL TRANSACTION 'MEK1' USING bdcdata MODE 'E' UPDATE 'S'
??????????? MESSAGES INTO itab_msg.
以上兩個子程序可以被直接COPY到自己的程序中使用,碰到特殊數據時進行修改使用,這是BDC 的核心程序。
要仔細研究!
二、實例
具體步驟是:t-code:shdb-->new recording-->record name,tranzaction code-->enter(start recording)
回車之后就會進入你想要調用的事務碼中
一步一步完成需要的操作,就會出現你剛才操作的記錄,這記錄你操作的整個過程,包含你的輸入值,你操作的功能碼等等。
退出到shdb界面。保存剛才的操作點-->program,輸入程序名-->
程序描述-->點源代碼進入程序
剛才的所有操作就會生成BDC程序,其實包含你所輸入的數據,以及你所操作的功能碼
參考生成的程序,調用BDC進行數據操作。具體生成的代碼如下:
report ZZZZ
?????? no standard page heading line-size 255.
include bdcrecx1.
parameters: dataset(132) lower case.
***??? DO NOT CHANGE - the generated data section - DO NOT CHANGE??? ***
*
*?? If it is nessesary to change the data section use the rules:
*?? 1.) Each definition of a field exists of two lines
*?? 2.) The first line shows exactly the comment
*?????? '* data element: ' followed with the data element
*?????? which describes the field.
*?????? If you don't have a data element use the
*?????? comment without a data element name
*?? 3.) The second line shows the fieldname of the
*?????? structure, the fieldname must consist of
*?????? a fieldname and optional the character '_' and
*?????? three numbers and the field length in brackets
*?? 4.) Each field must be type C.
*
*** Generated data section with specific formatting - DO NOT CHANGE? ***
data: begin of record,
* data element: KSCHA
??????? KSCHL_001(004),
* data element: EKORG
??????? EKORG_002(004),
* data element: WERKS_D
??????? WERKS_003(004),
* data element: ELIFN
??????? LIFNR_004(010),
* data element: EMLIF
??????? ZZEMLIF_005(010),
* data element: MATNR
??????? MATNR_01_006(018),
* data element: KODATAB
??????? DATAB_007(010),
* data element: KODATBI
??????? DATBI_008(010),
* data element: KSTBM
??????? KSTBM_01_009(019),
* data element: KSTBM
??????? KSTBM_02_010(019),
* data element: KBETR
??????? KBETR_01_011(016),
* data element: KBETR
??????? KBETR_02_012(016),
* data element: KODATAB
??????? DATAB_013(010),
* data element: KODATBI
??????? DATBI_014(010),
????? end of record.
*** End generated data section ***
start-of-selection.
perform open_dataset using dataset.
perform open_group.
do.
read dataset dataset into record.
if sy-subrc <> 0. exit. endif.
perform bdc_dynpro????? using?'SAPMV13A' '0100'.
perform bdc_field?????? using 'BDC_CURSOR'
????????????????????????????? 'RV13A-KSCHL'.
perform bdc_field?????? using?'BDC_OKCODE'
????????????????????????????? '/00'.
perform bdc_field?????? using 'RV13A-KSCHL'
??????????????????????????????record-KSCHL_001.
perform bdc_dynpro????? using?'SAPMV13A' '1506'.
perform bdc_field?????? using?'BDC_CURSOR'
????????????????????????????? 'KOMG-MATNR(01)'.
perform bdc_field?????? using 'BDC_OKCODE'
????????????????????????????? '/00'.
perform bdc_field?????? using 'KOMG-EKORG'
??????????????????????????????record-EKORG_002.
perform bdc_field?????? using 'KOMG-WERKS'
??????????????????????????????record-WERKS_003.
perform bdc_field?????? using 'KOMG-LIFNR'
??????????????????????????????record-LIFNR_004.
perform bdc_field?????? using 'KOMG-ZZEMLIF'
??????????????????????????????record-ZZEMLIF_005.
perform bdc_field?????? using 'KOMG-MATNR(01)'
??????????????????????????????record-MATNR_01_006.
perform bdc_dynpro????? using?'SAPMV13A' '1506'.
perform bdc_field?????? using?'BDC_CURSOR'
????????????????????????????? 'TEXT_DEFAULT-TEXT(01)'.
perform bdc_field?????? using 'BDC_OKCODE'
????????????????????????????? '=PSTF'.
perform bdc_dynpro????? using?'SAPMV13A' '0303'.
perform bdc_field?????? using?'BDC_CURSOR'
????????????????????????????? 'KONM-KBETR(02)'.
perform bdc_field?????? using 'BDC_OKCODE'
????????????????????????????? '/00'.
perform bdc_field?????? using 'RV13A-DATAB'
????????????????????????????? record-DATAB_007.
perform bdc_field?????? using 'RV13A-DATBI'
??????????????????????????????record-DATBI_008.
perform bdc_field?????? using 'KONM-KSTBM(01)'
??????????????????????????????record-KSTBM_01_009.
perform bdc_field?????? using 'KONM-KSTBM(02)'
??????????????????????????????record-KSTBM_02_010.
perform bdc_field?????? using 'KONM-KBETR(01)'
??????????????????????????????record-KBETR_01_011.
perform bdc_field?????? using 'KONM-KBETR(02)'
??????????????????????????????record-KBETR_02_012.
perform bdc_dynpro????? using?'SAPMV13A' '0303'.
perform bdc_field?????? using?'BDC_CURSOR'
????????????????????????????? 'KONM-KSTBM(01)'.
perform bdc_field?????? using 'BDC_OKCODE'
????????????????????????????? '=SICH'.
perform bdc_field?????? using 'RV13A-DATAB'
??????????????????????????????record-DATAB_013.
perform bdc_field?????? using 'RV13A-DATBI'
??????????????????????????????record-DATBI_014.
perform bdc_transaction using 'MEK1'.
enddo.
perform close_group.
perform close_dataset using dataset.
代碼說明:
代碼中紅色部分就是生成的BDC操作,你可以根據需要進行必要的修改,以實現你需要的功能。
代碼中藍色的部分就是需要提供的輸入值,你可以把值上傳到BDC RECORD中,也可以從程序的內表中
讀取你所需要填入的值。如果是只導入數據,比如是主數據導入 ,就可以把數據先上傳到內表中,然后進行BDC操作。
如果是調用事務碼進行某些操作,只要把數據填到適當的位置就可以了。
代碼中黃色的部分是指當前正在處理的程序名以及屏幕號。
代碼中紫色的部分是指當前光標所在的位置。即屏幕上第幾行的哪個字段上。也就是當前是往這個字段填值。
代碼中“表名-字段名(編號)”是指當前是在往屏幕上的這個字段的第幾行填值。在這里,如果有多行需要數據輸入,可以采用循環的方式進行,但是循環的時候需要用concatenate字符串連接來實現()內編號的遞增。保證填入數據的正確性。這是一個細致的工作,但是只要按步驟來,應該不會出錯的。
例如表itab中存放著所有需要的數據。并且屏幕上需要輸入5行數據,每行三個字段。這時我們可以這樣實現。
data: t1,t2,t3. "注t1,t2,t3與每行的三個字段類型相一致
data m type c.
perform bdc_dynpro using '程序名' '屏幕號'.??? "進入屏幕
perform bdc_field using 'BDC_CURSOR' '表名-字段名(01)'.
perform bdc_field using 'BDC_OKCODE' '功能碼'.
loop at itab into wa.
m = sy-tabix.
concatenate '表名-字段名(' m ')' into t1.
concatenate '表名-字段名(' m ')' into t2.
concatenate '表名-字段名(' m ')' into t3.
perform bdc_field using? t1 wa-t1.
perform bdc_field using? t2 wa-t2.
perform bdc_field using? t3 wa-t3.
endloop.
對于多行輸入或者從一個屏幕進入另一個屏幕之后需要多行輸入的可以使用這種循環嵌套的方法實現
減少了代碼重復。對于數據量很小的可以直接逐行填值。
代碼中灰色部分“BDC_OKCODE“ ”/00“等是指你所操作的功能碼。包括回車,保存,雙擊等。分清功能碼也是一項非常重要的工作。當這些工作都做完之后。所需要的bdcdata也就生成了。這時只需要使用bdcdata調用事務碼就可以了。
?CALL TRANSACTION 'MEK1' USING bdcdata MODE 'E' UPDATE 'S'
??????????? MESSAGES INTO itab_msg.
三、問題
當然,有時會遇到這樣的情況,就是在遇到金額或者單位或者數量時,往往會出現錯誤提示:輸入的字段比實際字段長。這時我們想明明輸入的值和字段字義是一樣的,為什么會出現這種錯誤提示呢?
其實這是做BDC的時候最需要注意的事,因為字段類型雖然一樣,但是我們保存到BDCDaTA中的時候,數值等是按照默認長度保存的,但是我們輸入的時候需要都這些多余的字符串刪除掉,這時我們就需要對數據進行處理,有兩種處理方法,一種就是用SHIFT移位操作刪除多余的字符串,也可以通過修改子例程BDC_FIELD來實現。 假設我們需要輸入金額,用第二種方法來實現,就可以這么修改子例程BDC_FIELD。
? DATA: it LIKE bsid-dmbtr,
??????? fval2(13) TYPE c.
? IF fval <> it.
??? MOVE fval TO fval2.
??? CLEAR bdcdata.
??? bdcdata-fnam = fnam.
??? bdcdata-fval = fval2.
??? APPEND bdcdata.
? ENDIF.
調用的時候遇到金額、數量或者單位時,就定義這樣一個子例程來供調用。就不會出現錯誤提示了。
對于出現單位在中文中沒有定義的錯誤,可以參考http://www.cnblogs.com/clsoho/archive/2010/03/08/1680614.html
以后遇到其它問題會繼續追加。
總結
以上是生活随笔為你收集整理的SAP BDC(Batch Data Conversion )技术之我见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP MM 用户不希望采购订单一旦Re
- 下一篇: SAP CRM市场营销表结构