BDC基本流程
一 、定義一個BDC程序的基本流程
1. BDC錄製,記錄屏幕操作
2.產生相關的程序及數據格式文件
3.利用程序將相關單據信息讀取到內表,並對內表的數據進行調整邏輯處理(數據檢查或數據轉換)
4.調用BDC錄製程序導入數據
5.輸出消息列表(基本操作對象:MESSTAB(TYPE BDCMSGCOLL))
二 、主要事務代碼 : -SHDB(錄屏) -SM35(查看會話)
三、BDC兩種實現方式
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 ....運行是參數字符串