Step 1. 录制 BDC.
SM35/SHDB 进入 BDC 录制界面, 开始录制.
定义通过 EXCEL 上传用到的参数,
定义 BDC 用到的参数.
Note:
上面的方式执行者也必须有执行 Tcode 的权限, 某些情况下 User 可能没此权限, 这种情况下就要换另外一种方式去做(会话).
1. 数据传输程序从数据文件中获取数据传输信息,生成批输入会话, 会话通常以后台模式调用 SAP 事务并模拟用户对话进行数据传输. 同时, 会话中还包含所有需要传输的数据, 这些数据将在处理会话时输入应用事务的各个屏幕, 并更新数据库.
2. 会话的创建过程与处理过程是分开进行的. 在创建批输入对话之后, 可以通过程序 RSBDCSUB 或批输入监控器(SM35)来处理该会话, 会话的处理过程即通过事务将数据传输到 SAP 系统的过程.
3. 创建批输入会话之后, 如果会话以后台模式处理(包括提交后台作业或者在批输入监按器中以后台模式运行), 系统将使用会话创建用户来进行相关事务的权限检查. 如果以交互模式处理会话, 则将检查在线处理该会话的用户权限.
4. 对于某些字段类型为 QUAN 的, 如果定义上传的内表字段的类型也为 QUAN, 则程式执行时,可能出现 "Input value is longer than screen field." 解决这个的办法就是把这个定义成 char 型.
5. F1, F4 功能以及自定义的 F1, F4帮助都不能被录制.
6. 系统(system)和(Help)菜单中的功能均无法录制.
7. 默认变式, 即事务变式中的字段值不能被录制
8. 错误和警告信息不能被录制
9. 有些较新的 SAP 控件不支持录制及批量输入的功能.
10. 有些新的 Tcode 不支持录制
11. 滚动条功能不能被录制, 录制时应使用功能键 F21-F24.
12. 最好使用字符型来定义内表字段, 不要用 Like 去参照其它数据对象来定义, 那样容易报错, 不同用户定义的日期风格会存在差异, 使用 write date2 to date1 来实现日期格式的转换.
Step 2. 把录制好的 BDC 转成 ABAP 程式.
DATA:DATA:if_intern TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE. vf_start_col TYPE i,
vf_start_row TYPE i,
vf_end_col TYPE i,
vf_end_row TYPE i.
DATA:vf_index TYPE i.
FIELD-SYMBOLS:<fs>.
DATA:BEGIN OF bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA:END OF bdcdata.
DATA:BEGIN OF messtab OCCURS 0.
INCLUDE STRUCTURE bdcmsgcoll.
DATA:END OF messtab.
DATA:BEGIN OF errlist OCCURS 0.
INCLUDE STRUCTURE itab0.
DATA:END OF errlist.
DATA:cnt TYPE i.
DATA:tcode LIKE tstc-tcode,
cnt_input TYPE i,
cnt_error TYPE i,
cnt_update TYPE i,
c_update TYPE c VALUE 'S'.
Start-of-selection.
*********************************************************PERFORM upload_from_pc USING i_file1.
PERFORM modify.
PERFORM output_result.
PERFORM output_error USING i_file2.
FORM***********************************************************modify .
DESCRIBE TABLE itab0 LINES cnt.
IF cnt <> 0.
LOOP AT itab0.
PERFORM check_data.
PERFORM pre_bdcdata.
PERFORM call_transaction_form.
ENDLOOP.
ENDIF.
ENDFORM.
FORM************************************************************pre_bdcdata .
REFRESH: bdcdata.
PERFORM scr_1.
PERFORM scr_2.
PERFORM scr_3.
PERFORM scr_4.
ENDFORM.
FORM***********************************************************scr_1 .
PERFORM bdc_dynpro USING 'SAPLAIST' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR' 'ANLA-ANLN1'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_field USING 'ANLA-ANLN1' itab0-anln1.
PERFORM bdc_field USING 'ANLA-BUKRS' itab0-bukrs.
ENDFORM.
FORM**************************************************************************bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM." BDC_DYNPRO
*&---------------------------------------------------------------------*
*&Form BDC_FIELD
*&---------------------------------------------------------------------*
FORMbdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM." BDC_FIELD
FORM*******************************************************call_transaction_form .
CALL TRANSACTION tcode
USING bdcdata
MODE s_mode
UPDATE c_update
MESSAGES INTO messtab.
IF sy-subrc NE 0.
ADD 1 TO cnt_error.
PERFORM append_err_file.
ELSE.
ADD 1 TO cnt_update.
ENDIF.
ENDFORM.
FORMappend_err_file .
MOVE-CORRESPONDING itab0 TO errlist.
APPEND errlist.
CLEAR errlist.
ENDFORM." APPEND_ERR_FILE
*&---------------------------------------------------------------------*
*&Form OUTPUT_RESULT
*&---------------------------------------------------------------------*
FORMoutput_result .
SKIP 2.
ULINE.
WRITE: / 'Number of input: ', 20 cnt_input.
WRITE: / 'Number of update: ', 20 cnt_update.
WRITE: / 'Number of error: ', 20 cnt_error.
ENDFORM." OUTPUT_RESULT
DATA: p_groupid LIKE apqi-groupid.
DATA: p_user LIKE sy-uname.
DATA:
* PERFORM bdc_open_group.
* PERFORM pre_bdc.
* PERFORM bdc_insert_group.
* PERFORM bdc_close_group .
* PERFORM get_session_state USING p_groupid .
* PERFORM write_error.
*
*
*
*
*
**************************************************************
FORM bdc_open_group .
CONCATENATE sy-datum sy-uzeit INTO p_groupid.
CALL FUNCTION 'BDC_OPEN_GROUP' "open session
EXPORTING
client = sy-mandt
* DEST = FILLER8
group = p_groupid
* HOLDDATE = FILLER8
keep = 'X'
user = p_user
* RECORD = FILLER1
* IMPORTING
* QID =
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11.
ENDFORM. " BDC_OPEN_GROUP
*
*
*
*
*
ENDFORM.
************************************************************
FORM pre_bdc .
REFRESH bdcdata.
PERFORM bdc_dynpro USING 'SAPLMR1M' '0300'.
PERFORM bdc_field USING 'BDC_CURSOR' 'G_BUDAT'.
PERFORM bdc_field USING 'BDC_OKCODE' '=CANC'.
PERFORM bdc_field USING 'RBKPV-BELNR' i_belnr.
PERFORM bdc_field USING 'RBKPV-GJAHR' i_gjahr.
PERFORM bdc_field USING 'UF05A-STGRD' i_stgrd.
PERFORM bdc_field USING 'G_BUDAT' i_budat.
ENDFORM.
ENDFORM.
*************************************************************
FORM bdc_insert_group .
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = tcode
TABLES
dynprotab = bdcdata
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
OTHERS = 7.
ENDFORM. " BDC_INSERT_GROUP
ENDFORM.
*********************************************************
FORM bdc_close_group .
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
SUBMIT rsbdcsub WITH mappe EQ p_groupid
WITH von EQ sy-datum
WITH bis EQ sy-datum
WITH fehler EQ '.'
EXPORTING LIST TO MEMORY
AND RETURN.
WAIT UP TO 10 SECONDS .
ENDFORM. " BDC_CLOSE_GROUP
ENDFORM.
**********************************************************
FORM get_session_state USING p_session.
CLEAR: itab1,itab1[].
itab1-groupid = p_groupid.
itab1-belnr = i_belnr.
itab1-gjahr = i_gjahr.
itab1-stgrd = i_stgrd.
itab1-budat = i_budat.
itab1-erdat = sy-datum.
itab1-uzeit = sy-uzeit.
itab1-ernam = sy-uname.
itab1-text = i_text.
APPEND itab1.
PERFORM insert_zszd219.
SELECT SINGLE apqi~mandant apqi~groupid apqi~qid apqi~qstate
apql~temseid
INTO (ijob-mandant,ijob-groupid,ijob-qid,ijob-qstate,ijob-temseid)
FROM apqi INNER JOIN apql
ON apql~mandant = apqi~mandant
AND apql~groupid = apqi~groupid
AND apql~qid = apqi~qid
WHERE apqi~groupid = p_session
AND apqi~datatyp = 'BDC'
AND apqi~mandant = sy-mandt .
IF sy-subrc = 0 AND ijob-qstate = 'F'.
READ TABLE itab1 INDEX 1.
itab1-state = 'F'.
MODIFY itab1 INDEX 1.
PERFORM insert_zszd219.
WRITE: / 'Cancel Invoice Sucessful'.
ELSEIF sy-subrc = 0 AND ijob-qstate <> 'F'.
PERFORM read_bdc_log_plain TABLES logtable USING ijob-temseid ijob-mandant.
ELSEIF sy-subrc <> 0.
WRITE:/ 'Job name: ',p_session,' has not finish.'.
ENDIF.
CHECK NOT bdclm[] IS INITIAL.
LOOP AT itab1.
READ TABLE bdclm WITH KEY tcode = 'MR8M'
tcnt = sy-tabix.
CHECK sy-subrc = 0.
MOVE-CORRESPONDING itab1 TO errtab.
IF bdclm-mart = 'E'.
errtab-mess = bdclm-longtext.
ELSE.
errtab-mess = 'Cancel Invoice Sucessful'.
ENDIF.
APPEND errtab.
CLEAR errtab.
ENDLOOP.
ENDFORM.
ENDFORM.
*********************************************************
FORM write_error .
DATA: count TYPE i.
count = 0.
LOOP AT errtab.
IF count = 0.
FORMAT COLOR 3 ON.
WRITE: /01 errtab.
FORMAT COLOR 3 OFF.
SKIP 1.
ELSE.
WRITE: /01 errtab.
ENDIF.
count = 1.
ENDLOOP.
ENDFORM. " WRITE_ERROR
ENDFORM.