abap-文件处理的例子

下面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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值