BDC的录制并使用程序调用
Step1. 录制BDC
运行T-Code:SHDB,SHDB中可查看修改创建BDC录屏记录

点击新建记录,创建一个新的BDC录屏

输入创建参数,然后点击开始记录(录屏界面可能和使用事务代码的界面不一样;如果需要两个界面一致;需勾选不是批输入会话)

输入物料编号,回车进入视图选择窗

选择基本数据 1视图视图;然后回车进入物料主数据视图界面

修改物料描述,物料组,然后切换到基本数据 2 视图;建议使用右边的视图切换按钮,保证BDC能够记录到

7.录入基本数据2 视图数据后;点击保存按钮结束录屏
点击保存按钮保存记录(录屏的数据就是我们要使用的数据格式;构造一样的格式就可通过ABAP程序实现调用)

DBC ZMM02_01创建完成

Step2. 通过标准创建ABAP程序调用BDC
- 在SHDB界面选择记录ZMM02_01,然后点击程序按钮

- 输入对应参数

- 输入程序描述,点击源代码,跳转到程序编辑界面(可通过修改修改标准程序达到目的,参照 Step3. )
Step3. 手动创建ABAP程序调用BDC
3.1 从EXCEL TXT文件取数据
- 详见代码:PERFORM FRM_GET_FILENAME.
- 详见代码:PERFORM FRM_GET_DATA.
3.2 根据录屏结果生成BDC调用数据
- 第一行记录事务代码的行可以省略

- BDC_SUBSCR 的行可以省略不填
- 未修改的值(MARA-MEINS = PC MARA-GEWEI = KG)也可省略不填
- 详见代码:PERFORM FRM_CONVERT_DATA USING WA_DATA.

