下面ABAP文件处理分三部分.
1.操作应用服务器端文件
常用的语法如下,注意dataset关键字.
[1]Open dataset <s_filename> for input|output|appending In Binary Mode| In Text Mode Encoding ***.
打开一个文件为读,写或追加目的,可使用文本还是二进制目的.
[2]Read Dataset <s_filename> into <var>
读取文件
[3]Delete dataset <s_filename>
删除文件
[4]Transfer <var> to <s_filename>
写数据到文件
[5]Close dataset <s_filename>
关闭文件,如果文件需要反复操作,关闭文件是必须的,这很容易理解,这点和其他语言一样.
2.操作本地文件.
操作本地文件的常用函数及功能如下:
[1]Download:带用户对话的写文件.
[2]Update: 带用户对话的读文件.
[3]WS_Download:不带用户对话的写文件.
[4]WS_Update:不带用户对话的读文件.
[5]WS_Query:查询文件
[6]WS_FILE_DELETE:删除文件
常见可使用的文件类型: Bin->二进制文件| ASC->Ascii文件| DAT->Excel文件.
还有几个相关函数实际上使用SE37查询下WS*就可,读者从名字上就可知道其作用.
一些常用的文件操作函数:
WS_EXCEL|WS_EXECUTE|WS_FILENAME_GET|WS_FILE_ATTRIB|
WS_FILE_COPY|WS_FILE_DELETE|WS_MSG|WS_ULDL_PATH| GUI_CREATE_DIRECTORY|GUI_DELETE_FILE|GUI_DOWNLOAD|
GUI_EXEC|GUI_FILE_SAVE_DIALOG|GUI_GET_DESKTOP_INFO|
GUI_GET_FILE_INFO|GUI_REMOVE_DIRECTORY|GUI_RUN|
GUI_UPLOAD|GUI_VSS_DOWNLOAD|GUI_VSS_UPLOAD
读者还可使用类CL_GUI_FRONTEND_SERVICES操作文件,接下来的例子简单介绍了如何利用它进行文件操作.
3.操作excel文件.
如过需要查找相关excel操作函数,请使用SE37输入*EXCEL*.常用的函数有WS_EXCEL| ALSM_EXCEL_TO_INTERNAL_TABLE| EXCEL_OLE_STANDARD_DAT.
读者还可使用OLE处理excel,关于OLE请看加强篇 14节使用OLE和Excel交互.
下面是几种操作文件的一个简单的实例汇总.
文件读写等操作很重要尤其是系统上线使用BDC->batch input导入数据时可能要将期初数据组织成各种文件(一般是Txt.Xls),下面是一个简单的例子介绍如何进行文件操作.
***************************************************
* This is a integrated example for usging file ***
* Composed by Stone Fu on 2005/06/01 ***
***************************************************
Report zuserfile .
INCLUDE OLE2INCL. "要使用OLE一定要包含OLE2INCL.
tables :SSCRFIELDS .
types:begin of i_file ,
col1 type i ,
col2(3) type c,
col3(5) type c,
end of i_file.
data: itab_file type i_file occurs 0 with header line,
iwa_file type i_file ,
S_query(1) type C value 'N' .
SELECTION-SCREEN COMMENT 35(80) txt-com1 MODIF ID ST1.
SELECTION-SCREEN ULINE /30(80).
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE Title1.
SELECTION-SCREEN PUSHBUTTON 1(15) APPBUT1
USER-COMMAND APPCLI1.
SELECTION-SCREEN PUSHBUTTON 18(15) APPBUT2
USER-COMMAND APPCLI2.
SELECTION-SCREEN PUSHBUTTON 35(15) APPBUT3
USER-COMMAND APPCLI3.
SELECTION-SCREEN PUSHBUTTON 52(15) APPBUT4
USER-COMMAND APPCLI4.
***Logical file name example
SELECTION-SCREEN COMMENT /1(50) txt-com2 .
SELECTION-SCREEN PUSHBUTTON /1(60) APPBUT5
USER-COMMAND APPCLI5.
parameter s_logfn(60) default 'LOGFILE'.
SELECTION-SCREEN END OF BLOCK bk1.
selection-screen skip 1 .
SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE Title2.
SELECTION-SCREEN PUSHBUTTON 1(30) LclBUT1
USER-COMMAND LCLCLI1.
SELECTION-SCREEN PUSHBUTTON 37(30) lclBUT2
USER-COMMAND LCLCLI2.
SELECTION-SCREEN END OF BLOCK bk2.
selection-screen skip 1 .
SELECTION-SCREEN BEGIN OF BLOCK bk3 WITH FRAME TITLE Title3.
SELECTION-SCREEN PUSHBUTTON 1(30) exlBUT1
USER-COMMAND EXLCLI1.
SELECTION-SCREEN PUSHBUTTON 37(30) exlBUT2
USER-COMMAND exlCLI2.
SELECTION-SCREEN END OF BLOCK bk3.
selection-screen skip 1 .
SELECTION-SCREEN BEGIN OF BLOCK bk4 WITH FRAME TITLE Title4.
Parameter fileline type i default 8 .
Parameter s_fname(50) Default 'APPFILE'.
SELECTION-SCREEN END OF BLOCK bk4.
INITIALIZATION.
***初始化参##
txt-com1 = 'This is an example for using file,Click each button to get detailed!'.
txt-com2 = 'Input logical file name to get the physical info.'.
Title1 = 'Operate File on Application Server' .
Title2 = 'Operate Local File' .
Title3 = 'Use Excel File with OLE '.
Title4 = 'Generated File lines '.
APPBUT1 = 'Read File'.
APPBUT2 = 'Write File'.
APPBUT3 = 'Append File'.
APPBUT4 = 'Delete File'.
APPBUT5 = 'Input Logical File in param. S_LOGFN to Get Phy. File Name.'.
LclBUT1 = 'Read/Write W/O Dialog'.
LclBUT2 = 'Read/Write with Dialog'.
exlBUT1 = 'Read Excel'.
exlBUT2 = 'Write to Excel' .
Perform sub_del_file. "删除应用服务器上的旧文件
S_query = 'Y' .
AT SELECTION-SCREEN.
if fileline LE 1 .
message I001(00) with 'The file line must be greater than 1 '.
stop .
endif .
perform sub_fill_itab.
perform sub_button_click .
*START-OF-SELECTION.
**END-OF-SELECTION.
"sub_fill_itab
*&--------------------------------------------------------------------*
*& Form sub_button_click
*&--------------------------------------------------------------------*
form sub_button_click.
***响应按钮事件***
case SSCRFIELDS-UCOMM .
when 'APPCLI1'.
perform sub_get_app_file .
when 'APPCLI2'.
perform sub_wrt_app_file.
when 'APPCLI3'.
Perform sub_appd_file .
when 'APPCLI4'.
Perform sub_del_file.
when 'APPCLI5'.
Perform sub_logic_file.
when 'LCLCLI1'.
perform sub_wo_local .
when 'LCLCLI2'.
perform sub_wt_local.
when 'EXLCLI1'.
perform sub_excel_get.
when 'EXLCLI2'.
perform sub_excel_write .
when others.
endcase.
endform. "sub_button_click
***Write internal table to excel file .
form sub_excel_write .
DATA: s_EXCEL TYPE OLE2_OBJECT, "Excel object
s_WORKBOOK TYPE OLE2_OBJECT, "WorkBook
s_SHEET TYPE OLE2_OBJECT, "Sheet
s_CELL TYPE OLE2_OBJECT, "Cell
s_BORDERS TYPE OLE2_OBJECT, "Borders
s_Range TYPE OLE2_OBJECT, "Range
s_COLOR TYPE OLE2_OBJECT, " Color
s_ROW TYPE I , "Row,必须是I
s_COL TYPE I , "Col,
s_tmpcol type n , "I不能concatenate
s_colstr(4) type c,
s_Content(200) TYPE C . "Content
***使用OLE可象直接在excel中操作一样操作excel,很简单,只要在excel##
***将宏记录下来再用ABAP实现即可.
*Create a Excel object
CREATE OBJECT s_EXCEL 'Excel.application'.
IF SY-SUBRC NE 0.
MESSAGE E001(FI).
STOP.
ENDIF.
*Create a workbook
CALL METHOD OF s_EXCEL 'Workbooks' = s_WORKBOOK.
*open excel file
CALL METHOD OF s_WORKBOOK 'ADD' .
*Create a new execl file
CALL METHOD OF s_EXCEL 'Worksheets' = s_SHEET
EXPORTING
#1 = 1.
CALL METHOD OF s_SHEET 'ACTIVATE'.
SET PROPERTY OF s_SHEET 'NAME' = 'ST TEST SHEET'.
*1:Visible excel 0:invisible
SET PROPERTY OF s_EXCEL 'Visible' = 1.
* Write header in the 1 row .
do 3 times .
s_col = SY-INDEX .
s_tmpcol = SY-INDEX .
CALL METHOD OF s_EXCEL 'CELLS' = s_CELL
EXPORTING
#1 = 1
#2 = s_col.
concatenate 'COL' s_tmpcol into s_colstr.
set PROPERTY OF s_CELL 'VALUE' = s_colstr.
call method of s_cell 'INTERIOR' = s_COLOR .
set property of s_COLOR 'ColorIndex' = s_col.
set property of s_COLOR 'Pattern' = s_col .
FREE OBJECT s_COLOR.
enddo.
*将内表写入excel.
s_row = 2 .
Loop at itab_file .
CALL METHOD OF s_EXCEL 'CELLS' = s_CELL
EXPORTING
#1 = s_row
#2 = 1 .
set PROPERTY OF s_CELL 'VALUE' = itab_file-col1.
CALL METHOD OF s_EXCEL 'CELLS' = s_CELL
EXPORTING
#1 = s_row
#2 = 2 .
set PROPERTY OF s_CELL 'VALUE' = itab_file-col2.
CALL METHOD OF s_EXCEL 'CELLS' = s_CELL
EXPORTING
#1 = s_row
#2 = 3 .
set PROPERTY OF s_CELL 'VALUE' = itab_file-col3.
s_row = s_row + 1 .
endloop.
*用户自己去free,这是所谓的well-stype编程风格
*ABAP,VB,Delphi等使用OLE从内存中释放不了对象是常见的(头疼).
* call method of S_EXCEL 'SAVE'.
* CALL METHOD OF S_EXCEL 'QUIT'.
* FREE OBJECT s_WORKBOOK.
* FREE OBJECT s_SHEET.
* FREE OBJECT s_CELL.
* FREE OBJECT s_EXCEL.
* s_EXCEL-HANDLE = -1.
endform.
form sub_excel_get .
DATA: s_filetab TYPE FILETABLE ,
s_rc TYPE I ,
s_excel_name(100) TYPE C , "Excelname
s_excel_suff(3) TYPE C , "扩展名是否为XLS
s_excel_len TYPE I .
***可使用函数ALSM_EXCEL_TO_INTERNAL_TABLE读excel到内##
***但是要非常注意数据格式,所以我宁可一行行处理.
***使用类CL_GUI_FRONTEND_SERVICES打开文件
***类CL_GUI_FRONTEND_SERVICES有很多操作文件的方法读者自己研究
Call METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
CHANGING
file_table = S_FILETAB
rc = S_RC.
IF S_RC EQ 0.
EXIT.
ENDIF.
***判断后坠if '.XLS' CN EXCEL_NAME,做着##
***其实ABAP顾问应更着重业务的实现而非玩技术.
READ TABLE S_FILETAB INTO S_EXCEL_NAME INDEX 1.
CONDENSE S_EXCEL_NAME. " Get rid of blank
*check isvalid excel name 'XLS'
S_EXCEL_LEN = STRLEN( S_EXCEL_NAME ).
S_EXCEL_LEN = S_EXCEL_LEN - 3.
MOVE S_EXCEL_NAME+S_EXCEL_LEN(3) TO S_EXCEL_SUFF.
TRANSLATE S_EXCEL_SUFF TO UPPER CASE.
IF S_EXCEL_SUFF NE 'XLS'.
MESSAGE I001(00) WITH S_EXCEL_NAME ' is not a valid Excel name!'.
else.
***处理excel请看14节.使用OLE和excel交互,这里只写得到excel名称而已.
Message I001(00) with 'Read Excel:' S_EXCEL_NAME ' OK,'.
ENDIF.
endform.
form sub_fill_itab.
***填充example内表**
data tmpstr(9) type c.
data tmprow type n .
refresh itab_file .
do fileline times .
itab_file-col1 = sy-index.
tmprow = sy-index. "类型转换
concatenate 'st' tmprow into tmpstr.
condense tmpstr.
itab_file-col2 = tmpstr .
concatenate 'abapfile' tmprow into tmpstr.
condense tmpstr.
itab_file-col3 = tmpstr .
append itab_file .
enddo.
endform .
***不带用户对话框的读写本地文件
form sub_wo_local.
Message I001(00) with
'No code,Pls code with Function:'
'WS_Upload|WS_DOWNLOAD'
'yourself,See Example with Tcode:ABAPDOCU!'.
endform. "sub_wo_local
***带用户对话框的读写本地文##
form sub_wt_local.
***用户可看SAP帮助使用Download和upload的例##
***使用类弹出用户对话框
Data :s_filedir LIKE rlgrap-filename .
DATA: s_filemask(20) TYPE c VALUE ',*.txt ,*.txt. '.
DATA: s_filepath(60) TYPE c.
***Get current direcotry
CALL FUNCTION 'WS_QUERY'
EXPORTING
query = 'CD'
IMPORTING
return = s_filepath.
*** get file name ***
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = space
def_path = s_filepath
mask = s_filemask
mode = 'O'
IMPORTING
filename = s_filedir
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
check sy-subrc EQ 0. "User might cancel operation.
***如果文件后坠非.TXT加上后坠
TRANSLATE s_filedir TO UPPER CASE.
if '.TXT' CN s_filedir .
concatenate s_filedir '.TXT' into s_filedir .
endif.
*** write data to file ****
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = s_filedir
filetype = 'DAT'
mode = 'A'
TABLES
data_tab = itab_file
EXCEPTIONS
file_open_error = 01
file_write_error = 02
invalid_type = 03
no_batch = 04
unknown_error = 05.
CASE sy-subrc.
WHEN 0.
Message i001(00) with 'Data have been write into file:'
s_filedir ',Please check!' .
WHEN 1.
Message i001(00) with 'Error while opening file:' s_filedir.
WHEN 2.
Message i001(00) with 'Error in writing file ' s_filedir.
WHEN 3.
Message i001(00) with 'invalid file type of ' s_filedir .
WHEN OTHERS.
Message i001(00) with 'unknown error occured'.
ENDCASE.
endform.
form sub_appd_file .
OPEN DATASET s_fname FOR APPENDING in binary mode.
perform sub_fill_itab . "Append again
Loop at itab_file into iwa_file .
transfer iwa_file to s_fname ."写入文件
endloop.
close dataset s_fname .
message i001(00) with ' Total:' fileline ' records append to file:' s_fname .
endform. "sub_wt_local
*&--------------------------------------------------------------------*
*& Form sub_wrt_app_file
*&--------------------------------------------------------------------*
form sub_wrt_app_file.
***将内表值写入应用服务器文件appfile'***
OPEN DATASET s_fname FOR OUTPUT IN binary MODE.
Loop at itab_file into iwa_file .
transfer iwa_file to s_fname ."写入文件
endloop.
close dataset s_fname .
endform. "sub_wrt_app_file
*&--------------------------------------------------------------------*
*& Form sub_get_app_file.
*&--------------------------------------------------------------------*
form sub_get_app_file.
***将应用服务器文件appfile内容读出'***
data :s_file_line type i,
s_OREF TYPE REF TO CX_ROOT,
s_exptxt type string .
OPEN DATASET s_fname FOR input IN binary MODE.
clear iwa_file .
refresh itab_file .
do.
Try. "如果文件不存在读取会有错
Read Dataset s_fname into iwa_file .
CATCH CX_ROOT INTO s_OREF.
s_exptxt = s_OREF->GET_TEXT( ).
concatenate s_exptxt ',maybe file not exist,write file first!'
into s_exptxt .
MESSAGE s_exptxt TYPE 'E'.
endtry.
append iwa_file to itab_file .
if sy-subrc <> 0 .
exit . "如果文件结尾退出.
endif.
enddo.
close dataset s_fname .
describe table itab_file lines s_file_line.
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING
ENDPOS_COL = 30
ENDPOS_ROW = s_file_line
STARTPOS_COL = 20
STARTPOS_ROW = 1
TITLETEXT = 'Read file content from App.Server'
IMPORTING
CHOISE = s_file_line
TABLES
VALUETAB = itab_file
EXCEPTIONS
BREAK_OFF = 1
OTHERS = 2.
endform. "sub_get_app_file
*&--------------------------------------------------------------------*
*& Form sub_del_file
*&--------------------------------------------------------------------*
form sub_del_file.
DATA: S_ANS(1) TYPE C.
if S_query = 'N'. "初始时不提示confirm对话框.
DELETE DATASET s_fname .
exit.
endif.
call function 'POPUP_TO_CONFIRM_STEP'
exporting
* DEFAULTOPTION = 'Y'
TEXTLINE1 = 'Do you want to delete the file:'
TEXTLINE2 = s_fname
titel = 'Please Confirm !'
START_COLUMN = 25
START_ROW = 6
CANCEL_DISPLAY = 'X'
IMPORTING
ANSWER = S_ANS.
if S_ANS EQ 'J' . "If yes
DELETE DATASET s_fname .
if sy-subrc <> 0 .
message i001(00) with 'File:->' s_fname '<- not found in app. server,Write file first!'.
endif .
endif.
endform . "sub_del_file
***Using logical file from application server
***Using tcode SF01->client-spec|FILE:cross-client to define logic file.
form sub_logic_file.
DATA:s_FLAG,
s_FORMAT(3),
s_phyname(60),
s_tmpstr(60).
condense s_logfn.
if s_logfn eq space .
message i001(00) with
'Before getting a physical name, '
'Please input a logic file name '
'in the field s_logfn!'.
exit.
endif.
*** s_logfn类型和长度要和s_phyname相同?
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
LOGICAL_FILENAME = s_logfn
OPERATING_SYSTEM = SY-OPSYS
PARAMETER_1 = 'ST'
IMPORTING
EMERGENCY_FLAG = s_FLAG
FILE_FORMAT = s_FORMAT
FILE_NAME = s_phyname
EXCEPTIONS
FILE_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC = 0.
*** 实际业务写上你需要的文件处理逻辑
** 读者必须记住设置了逻辑文件名并不意味物理一定存在,当物理文件不存在##
***FILE_GET_NAME依旧能执行成功获得物理文件名.
*** 001(00) only allows 4 vars,Show the physical name out
concatenate 'logical file:' s_logfn ' with full Phys. Name:'
'Format:' s_format into s_tmpstr .
Message i001(00) with s_tmpstr s_phyname .
else .
concatenate 'logical file:' s_logfn into s_tmpstr .
Message i001(00) with s_tmpstr ' Not found or defined!'
'Using SF01 or FILE to define first!'.
endif.
endform.