在做ABAP開發時,有的時候我們需要將數據整理成文件然后上傳至SAP,整理后的文件可以是文本格式或者EXCEL文件格式等,這也要看具體的業務要求了,本篇文件將以實例介紹如何讀取文本文件。嘎嘎。。。
首先要介紹一下CL_GUI_FRONTEND_SERVICES類,這個類提供了很多對操作系統文件的操作,例如拷貝,列出文件名,打開文件等。當在從客戶端打開一個文件是我們要用到它的靜太方法FILE_OPEN_DIALOG,將文本文件讀取到內表時又要用到它的靜態方法GUI_UPLOAD。GUI_UPLOAD是個比較特殊的方法,可以直接被FUNCTION直接調用類似的還有GUI_DOWNLOAD等,可能是靜態方法系統中又封裝了一次,當然你也可以直接通過類來調用靜態方法兩都都可以實現。最后將讀入到內表中的數據在ALV中列出,具體程式如下。
[FOR EXAMPLE]
TYPE-POOLS:SLIS. "ALV要用到的類型池
DATA:I_FIELD_CAT TYPE SLIS_T_FIELDCAT_ALV, "ALV是顯示時要的屬性
FIELD_CAT TYPE SLIS_FIELDCAT_ALV,
I_LAYOUT TYPE SLIS_LAYOUT_ALV,
I_REPID LIKE SY-REPID.
DATA:BEGIN OF TXT_READ_DATA OCCURS 0, "定義一個內表,用於存放從TXT上傳的數據
ZH_NAME(30) TYPE C,
EN_NAME(30) TYPE C,
SEX(10) TYPE C,
DATE LIKE SY-DATUM,
END OF TXT_READ_DATA.
DATA:LV_FILETABLE TYPE FILETABLE, "打開文件的信息放入此列表中
LV_FILENAME TYPE STRING. "定義一字段用於放置上傳的文件名稱
SELECTION-SCREEN BEGIN OF BLOCK myBlock WITH FRAME TITLE title. "創建上傳文件的屏幕
PARAMETERS:P_FILE LIKE RLGRAP-FILENAME OBLIGATORY LOWER CASE.
SELECTION-SCREEN END OF BLOCK myBlock.
INITIALIZATION. "初始化屏幕時
title = 'GUI UPLOAD'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE."按F4鍵時也可觸發該事件
PERFORM F_OPEN_FILENAME CHANGING P_FILE.
START-OF-SELECTION.
PERFORM READ_DATA_IN.
PERFORM BUILD_LAYOUT.
PERFORM BUILD_FIELDCAT.
PERFORM DISPLAY_ALV.
*&---------------------------------------------
*&F_OPEN_FILENAME FOR OPEN FILE
*&---------------------------------------------
FORM F_OPEN_FILENAME CHANGING P_FILE.
DATA: LV_RC TYPE I.
"調用METHOD 打開對話框
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG "OPEN FILE DIALOG 打開上傳文件的對話框
EXPORTING
WINDOW_TITLE = '選擇上傳文件'
FILE_FILTER = 'All Files (*.*)|*.*|NotePad Files(*.txt)|*.txt|Excel Files(*.xls)|*.xls|Word files(*.doc)|*.doc' "過濾上傳文件的類型
DEFAULT_EXTENSION = '*.txt'
DEFAULT_FilENAME = '1.txt' "默認打開的文件 "d:\Users\wei.sunqing\Desktop\1.txt
"INITIAL_DIRECTORY = 'C:/' "初始化的目錄
"MULTISELECTION = 'X' "是否可以同時打開多個文件
CHANGING
FILE_TABLE = LV_FILETABLE "你打開文件名的列表
RC = LV_RC "返回打開文件的數量
.
IF SY-SUBRC <> 0.
MESSAGE 'FILE DOES NOT EXIST!' TYPE 'E'.
ELSEIF LV_FILETABLE[] IS NOT INITIAL. "不為空
READ TABLE LV_FILETABLE INDEX 1 INTO LV_FILENAME. "讀取打開文件內表的第一個文件信息
P_FILE = LV_FILENAME.
ENDIF.
ENDFORM.
*&---------------------------------------------
*& READ DATA IN
*&---------------------------------------------
FORM READ_DATA_IN .
IF P_FILE CS '.TXT' ."判斷文件名稱是否包含.txt EXCEL:OR P_FILE CS '.XLS'
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = LV_FILENAME "要讀取的文件
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB "字段間按TAB鍵分隔開來
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = '8400' "如果在不能正常顯示中文的情況下設置此項
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
DATA_TAB = TXT_READ_DATA "寫入相應的內表中
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.
IF SY-SUBRC = 1.
MESSAGE 'IMPORT FILE OPEN ERROR' TYPE 'I'.
EXIT.
ENDIF.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
MESSAGE 'IMPORT FILE SHOULD BE A TEXT FILE' TYPE 'I'.
ENDIF.
ENDFORM.
*&---------------------------------------------
*& BUILD ALV LAYOUT
*&---------------------------------------------
FORM BUILD_LAYOUT.
I_REPID = SY-REPID.
I_LAYOUT-ZEBRA = 'X'.
I_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
ENDFORM.
*&---------------------------------------------
*& BUILD ALV FIELDCAT
*&---------------------------------------------
FORM BUILD_FIELDCAT.
CLEAR I_FIELD_CAT[].
CLEAR FIELD_CAT.
FIELD_CAT-FIELDNAME = 'ZH_NAME'.
FIELD_CAT-SELTEXT_L = '中文名'.
APPEND FIELD_CAT TO I_FIELD_CAT.
CLEAR FIELD_CAT.
FIELD_CAT-FIELDNAME = 'EN_NAME'.
FIELD_CAT-SELTEXT_L = '英文名'.
APPEND FIELD_CAT TO I_FIELD_CAT.
CLEAR FIELD_CAT.
FIELD_CAT-FIELDNAME = 'SEX'.
FIELD_CAT-SELTEXT_L = '姓別'.
APPEND FIELD_CAT TO I_FIELD_CAT.
CLEAR FIELD_CAT.
FIELD_CAT-FIELDNAME = 'DATE'.
FIELD_CAT-SELTEXT_L = '時間'.
APPEND FIELD_CAT TO I_FIELD_CAT.
CLEAR FIELD_CAT.
ENDFORM.
*&---------------------------------------------
*& DISPLAY DATA WITH ALV
*&---------------------------------------------
FORM DISPLAY_ALV.
DATA I_LINE TYPE I.
DESCRIBE TABLE TXT_READ_DATA LINES I_LINE. "將內表數據行數寫入變量I_LINE中
"IF IT_FILEDATA[] IS NOT INITIAL.
IF I_LINE > 0.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "調用函數用ALV顯示出數據
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
I_CALLBACK_PROGRAM = I_REPID
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
IS_LAYOUT = I_LAYOUT
IT_FIELDCAT = I_FIELD_CAT
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = TXT_READ_DATA
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDFORM.
運行界面如下:
在ALV中顯示出的數據:
最后符上上面程式中測試用的數據(中間以TAB符分隔):
巴門尼德 Parmenides Male 20120812
赫利克里特 Heractitus Male 20120812
馬可·奧勒留 Marcus Aurelius Male 20120812
柏拉圖 Plato Male 20120812
亞里士多德 Aristotle Male 20120812
蘇格拉底 Socrates Male 20120812
笛卡爾 Descartes Male 20120812
GUI_UPLOAD也可以將EXCEL讀取入內表中,上面代碼中加入判斷是否是EXCEL文件后上傳即可讀取。