3.3 执行BDC调用
- 方法一:使用Transaction方法,读入一条执行一次MM02
- 方法二:使用Session的方式,读入所有数据放到一个Session,再用MM02逐条执行;还需要使用SM35去执行Session
- 方法一详见代码:PERFORM FRM_EXEC_TRANSACTION.
- 方法二详见代码:PERFORM FRM_EXEC_SESSION.
4.4 代码
TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
MATNR TYPE CHAR50, "料号
MAKTX TYPE CHAR50, "物料描述
MATKL TYPE CHAR50, "物料组
NORMT TYPE CHAR50, "开发案号
END OF TY_DATAS.
DATA: GT_DATA TYPE TABLE OF TY_DATAS,
WA_DATA TYPE TY_DATAS.
DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM FRM_GET_FILENAME.
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
END-OF-SELECTION.
* " 调用方法一 By Transaction
* PERFORM FRM_EXEC_TRANSACTION.
" 调用方法二 By Session(把多个Transaction放到一个Session一起执行)
PERFORM FRM_EXEC_SESSION.
**------------------------------------------FROM------------------------------------------**
FORM FRM_GET_FILENAME .
DATA: LV_RC TYPE I.
DATA: LT_FILE_TABLE TYPE FILETABLE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = '打开文件'
CHANGING
FILE_TABLE = LT_FILE_TABLE
RC = LV_RC.
IF SY-SUBRC = 0.
READ TABLE LT_FILE_TABLE INTO DATA(WA_FILE_TABLE) INDEX 1.
P_FILE = WA_FILE_TABLE-FILENAME.
ENDIF.
ENDFORM.
FORM FRM_GET_DATA .
DATA: LT_RAW TYPE TRUXS_T_TEXT_DATA.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = LT_RAW
I_FILENAME = P_FILE
TABLES
I_TAB_CONVERTED_DATA = GT_DATA
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
FORM FRM_CONVERT_DATA USING P_WA_DATA.
* BDC_SUBSCR的项没有意义,可不填
CLEAR: GT_BDCDATA,GT_BDCDATA[].
PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '0060'.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ENTR'.
PERFORM FRM_FIELD_LINE USING 'RMMG1-MATNR' WA_DATA-MATNR.
PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '0070'.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ENTR'.
PERFORM FRM_FIELD_LINE USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '4004'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' 'SP02'.
PERFORM FRM_FIELD_LINE USING 'MAKT-MAKTX' WA_DATA-MAKTX.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MARA-MATKL'.
PERFORM FRM_FIELD_LINE USING 'MARA-MATKL' WA_DATA-MATKL.
PERFORM FRM_SCREEN_LINE USING 'SAPLMGMM' '4004'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=BU'.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'MARA-NORMT'.
PERFORM FRM_FIELD_LINE USING 'MARA-NORMT' WA_DATA-NORMT.
ENDFORM.
FORM FRM_SCREEN_LINE USING VALUE(P_VALUE1)
VALUE(P_VALUE2).
CLEAR: GT_BDCDATA.
GT_BDCDATA-PROGRAM = P_VALUE1.
GT_BDCDATA-DYNPRO = P_VALUE2.
GT_BDCDATA-DYNBEGIN = 'X'.
APPEND GT_BDCDATA.
ENDFORM.
FORM FRM_FIELD_LINE USING VALUE(P_VALUE11)
VALUE(P_VALUE12).
CLEAR: GT_BDCDATA.
GT_BDCDATA-FNAM = P_VALUE11.
GT_BDCDATA-FVAL = P_VALUE12.
APPEND GT_BDCDATA.
ENDFORM.
FORM FRM_EXEC_TRANSACTION.
DATA: LT_MESSAGE TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE.
DATA: LV_MESSAGE TYPE STRING.
LOOP AT GT_DATA INTO WA_DATA.
PERFORM FRM_CONVERT_DATA USING WA_DATA.
CALL TRANSACTION 'MM02' USING GT_BDCDATA[]
* OPTIONS FROM GS_OPTIONS "结构传参,参照结构:CTU_PARAMS
MESSAGES INTO LT_MESSAGE "返回消息,参照结构:BDCMSGCOLL
UPDATE 'S' "更新模式:S 同步 A 异步
MODE 'E'. "显示模式:A 前台 N 后台 E 仅显示错误
IF SY-SUBRC = 0.
READ TABLE LT_MESSAGE WITH KEY MSGID = 'M3'
MSGNR = '801'.
IF SY-SUBRC = 0.
WRITE:/ '物料:',WA_DATA-MATNR,'物料修改成功'.
ELSE.
LOOP AT LT_MESSAGE WHERE MSGTYP = 'E'.
WRITE:/ '物料:',WA_DATA-MATNR,'物料修改失败'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = LT_MESSAGE-MSGID
MSGNR = LT_MESSAGE-MSGNR
MSGV1 = LT_MESSAGE-MSGV1
MSGV2 = LT_MESSAGE-MSGV2
MSGV3 = LT_MESSAGE-MSGV3
MSGV4 = LT_MESSAGE-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
WRITE:/ LV_MESSAGE.
ENDLOOP.
ENDIF.
ELSE.
WRITE:/ 'BDC执行错误'.
ENDIF.
ENDLOOP.
ENDFORM.
FORM FRM_EXEC_SESSION.
" Open Session
DATA: LS_GROUPNAME TYPE APQI-GROUPID VALUE 'ZMM02_01'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = LS_GROUPNAME
KEEP = 'X'
USER = SY-UNAME
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.
LOOP AT GT_DATA INTO WA_DATA.
PERFORM FRM_CONVERT_DATA USING WA_DATA.
" Insert Session
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MM02'
TABLES
DYNPROTAB = GT_BDCDATA[]
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
ENDLOOP.
" Close Session
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
IF sy-subrc = 0.
WRITE:/ 'Session创建成功,请到SM35执行'.
ENDIF.
ENDFORM.
Step4. 运行测试
- 准备Excel数据

- Transaction 方式


- Session 方式



- 执行结果

版权声明:本文为qq_30797051原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。