学习资料:
SAP ABAP BDC 的使用及代码详解
练习背景
用BDC连续创建多个物料
BDC录制
事务码:SHDB
进入事务SHDB,进行BDC录屏
然后会跳转到MM01事务码下,进行创建物料的操作,可以参考最前面的资料
最后创建完物料如下图,点击保存后返回
返回后创建新程序,新程序会有BDC练习的代码,需要改一下,可参考最前面的资料
根据系统BDC代码修改调用
代码
*&---------------------------------------------------------------------*
*& REPORT YTEST_003
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YTEST_BDC
NO STANDARD PAGE HEADING LINE-SIZE 255.
INCLUDE BDCRECX1_S.
* THE CALL TRANSACTION USING IS CALLED WITH AUTHORITY-CHECK!
* IF YOU HAVE OWN AUTH.-CHECKS YOU CAN USE INCLUDE BDCRECX1 INSTEAD.
*INCLUDE BDCRECX1_S.
*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: MBRSH
* MBRSH_001(001),
** DATA ELEMENT: MTART
* MTART_002(004),
** DATA ELEMENT: XFELD
* KZSEL_01_003(001),
** DATA ELEMENT: MAKTX
* MAKTX_004(040),
** DATA ELEMENT: MEINS
* MEINS_005(003),
** DATA ELEMENT: MATKL
* MATKL_006(009),
* END OF RECORD.
*** END GENERATED DATA SECTION ***
START-OF-SELECTION.
TYPES:BEGIN OF WA,
MBRSH TYPE MARA-MBRSH, "行业领域
MTART TYPE MARA-MTART, "物料类型
MAKTX TYPE MAKT-MAKTX, "物料描述
MEINS TYPE MARA-MEINS, "单位
MATKL TYPE MARA-MATKL, "物料组
END OF WA.
DATA: ITAB TYPE TABLE OF WA WITH HEADER LINE.
DO 10 TIMES.
ITAB-MBRSH = 'A'.
ITAB-MTART = 'HALB'.
ITAB-MAKTX = SY-INDEX."物料描述
ITAB-MEINS = 'D'."单位
ITAB-MATKL = '10.01.01'."物料组
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
* READ DATASET DATASET INTO RECORD.
* IF SY-SUBRC <> 0. EXIT. ENDIF.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'RMMG1-MBRSH'
ITAB-MBRSH.
PERFORM BDC_FIELD USING 'RMMG1-MTART'
ITAB-MTART.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(01)'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)'
'X'.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'/00'.
PERFORM BDC_FIELD USING 'MAKT-MAKTX'
ITAB-MAKTX.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MARA-MATKL'.
PERFORM BDC_FIELD USING 'MARA-MEINS'
ITAB-MEINS.
PERFORM BDC_FIELD USING 'MARA-MATKL'
ITAB-MATKL.
PERFORM BDC_DYNPRO USING 'SAPLSPO1' '0300'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=YES'.
PERFORM BDC_TRANSACTION USING 'MM01'.
ENDLOOP.
PERFORM CLOSE_GROUP.
结果
不根据系统代码的BDC调用方式
这里的代码是根据SHDB创建的代码改的,不会有测试的选择屏幕。
代码
*&---------------------------------------------------------------------*
*& REPORT YTEST_003
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YTEST_003 NO STANDARD PAGE HEADING LINE-SIZE 255.
DATA: GT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: GT_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: GV_CTUMODE LIKE CTU_PARAMS-DISMODE VALUE 'N'.
TYPES:BEGIN OF WA,
MBRSH TYPE MARA-MBRSH, "行业领域
MTART TYPE MARA-MTART, "物料类型
MAKTX TYPE MAKT-MAKTX, "物料描述
MEINS TYPE MARA-MEINS, "单位
MATKL TYPE MARA-MATKL, "物料组
END OF WA.
DATA: ITAB TYPE TABLE OF WA WITH HEADER LINE.
START-OF-SELECTION.
WRITE:/,'开始测试BDC创建物料'.
DO 10 TIMES.
ITAB-MBRSH = 'A'.
ITAB-MTART = 'HALB'.
ITAB-MAKTX = SY-INDEX."物料描述
ITAB-MEINS = 'D'."单位
ITAB-MATKL = '10.01.01'."物料组
APPEND ITAB.
ENDDO.
DATA: LV_MESSAGE TYPE STRING,
LV_ERROR TYPE C,
LS_MESSA TYPE ZSRETURN1.
DATA:LV_ERRMESS1 TYPE STRING,
LV_SUCMESS1 TYPE STRING.
LOOP AT ITAB.
CLEAR: LV_MESSAGE,LV_ERROR,LS_MESSA,LV_ERRMESS1,LV_SUCMESS1,GT_BDCDATA,GT_BDCDATA[]
.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'RMMG1-MBRSH'
ITAB-MBRSH.
PERFORM BDC_FIELD USING 'RMMG1-MTART'
ITAB-MTART.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(01)'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)'
'X'.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'/00'.
PERFORM BDC_FIELD USING 'MAKT-MAKTX'
ITAB-MAKTX.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MARA-MATKL'.
PERFORM BDC_FIELD USING 'MARA-MEINS'
ITAB-MEINS.
PERFORM BDC_FIELD USING 'MARA-MATKL'
ITAB-MATKL.
PERFORM BDC_DYNPRO USING 'SAPLSPO1' '0300'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=YES'.
CALL TRANSACTION 'MM01' USING GT_BDCDATA
MODE GV_CTUMODE
UPDATE 'L'
MESSAGES INTO GT_MESSTAB.
LOOP AT GT_MESSTAB INTO DATA(LS_MESSTAB) WHERE MSGTYP = 'E' OR MSGTYP = 'A'.
LV_ERROR = 'X'.
CLEAR:LV_MESSAGE.
PERFORM FRM_CONCATE_MESSAGE(SAPLZFGPP_INPLAN) USING LS_MESSTAB LV_MESSAGE.
LV_ERRMESS1 = LV_MESSAGE.
ENDLOOP.
IF LV_ERROR IS INITIAL.
LOOP AT GT_MESSTAB INTO LS_MESSTAB WHERE MSGTYP = 'S'.
CLEAR:LV_MESSAGE.
PERFORM FRM_CONCATE_MESSAGE(SAPLZFGPP_INPLAN) USING LS_MESSTAB LV_MESSAGE.
LV_SUCMESS1 = LV_MESSAGE.
ENDLOOP.
ENDIF.
IF LV_ERRMESS1 IS NOT INITIAL.
WRITE:/,LV_ERRMESS1.
ELSEIF LV_SUCMESS1 IS NOT INITIAL.
WRITE:/,LV_SUCMESS1.
ENDIF.
ENDLOOP.
WRITE:/,'测试BDC结束'.
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_1254 text
* -->P_1255 text
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR GT_BDCDATA.
GT_BDCDATA-PROGRAM = PROGRAM.
GT_BDCDATA-DYNPRO = DYNPRO.
GT_BDCDATA-DYNBEGIN = 'X'.
APPEND GT_BDCDATA.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_1254 text
* -->P_1255 text
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
CLEAR GT_BDCDATA.
DATA:LV_FVAL TYPE CHAR20.
GT_BDCDATA-FNAM = FNAM.
GT_BDCDATA-FVAL = FVAL.
APPEND GT_BDCDATA.
ENDFORM.
结果
去查底表可以发现物料已创建