BDC基本流程
一 、定义一个BDC程序的基本流程
1. BDC录制,记录屏幕操作
2.产生相关的程序及数据格式文件
3.利用程序将相关单据信息读取到内表,并对内表的数据进行调整逻辑处理(数据检查或数据转换)
4.调用BDC录制程序导入数据
5.输出消息列表(基本操作对象:MESSTAB(TYPE BDCMSGCOLL))
二 、主要事务代码 : -SHDB(录屏) -SM35(查看会话)
三、BDC两种实现方式
"BDC数据定义
DATA: GV_MESSAGES TYPE C LENGTH 200,
BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE,
GS_OPTION TYPE CTU_PARAMS ,
MESSTAB TYPE TABLE OF BDCMSGCOLL WITH HEADER LINE.
1.CALL TRANSACTION
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM APPEND_BDCDATA .
DATA LV_MESSAGES TYPE C LENGTH 200.
LOOP AT GX_01 INTO GS_01 .
CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
PERFORM APPEND_FIELDS USING 'MAKT-MAKTX' GS_01-MAKTX.
PERFORM APPEND_FIELDS USING 'MARA-BRGEW' GS_01-BRGEW.
PERFORM APPEND_FIELDS USING 'MARA-NTGEW' GS_01-NTGEW.
PERFORM APPEND_FIELDS USING 'MARA-GEWEI' GS_01-GEWEI.
CLEAR GS_OPTION.
GS_OPTION-DISMODE ='A'.
GS_OPTION-UPDMODE ='S'.
CALL TRANSACTION 'MM02' USING BDCDATA "使用内表调用
OPTIONS FROM GS_OPTION " CTU_PARAMS
* UPDATE 'S' " 更新模式 s a
* MODE 'N' "显示模式 A:前台,N:后台
MESSAGES INTO MESSTAB .
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '801'.
IF SY-SUBRC = 0 .
WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
ELSE.
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '810' .
IF SY-SUBRC = 0 .
WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
ELSE.
WRITE:/ '物料ERROE' .
LOOP AT MESSTAB WHERE MSGTYP = 'E' .
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = MESSTAB-MSGID
MSGNR = MESSTAB-MSGNR
MSGV1 = MESSTAB-MSGV1
MSGV2 = MESSTAB-MSGV2
MSGV3 = MESSTAB-MSGV3
MSGV4 = MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGES.
WRITE:/ LV_MESSAGES.
ENDLOOP .
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
2.BATCH INPUT SESSION
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM APPEND_ABCDATA_BATCH .
DATA GX_SESSION TYPE APQI-GROUPID VALUE 'ZMM02_GX_TEST' .
* 开启session
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
* CLIENT = SY-MANDT
* DEST = FILLER8
GROUP = GX_SESSION
* HOLDDATE = FILLER8
KEEP = 'X'
USER = SY-UNAME
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* 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.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
EXIT.
ENDIF.
LOOP AT GX_01 INTO GS_01 .
CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
PERFORM APPEND_FIELDS USING 'MAKT-MAKTX' GS_01-MAKTX.
PERFORM APPEND_FIELDS USING 'MARA-BRGEW' GS_01-BRGEW.
PERFORM APPEND_FIELDS USING 'MARA-NTGEW' GS_01-NTGEW.
PERFORM APPEND_FIELDS USING 'MARA-GEWEI' GS_01-GEWEI.
*向SESSION插入事务
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MM02'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
DYNPROTAB = BDCDATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
* 关闭SESSION
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ELSE.
WRITE:/'SUCC'.
ENDIF.
ENDFORM.
BDC实现,上传文件
1.使用函数 WS_FILENAME_GET 获取文件路径
FORM GET_FIELNAME .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
MASK = ',excel.xls,*.xls,text.txt,*.txt.'
MODE = 'O'
TITLE = '打开文件'
IMPORTING
FILENAME = P_FILES
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
2.使用函数GUI_UPLOAD,上传txt文件
DATA GV_FILE TYPE STRING.
* 1. 获取本地文件
CHECK P_FILES IS NOT INITIAL .
* 2.从文件取数据
TRANSLATE P_FILES TO UPPER CASE .
FIND '.TXT' IN P_FILES .
IF SY-SUBRC = 0 .
GV_FILE = P_FILES.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = GV_FILE
* FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X'
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
DATA_TAB = GX_01
* CHANGING
* ISSCANPERFORMED = ' '
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
3.使用函数TEXT_CONVERT_XLS_TO_SAP,上传excel文件
FIND '.XLS' IN P_FILES .
IF SY-SUBRC = 0 .
* EXCEL 文件的上传
DATA LT_RAW TYPE TRUXS_T_TEXT_DATA.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FIELD_SEPERATOR = 'x'
I_LINE_HEADER = 'x'
I_TAB_RAW_DATA = LT_RAW
I_FILENAME = P_FILES
TABLES
I_TAB_CONVERTED_DATA = GX_01
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.
ENDIF.
ENDIF.
四、BDC录制,记录屏幕操作
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM APPEND_BDCDATA .
DATA LV_MESSAGES TYPE C LENGTH 200.
LOOP AT GX_01 INTO GS_01 .
CLEAR: BDCDATA , BDCDATA[],MESSTAB,MESSTAB[].
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_01-MATNR.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' 'BU'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MARA-MATKL'.
PERFORM APPEND_FIELDS USING 'MAKT-MAKTX' GS_01-MAKTX.
PERFORM APPEND_FIELDS USING 'MARA-BRGEW' GS_01-BRGEW.
PERFORM APPEND_FIELDS USING 'MARA-NTGEW' GS_01-NTGEW.
PERFORM APPEND_FIELDS USING 'MARA-GEWEI' GS_01-GEWEI.
CLEAR GS_OPTION.
GS_OPTION-DISMODE ='A'.
GS_OPTION-UPDMODE ='S'.
CALL TRANSACTION 'MM02' USING BDCDATA "使用内表调用
OPTIONS FROM GS_OPTION " CTU_PARAMS
* UPDATE 'S' " 更新模式 s a
* MODE 'N' "显示模式 A,N
MESSAGES INTO MESSTAB .
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '801'.
IF SY-SUBRC = 0 .
WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
ELSE.
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '810' .
IF SY-SUBRC = 0 .
WRITE:/ '物料' , GS_01-MATNR ,'修改成功!'.
ELSE.
WRITE:/ '物料ERROE' .
LOOP AT MESSTAB WHERE MSGTYP = 'E' .
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = MESSTAB-MSGID
MSGNR = MESSTAB-MSGNR
MSGV1 = MESSTAB-MSGV1
MSGV2 = MESSTAB-MSGV2
MSGV3 = MESSTAB-MSGV3
MSGV4 = MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGES.
WRITE:/ LV_MESSAGES.
ENDLOOP .
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM APPEND_SCREEN USING VALUE(P_PROGRAM) "值传递
VALUE(P_DYNPRO) .
CLEAR BDCDATA .
BDCDATA-PROGRAM = P_PROGRAM.
BDCDATA-DYNPRO = P_DYNPRO .
BDCDATA-DYNBEGIN = 'X'.
BDCDATA-FNAM = ''.
BDCDATA-FVAL = ''.
APPEND BDCDATA.
ENDFORM.
FORM APPEND_FIELDS USING VALUE(P_FIELD)
VALUE(P_VALUE).
CLEAR BDCDATA .
BDCDATA-PROGRAM = ''.
BDCDATA-DYNPRO = '' .
BDCDATA-DYNBEGIN = ''.
BDCDATA-FNAM = P_FIELD.
BDCDATA-FVAL = P_VALUE.
APPEND BDCDATA.
ENDFORM .
相关参照
在屏幕上添加一个按钮
TABLES : SSCRFIELDS .
SELECTION-SCREEN FUNCTION KEY 1. "1-5
INITIALIZATION .
TYPE-POOLS: ICON.
SSCRFIELDS-FUNCTXT_01 = '@01@下载模板'.
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
PERFORM DOWNLOAD_TEMPLATE.
ENDCASE.
BDCDATA 录屏相关字段 程序/ 屏幕 / 开始ID / 字段名 / 值
BCD执行完收集信息的相关字段
CALL TRANSACTION USING ....运行是参数字符串