声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。
01
目录
11 批导
11.1 简单批导SHDB
11.1.1 录屏
11.1.2 保存生成源代码
11.1.3 根据事物记录器写代码
11.2 简单批导SHDB,MMPV专题
11.2.1 录屏MMPV
11.2.2 根据事物记录器写代码
02
正文
11 批导
目的要修改以下4列
维护物料描述、物料组
MS登记编号
保存生成操作记录,共4部分
源代码一共分2个部分
结构定义部分
循环调用部分
第一行记录事务代码的行可以省略 BDC_SUBSCR 的行可以省略不填 未修改的值(MARA-MEINS = PC MARA-GEWEI = KG)也可省略不填,就奔着要修改的4列去
report ZLGZTEST08_BDC
no standard page heading line-size 255.
*1 第一步,定义对象
TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
MATNR TYPE CHAR50, "料号
MAKTX TYPE CHAR50, "物料描述
MATKL TYPE CHAR50, "物料组
MSBOOKPARTNO TYPE CHAR50, "MS登记号
END OF TY_DATAS.
"定义EXCEL的数据存储对象
DATA: GT_DATA TYPE TABLE OF TY_DATAS,
WA_DATA TYPE TY_DATAS.
"BDC的数据对象
DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
*2 第二步,定义文件选择参数,并选择文件
PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM FRM_GET_FILENAME.
*3 第三步,获取文件数据
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
END-OF-SELECTION.
*4 第四步,调用BDC录入数据
* " 调用方法一 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_FIELD_LINE USING 'MSICHTAUSW-KZSEL(02)' '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-MSBOOKPARTNO'.
PERFORM FRM_FIELD_LINE USING 'MARA-MSBOOKPARTNO' WA_DATA-MSBOOKPARTNO.
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.
"4 第四步,调用的FORM每读入一行,就执行一次
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.
关键代码解析:
第一步:结构定义
第二步和第三步:读取excel读到TY_DATAS中
第四步:循环调用并输出消息
第四步详解:参考事物记录器进行模拟
4.1 关于0060屏幕
4.2 关于0070屏幕,物料选择视图时,选择了2个视图,所以有两次X
4.3 关于4004屏幕,去掉SUBSCR判断的,如果MEINS和MTPOS_MARA字段不需要也不用填充
4.4 关于4004屏幕,去掉SUBSCR判断的,有些光标聚焦点不是对应的要修改字段,也无所谓
把公司代码,或者修改时间,点击处理都是有效的。
保存事物记录器,同时复制一遍,再导入发现也是有效的
需要注意,如果遇到回车执行按钮后,不要结束,ls_CTU_PARAMS-RACOMMIT这个选项很关键,必须选择为X data ls_CTU_PARAMS type CTU_PARAMS. ls_CTU_PARAMS-UPDMODE = ‘L’. "更新模式:S 同步 A 异步 ls_CTU_PARAMS-DISMODE = ‘N’. "显示模式:A 前台 N 后台 E 仅显示错误 ls_CTU_PARAMS-RACOMMIT = ‘X’. "COMMIT WORK语句是否结束批处理的选项,值:“”可终止 “X”不可终止。
CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
OPTIONS FROM ls_CTU_PARAMS
MESSAGES INTO LT_MESSAGE.
*&---------------------------------------------------------------------*
*& Report ZLGZBDC_MMPV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZLGZBDC_MMPV no standard page heading line-size 255.
*1 第一步,定义对象
TYPE-POOLS: TRUXS.
TYPES: BEGIN OF TY_DATAS,
I_VBUKR TYPE CHAR50, "公司代码
I_LFGJA TYPE CHAR50, "年
I_LFMON TYPE CHAR50, "月份
END OF TY_DATAS.
"定义EXCEL的数据存储对象
DATA: GT_DATA TYPE TABLE OF TY_DATAS,
WA_DATA TYPE TY_DATAS.
"BDC的数据对象
DATA: GT_BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
*2 第二步,定义文件选择参数,并选择文件
PARAMETERS : P_FILE TYPE RLGRAP-FILENAME.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM FRM_GET_FILENAME.
*3 第三步,获取文件数据
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
END-OF-SELECTION.
*4 第四步,调用BDC录入数据
* " 调用方法一 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.
DATA: WA_FILE_TABLE LIKE LINE OF LT_FILE_TABLE.
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 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 'RMMMPERI' '1000'.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'I_LFGJA'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=ONLI'.
PERFORM FRM_FIELD_LINE USING 'I_VBUKR' WA_DATA-I_VBUKR.
PERFORM FRM_FIELD_LINE USING 'I_LFMON' WA_DATA-I_LFMON.
PERFORM FRM_FIELD_LINE USING 'I_LFGJA' WA_DATA-I_LFGJA.
PERFORM FRM_SCREEN_LINE USING 'SAPMSSY0' '0120'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '=&F03'.
PERFORM FRM_SCREEN_LINE USING 'RMMMPERI' '1000'.
PERFORM FRM_FIELD_LINE USING 'BDC_OKCODE' '/EE'.
PERFORM FRM_FIELD_LINE USING 'BDC_CURSOR' 'I_VBUKR'.
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.
"4 第四步,调用的FORM每读入一行,就执行一次
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.
data ls_CTU_PARAMS type CTU_PARAMS.
ls_CTU_PARAMS-UPDMODE = 'L'. "更新模式:S 同步 A 异步
ls_CTU_PARAMS-DISMODE = 'N'. "显示模式:A 前台 N 后台 E 仅显示错误
ls_CTU_PARAMS-RACOMMIT = 'X'. "COMMIT WORK语句是否结束批处理的选项,值:“”可终止 “X”不可终止。
CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
OPTIONS FROM ls_CTU_PARAMS
MESSAGES INTO LT_MESSAGE.
* CALL TRANSACTION 'MMPV' USING GT_BDCDATA[]
** OPTIONS FROM GS_OPTIONS "结构传参,参照结构:CTU_PARAMS
* MESSAGES INTO LT_MESSAGE "返回消息,参照结构:BDCMSGCOLL
* UPDATE 'L' "更新模式:S 同步 A 异步
* MODE 'N'. "显示模式:A 前台 N 后台 E 仅显示错误
IF SY-SUBRC = 0.
READ TABLE LT_MESSAGE WITH KEY MSGID = 'M3'
MSGNR = '489'.
IF SY-SUBRC = 0.
WRITE:/ '公司代码:',WA_DATA-I_VBUKR,WA_DATA-I_LFGJA,WA_DATA-I_LFMON,'物料账开启成功'.
ELSE.
LOOP AT LT_MESSAGE WHERE MSGTYP = 'E'.
WRITE:/ '公司代码:',WA_DATA-I_VBUKR,WA_DATA-I_LFGJA,WA_DATA-I_LFMON,'物料账开启失败'.
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.