ABAP使用文件
ABAP/4 允许使用应 用服务器或演示服务器上的顺序文件。
例如,这些 文件可以用 作数据的临时存储设备或本地程序与SAP 系统的接口。
使用应用服 务器上的文 件
ABAP/4提供一些语句,以使用存储在应用服务器顺序文件中而不是存储在数据库中的数据。下列主题说明:
文件和文件 路径的物理 定址是与平台相关的。R/3 系统提供了 允许使用平台相关文件名的功能模块和事务:
ABAP/4 提供了三种 文件处理语 句:
OPEN DATASET 语句用于打 开文件
CLOSE DATASET 语句用于关 闭文件
DELETE DATASET 语句用于删 除文件
打开文件
要在应用服 务器上打开 文件,请使 用 OPEN DATASET 语句。关于OPEN DATASET 语句的基本 形式说明, 参见:
OPEN DATASET 语句的基本 形式 (页 a)
OPEN DATASET 语句有若干个包括大量任务选项。可以:
关于其他选 项的详细信 息,参见OPEN DATASET 语句的关键 字文档。
OPEN DATASET 语句的基本 形式
要在应用服 务器上打开 文件,请如 下使用 OPEN DATASET 语句:
语法
OPEN DATASET <dsn>[options].
此语句打开 文件 <dsn> 。如果不指 定任何模式 选项,则文 件将按二进 制模式打开 (参见下述 主题)。如 果系统不能打开文件,则将系统字段SY-SUBRC 设置为 0,否则SY-SUBRC 返回 8。
可以将文件 名<dsn> 指定为字母 或包含文件 名的字段。如果未指定路径,则系统将在应用服务器上SAP 系统运行的目录中打开文件。要打开文件,运行SAP 系统的用户必须在操作系统级有相应的权限。
文件名是平 台相关的。 必须根据运 行 SAP 系统的操作 系统规则指 定文件名或 路径。要编 写与操作系 统中不相关 的程序,可 以使用逻辑 文件名(关 于逻辑文件 名的详细信 息,参见使用平台独 立的文件名 (页 l))。
DATA FNAME(60).
FNAME = '/tmp/myfile'.
OPEN DATASET 'myfile'.
OPEN DATASET FNAME.
如果 SAP 系统在 UNIX 系统下运行 ,则此示例 可以运行。 此程序在运 行 SAP 系统的目录 中以及在“ /tmp” 路径中打开 文件“myfile” 。对于其它 操作系统, 必须替换其 它文件名。 例如,对 OpenVMS 系统,可以 指定下述内 容:
FNAME = '[TMP]myfile.BIN'
OPEN DATASET 'myfile.BIN'.
接受操作系 统消息
尝试打开文 件后,要接 受操作系统 消息,请如 下使用 OPEN DATASET 语句的 MESSAGE 选项:
语法
OPEN DATASET <dsn>MESSAGE <msg>.
系统将在变 量 <msg> 中放置相关 的操作系统 消息。
要进行错误 处理,请与 系统字段一 起使用此选 项。
DATA: MESS(60),
FNAME(10) VALUE 'hugo.xyz'.
OPEN DATASET FNAME MESSAGE MESS.
IF SY-SUBRC <> 0.
WRITE: 'SY-SUBRC:', SY-SUBRC,
/ 'System Message:', MESS.
ENDIF.
如果 SAP 系统在 UNIX 下运行且不 存在“hugo.xyz” 文件,则此 示例输出如 下:
打开文件读 取
要打开文件 进行读访问 ,请如下使 用 OPEN DATASET 语句的 FOR INPUT 选项:
语法
OPEN DATASET <dsn> FORINPUT.
此语句打开 文件用于读 取。文件必须已经存在,否则系统将SY-SUBRC 设置为 8 并且忽略此命令。
如果文件已 打开(可能 用于读、写、或追加),系统将复位到文件的起始位置。但是在重新打开文件之前使用CLOSE 语句是良好的编程风格(关于关闭文件的详细信息,参见关闭文件 (页h) )。
DATA FNAME(60) VALUE 'myfile'.
OPEN DATASET FNAME FOR INPUT.
IF SY-SUBRC = 0.
WRITE / 'File opened'.
.....
ELSE.
WRITE / 'File not found'.
ENDIF.
在此示例中 ,打开“myfile” 文件以读取 。
打开文件写 入
要打开文件 进行写访问 ,请如下使 用 OPEN DATASET 语句的 FOR OUTPUT 选项:
语法
OPEN DATASET <dsn> FOROUTPUT.
此语句打开 文件用于写 入。如果文 件不存在, 则创建文件 。如果文件已存在但处于关闭状态,则删除其内容。如果文件已存在且已打开(可能为读、写、或追加),则复位到文件的起始位置。如果系统可以打开文件,则SY-SUBRC 设置为 0,否则SY-SUBRC 返回 8。
DATA: MESS(60),
FNAME(10) VALUE '/tmp'.
OPEN DATASET FNAME FOR OUTPUT MESSAGE MESS.
IF SY-SUBRC <> 0.
WRITE: 'SY-SUBRC:', SY-SUBRC,
/ 'System Message:', MESS.
ENDIF.
如果 SAP 系统在UNIX 下运行,此 示例输出如 下:
系统不能打 开该文件, 因为它是目 录。
下列程序将 演示当打开 文件用于写 入时其位置 如何设置。 但在重新打 开已打开文 件之前使用 CLOSE 语句是良好 的编程风格 (关于关闭 文件的详细 信息,参见关闭文件 (页h) )。
DATA FNAME(60) VALUE 'myfile'.
DATA NUM TYPE I.
OPEN DATASET FNAME FOR OUTPUT.
DO 10 TIMES.
NUM = NUM + 1.
TRANSFER NUM TO FNAME.
ENDDO.
PERFORM INPUT.
OPEN DATASET FNAME FOR OUTPUT.
NUM = 0.
DO 5 TIMES.
NUM = NUM + 10.
TRANSFER NUM TO FNAME.
ENDDO.
PERFORM INPUT.
CLOSE DATASET FNAME.
OPEN DATASET FNAME FOR OUTPUT.
NUM = 0.
DO 5 TIMES.
NUM = NUM + 20.
TRANSFER NUM TO FNAME.
ENDDO.
PERFORM INPUT.
FORM INPUT.
SKIP.
OPEN DATASET FNAME FOR INPUT.
DO.
READ DATASET FNAME INTO NUM.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE / NUM.
ENDDO.
ENDFORM.
此程序输出 如下:
1
2
3
4
5
6
7
8
9
10
10
20
30
40
50
6
7
8
9
10
20
40
60
80
100
在此示例中 ,“myfile” 文件
1. 打开 以写入。
2. 用 10 个整数填写 (关于 TRANSFER 语句的详细 信息,参见 向文件中写 入数据 (页 i) )。
3. 同时 打开以读取 ,这将复位 到文件的起 始位置。
4. 被读 入字段 NUM(关 于 READ DATASET 语句的详细 信息,参见 从文件中读 取数据 (页 k) )。NUM 的值写到输 出屏幕。
5. 重新 打开以写入 。这将复位 到文件的起 始处位置。
6. 用 5 个整数填写 。这些整数 将改写文件 的以前内容 。
7. 重新 打开以读取 。这将复位 到文件的起 始位置。
8. 被读 入字段 NUM。NUM 的值将写到 输出屏幕。
9. 关闭 (关于 CLOSE DATASET 语句的详细 信息,参见 关闭文件 (页 h) )。
10. 重 新打开以写 入。这将删 除现有文件 的内容。
11. 用 5 个整数填写 。
12. 同 时被打开以 读取。这将 复位到文件 的起始位置 。
13. 被 读入字段 NUM。NUM 的值将写到 输出屏幕。
打开文件追 加
要打开文件 追加数据, 请如下使用 OPEN DATASET 语句的 FOR APPENDING 选项:
语法
OPEN DATASET <dsn> FORAPPENDING.
此语句打开 文件在文件 末尾写入数据。如果文件不存在,则创建文件。如果文件已存在但处于关闭状态,系统将打开文件并定位到文件末尾。如果文件已存在且已打开(可能为读、写、或追加),将定位设置到文件末尾。SY-SUBRC总是返回0。
在再次打开 已经打开的 文件之前使 用 CLOSE 语句是良好 的编程风格 (关于关闭 文件的详细 信息,参见 关闭文件 (页 h))。
DATA FNAME(60) VALUE 'myfile'.
DATA NUM TYPE I.
OPEN DATASET FNAME FOR OUTPUT.
DO 5 TIMES.
NUM = NUM + 1.
TRANSFER NUM TO FNAME.
ENDDO.
OPEN DATASET FNAME FOR INPUT.
OPEN DATASET FNAME FOR APPENDING.
NUM = 0.
DO 5 TIMES.
NUM = NUM + 10.
TRANSFER NUM TO FNAME.
ENDDO.
OPEN DATASET FNAME FOR INPUT.
DO.
READ DATASET FNAME INTO NUM.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE / NUM.
ENDDO.
此示例输出 如下:
1
2
3
4
5
10
20
30
40
50
在此示例中 ,打开文件 以写入并用 从 1 ~ 5 中的五个整 数填写(关 于 TRANSFER 语句的详细 信息,参见 向文件中写 入数据 (页i))。下一语 句 OPEN DATASET 将复位到起 始位置,然 后打开文件 以追加并且 定位设置到 末尾位置。 10~ 50 的五个整数 将写入文件 。最后读取 文件内容并 写到屏幕。
指定二进制 模式
要用二进制 模式处理文 件,请如下 使用 OPEN DATASET 语句中的 IN BINARY MODE 选项:
语法
OPEN DATASET <dsn> IN BINARY MODE [FOR....].
如果从以二 进制模式打 开的文件中读取数据或向此类文件中写入数据,则系统将逐字节地传输数据。在传输期间,系统不解释文件内容。在将文件内容写入到另一文件时,系统将传输源文件的所有字节。在从文件读取数据到字段时,传输的字节数目取决于目标字段大小。在读取之时或之后,可以用其它ABAP/4 语句给目标 字段定址, 系统将根据数据类型解释字段内容。
DATA FNAME(60) VALUE 'myfile'.
DATA: NUM1 TYPE I,
NUM2 TYPE I,
TEXT1(4) TYPE C,
TEXT2(8) TYPE C,
HEX TYPE X.
OPEN DATASET FNAME FOR OUTPUT IN BINARY MODE.
NUM1 =111.
TEXT1 = 'TEXT'.
TRANSFER NUM1 TO FNAME.
TRANSFER TEXT1 TO FNAME.
OPEN DATASET FNAME FOR INPUT IN BINARY MODE.
READ DATASET FNAME INTO TEXT2.
WRITE / TEXT2.
OPEN DATASET FNAME FOR INPUT IN BINARY MODE.
READ DATASET FNAME INTO NUM2.
WRITE / NUM2.
OPEN DATASET FNAME FOR INPUT IN BINARY MODE.
SKIP.
DO.
READ DATASET FNAME INTO HEX.
If SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE HEX.
ENDDO.
此示例输出 如下:
###oTEXT
111
00 00 00 6F 54 45 58 54
在按二进制 模式为写入 数据而打开 文件“myfile” 后,将字段 NUM1 和 TEXT1 的内容写入 文件(关于 TRANSFER 语句的详细 信息,参见向文件中写 入数据 (页 i))。然后打 开文件以读 取并且其全 部内容传输 到字段 TEXT2 (关于 READ DATASET 语句的详细 信息,参见从文件中读 取数据 (页 k) )。字符串 TEXT2 的前四位没 什么意义, 因为各字节 是整数 111 表示法(平 台相关)。 系统企图将 所有字节解 释为字符, 但此解释工 作只对后四 个字节有效 。在用 OPEN 语句复位位 置之后,文 件的前四个 字节将读入 NUM2 。因为 NUM2 与 NUM1 的值有相同 的数据类型 ,所以 NUM2 的值有意义 。最后,将 文件的八个 字节逐字节 地从 HEX 的屏幕输出 读入到 HEX 字段中,可 以看到实际 文件内容十 六进制表示 法。后四个 字节为字 TEXT 中字符的 ASCII 表示法。
指定文本模 式
要用文本模 式处理文件 ,请如下使用OPEN DATASET 语句的 TEXT MODE 选项:
语法
OPEN DATASET <dsn> FOR.... IN TEXT MODE.
如果从以文 本模式打开 的文件中读 取数据或向 此类文件中 写入数据, 数据将逐行 传输。系统假定文件为行结构。
对于每个 TRANSFER 语句(关于 TRANSFER 语句的详细 信息,参见 向文件中写 入数据 (页 i) ),系统向 文件中传输 除结尾空白 之外的所有 字节,并在 其后作行结 束标记。
对于每个 READ DATASET 语句(关于 READ DATASET 语句的详细 信息,参见 从文件中读 取数据 (页 k) ),系统将 读取下一个 行结束标记 之前的所有 数据。如果 目标字段太 小,则截断 行的多余部 分。如果目 标字段长于 一行,则右 边各位填入 空格。
如果要将字 符串写入文 件或已知现存文件是基于行的格式,则应使用文本模式。例如,使用文本模式,可以读取在应用服务器上用专用文本编辑器创建的文件。
为运行在 UNIX 系统(使用 ASCII 表示法)下 的 SAP 系统写入如 下演示程序 。
DATA FNAME(60) VALUE 'myfile'.
DATA: TEXT(4),
HEX TYPE X.
OPEN DATASET FNAME FOR OUTPUT IN TEXT MODE.
TRANSFER '12 ' TO FNAME.
TRANSFER '123456 9 ' TO FNAME.
TRANSFER '1234 ' TO FNAME.
OPEN DATASET FNAME FOR INPUT IN TEXT MODE.
READ DATASET FNAME INTO TEXT.
WRITE / TEXT.
READ DATASET FNAME INTO TEXT.
WRITE TEXT.
READ DATASET FNAME INTO TEXT.
WRITE TEXT.
OPEN DATASET FNAME FOR INPUT IN BINARY MODE.
SKIP.
DO.
READ DATASET FNAME INTO HEX.
If SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE HEX.
ENDDO.
此程序输出 如下:
12 12341234
31 32 0A 31 32 33 34 35 36 20 20 39 0A 31 32 33 340A
在此示例中 ,以文本方 式打开“myfile” 文件以写入 。三个字符 串文字(每 个长度为 10 )传送到该 文件。在按 文本模式打 开文件以读 取之后,长 度为 4 的字段 TEXT 读入存储行 。第一行从 右端开始填 入两个空格 ,第二行的 后五位被截 断。以二进 制模式打开 文件并将其 读入十六进 制字段,表 明其实际结 构:在 31 ~ 36 之间的数是 数值字符 1 ~ 6 的 ASCII 表示法, 20 表示空格字 符,在每行 结尾标有 0A 标记。注意 :字符串文 字的结尾空 格不写入文 件。
在指定位置 打开文件
要在指定位 置打开文件 ,请如下使 用 OPEN DATASET 语句的 AT POSITION 选项:
语法
OPEN DATASET <dsn> [FOR ....] [IN ...MODE] AT POSITION <pos>.
此语句打开 文件<dsn> 并为读写数 据定位位置<pos>, 该位置从文 件起始处起按字节计算。在文件起始处以前,不能指定位置。
以二进制模 式工作时, 指定位置<pos> 相当有用, 因为文本文 件的物理表示法取决于操作系统。
DATA FNAME(60) VALUE 'myfile'.
DATA NUM TYPE I.
OPEN DATASET FNAME FOR OUTPUT AT POSITION 16.
DO 5 TIMES.
NUM = NUM + 1.
TRANSFER NUM TO FNAME.
ENDDO.
OPEN DATASET FNAME FOR INPUT.
DO 9 TIMES.
READ DATASET FNAME INTO NUM.
WRITE / NUM.
ENDDO.
OPEN DATASET FNAME FOR INPUT AT POSITION 28.
SKIP.
DO 2 TIMES.
READ DATASET FNAME INTO NUM.
WRITE / NUM.
ENDDO.
此示例输出 如下:
0
0
0
0
1
2
3
4
5
4
5
在此示例中 ,以默认二 进制模式打 开文件“myfile” 。写入时起 始位置指定 为 16 ,读取时起 始位置指定 为 28 。如本例所 示,如果位 置可被 4 整除,为写 入或读取整 数而指定位 置相当有用 。
关闭文件
要在应用服 务器上关闭 文件,请如 下使用 CLOSE DATASET 语句:
语法
CLOSE DATASET <dsn>.
此语句关闭 文件<dsn> 。文件命名 在打开文件 (页 1) 中有说明。
只有在下次 为写入打开 文件(详细信息和示例,参见打开文件写 入 (页 3) )期间要删除文件内容时,关闭文件才有必要。
为避免错误 并使程序易 于阅读,在 使用下一条 OPEN DATASET 语句之前应 关闭文件。 通过 CLOSE 语句,可将 文件分成逻 辑块并易于 维护。
DATA FNAME(60) VALUE 'myfile'.
OPEN DATASET FNAME FOR OUTPUT.
.....
CLOSE FNAME.
OPEN DATASET FNAME FOR INPUT.
.....
CLOSE FNAME.
OPEN DATASET FNAME FOR INPUT AT POSITION<pos>.
.....
CLOSE FNAME.
尽管 CLOSE 语句在此示 例中没有必 要,但它可 以改善程序 格式。
删除文件
要在应用服 务器上删除 文件,请如 下使用 DELETE DATASET 语句:
语法
DELETE DATASET <dsn>.
此语句删除 文件<dsn> 。文件命名 在打开文件 (页 1) 中有说明。
如果系统可 以删除文件 <dsn> ,则 SY-SUBRC 返回 0,否则 SY-SUBRC 返回 4。
DATA FNAME(60) VALUE 'myfile'.
OPEN DATASET FNAME FOR OUTPUT.
OPEN DATASET FNAME FOR INPUT.
IF SY-SUBRC = 0.
WRITE / 'File found'.
ELSE.
WRITE / 'File not found'.
ENDIF.
DELETE DATASET FNAME.
OPEN DATASET FNAME FOR INPUT.
IF SY-SUBRC = 0.
WRITE / 'File found'.
ELSE.
WRITE / 'File not found'.
ENDIF.
此示例输出 如下:
File found
File not found
在此示例中 ,如果文件 “myfile” 不存在,则 在打开文件 以写入时创 建该文件。 当打开文件 以写入时, 系统不能查 找此文件。 在 DELETE DATASET 语句之后, 系统不再查 找文件。
要向在应用 服务器上的 文件写入数 据,请如下 使用 TRANSFER 语句:
语法
TRANSFER <f> to<dsn> [LENGTH <len>].
此语句将字 段 <f> 的值写入文 件 <dsn> 。可以用 OPEN DATASET 语句指定传 输模式。如果不能打开文件以写入,则系统将尝试用二进制模式打开文件,或为此文件使用OPEN DATASET 语句的选项 。但是只用OPEN DATASET 语句打开文 件是良好的 编程风格。OPEN DATASET 语句和文件 命名在打开文件 (页 1) 中有说明。字段<f> 的数据类型 可以是基本 型,或者是不包含作为组件的内表格的字段字符串。内表格不能在一次执行中写入文件。
通过 LENGHT 选项,可以 指定传输数据的长度<len> 。系统将第 一个<len> 字节写入文 件。如果<len> 太小,则截 断超出的字 节。如果<len> 太大,系统 将在传输行 的右端各位填入空格。
下列程序将 演示如何向 文件中写入 内表格:
DATA FNAME(60) VALUE 'myfile'.
TYPES: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
DATA: LIN TYPE LINE,
TAB TYPE ITAB.
DO 5 TIMES.
LIN-COL1 = SY-INDEX.
LIN-COL2 = SY-INDEX ** 2.
APPEND LIN TO TAB.
ENDDO.
OPEN DATASET FNAME FOR OUTPUT.
LOOP AT TAB INTO LIN.
TRANSFER LIN TO FNAME.
ENDLOOP.
CLOSE DATASET FNAME.
OPEN DATASET FNAME FOR INPUT.
DO.
READ DATASET FNAME INTO LIN.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE: / LIN-COL1, LIN-COL2.
ENDDO.
CLOSE DATASET FNAME.
此示例输出 如下:
1 1
2 4
3 9
4 16
5 25
在此示例中 ,以行类型 LINE 创建字段字 符串 LIN 与内表格 TAB。在 填完内表格 TAB 之后,它将 逐行写入文 件“ myfile ”。然后将 文件读入字 段字符串 LIN 并将 LIN 内容写到输 出屏幕。
为运行在 UNIX 系统(使用 ASCII 表示法)下 的 SAP 系统编写如 下演示程序 。
DATA FNAME(60) VALUE 'myfile'.
DATA: TEXT1(4) VALUE '1234',
TEXT2(8) VALUE '12345678',
HEX TYPE X.
OPEN DATASET FNAME FOR OUTPUT IN TEXT MODE.
TRANSFER: TEXT1 TO FNAME LENGTH 6,
TEXT2 TO FNAME LENGTH 6.
CLOSE DATASET FNAME.
OPEN DATASET FNAME FOR INPUT.
DO.
READ DATASET FNAME INTO HEX.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
WRITE HEX.
ENDDO.
CLOSE DATASET FNAME.
此示例输出 如下:
31 3233 34 20 20 0A 31 32 33 34 35 36 0A
在此示例中 ,将两个字 符串 TEXT1 和 TEXT2 按文本模式 写入文件“ myfile” 。输出长度 值指定为 6。通过将 文件逐字节 地读入十六 进制字段, 可以看到如 何存储文件 :数值 31 ~ 36 是数值字符 1 ~ 6 的 ASCII 表示法,20 代表空格并 且 0A 用作行结束 标志。从 TEXT1 右端开始填 入两个空格 ,并将 TEXT2 的两个位置 截掉。
要从应用服 务器上的文 件中读取数 据,请如下 使用 READ DATASET 语句:
语法
READ DATASET <dsn> INTO<f> [LENGTH <len>].
此语句从文 件 <dsn> 中读取数据 赋值给变量 <f> 。要决定把 从文件中读取的数据赋值给哪个变量,必须清楚文件结构。
可以用 OPEN DATASET 语句指定传 输模式。如 果没有打开 文件以读取 ,则系统将 尝试以二进 制模式打开 文件或为此 文件使用 OPEN DATASET 语句的选项 。但是只用OPEN DATASET 语句打开文 件是良好的 编程风格。OPEN DATASET 语句和文件 命名在打开文件 (页 1) 中有说明。
在读取操作 成功后,SY-SUBRC 将返回 0。当到文 件末尾时, SY-SUBRC 将返回 4。当不能打开文件时,SY-SUBRC 将返回 8。
如果以二进 制模式工作 ,则可以使用LENGTH 选项查找实 际传输给字 段<f> 的数据长度 。系统可用 变量<len> 值设置该长 度。
DATA FNAME(60) VALUE 'myfile'.
DATA: TEXT1(12) VALUE 'abcdefghijkl',
TEXT2(5),
LENG TYPE I.
OPEN DATASET FNAME FOR OUTPUT IN BINARY MODE.
TRANSFER TEXT1 TO FNAME.
CLOSE DATASET FNAME.
OPEN DATASET FNAME FOR INPUT IN BINARY MODE.
DO.
READ DATASET FNAME INTO TEXT2 LENGTH LENG.
WRITE: / SY-SUBRC, TEXT2, LENG.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET FNAME.
此示例输出 如下:
0abcde 5
0 fghij 5
4 kl### 2
在此示例中 ,用字段 TEXT1 的 12 个字节填写 文件“myfile” 。然后将读 取 5 个字节赋值 给字段 TEXT2 。注意:在 到文件末尾 之后系统将 用空格填写 TEXT2 的后三个字 节,在字段 LENG 中给出实际 传输的字节 数。
如果以文本 模式工作, 可以使用LENGTH 选项查找文 件当前行的 实际长度。系统将用变量<len> 值设置行长 度。为此, 系统将计算文件中从当前位置到行结束标志符之间的字节数。
DATA FNAME(60) VALUE 'myfile'.
DATA: TEXT1(4) VALUE '1234 ',
TEXT2(8) VALUE '12345678',
TEXT3(2),
LENG TYPE I.
OPEN DATASET FNAME FOR OUTPUT IN TEXT MODE.
TRANSFER: TEXT1 TO FNAME,
TEXT2 TO FNAME.
CLOSE DATASET FNAME.
OPEN DATASET FNAME FOR INPUT IN TEXT MODE.
DO 2 TIMES.
READ DATASET FNAME INTO TEXT3LENGTH LENG.
WRITE: / TEXT3, LENG.
ENDDO.
CLOSE DATASET FNAME.
此示例输出 如下:
12 4
12 8
在此示例中 ,将字符串 TEXT1 和 TEXT2 按文本模式 写入文件“ myfile” 。然后读取 它们并赋值 给长度 2 的字符串 TEXT3 。行的存储 长度将写入 字段 LENG 。
在ABAP/4 语句中为使 用文件指定 的文件名是物理文件名。这意味着它们恰好满足运行有SAP 系统的操作系统的要求。按特定文件名和路径从ABAP/4 程序中创建 文件后,在 操作系统级登录后,可发现此文件恰好位于该位置。
在各操作系 统之间,因 为文件和路径的命名规则不同,除非如下使用工具,否则ABAP/4 程序就不能 从一个操作 系统移植到另一个操作系统。
要使程序可 以移植,SAP系统提供了逻辑文件名和逻辑路径的概念。逻辑文件和路径连接到物理文件和路径。在特殊表格中建立这种连接。可以根据需要维护这些表格。在ABAP/4 程序中,请 使用功能模 块FILE_GET_NAME 从逻辑文件 名中创建物 理文件名。
平台独立的 文件名维护 是定制的一部分。通过选择“工具 -> 定制 -> 实现工程 -> 显示完整的 IMG.”可以发现综合说明。在出现的屏幕上,选择“基础 -> 常规基础 -> 平台独立的 文件名分配”。
关于功能模 块 FILE_GET_NAME 的说明,请 在“ABAP/4 功能库:简 介”屏幕上 输入其名称 并选择文档 。在出现的 屏幕上,单 击“功能模块文档”。
下列主题提 供了关于如 何使用平台独立文件名的简要概述。
首先解释上 面提到的表 格维护,您将了解:
然后将了解 如何使用功 能模块 FILE_GET_NAME 以将 ABAP/4 程序中的逻 辑文件名转 换成物理文 件名。
维护语法组
语法组包含 所有操作系统(遵循相同的文件命名语法)的名称。要显示或创建语法组,请调用事务SF05 ,将出现下列屏幕:
在此屏幕上 ,可以看到 可用语法组的列表。如果需要,可通过单击“新条目”定义新的语法组。关于如何将操作系统分配到语法组的详细信息,参见将操作系统 分配到语法 组 (页l)。
将操作系统 分配到语法 组
调用事务SF04 以显示或维护操作系统到现有语法组的分配,将出现如下屏幕:
在此屏幕上 ,可以看到 当前受支持的操作系统列表。要创建新条目,请单击“新条目”。要将现有条目分配到语法组,请标志操作系统并单击“详情”。将出现如下屏幕:
在此屏幕上 ,操作系统HP-UX 分配到语法组UNIX 。
创建和定义 逻辑路径
每个逻辑文 件名都可与逻辑路径连接。逻辑路径给逻辑文件名提供平台相关的物理路径。要创建逻辑路径,请调用事务SF02 。在出现的屏幕上,请选择“新条目”并定义新的逻辑路径,如下例所示:
通过选择“ 保存”,保 存逻辑路径。
调用事务 SF03 以将现有逻辑路径与物理路径和语法组连接。在出现的屏幕上,请选择逻辑路径维护它与语法组的连接,或单击“新条目”以创建新连接。例如,语法组UNIX 的物理路径可按如下定义:
对于输入字 段,可以使 用可能条目的“逻辑路径和语法组”列表。要创建“物理路径”,可使用运行时用当前值替换的保留字(用尖括弧括起)。将光标放在输入字段上并选择“帮助”,可以获得保留字列表。在物理路径中必须包括保留字<FILENAME> 。它的实际 值由使用逻 辑路径的逻辑文件名定义。在当前示例中使用的保留字<PARAM_1> 的实际值是 功能模块FILE_GET_NAME 的输入参数 。
创建和定义 逻辑文件名
要创建逻辑 文件名,请调用事务SF01 并在出现的屏幕上选择“新条目”。定义逻辑文件名如下例所示:
如上所述, 既可以将逻 辑文件与逻辑路径连接,也可以在输入字段“物理文件”中输入物理文件名全称。在后一种情况下,逻辑文件名仅适用于一种操作系统。输入完整物理文件的规则与为逻辑路径定义物理路径的规则相同。有关详细信息和可能保留字的列表,请选择“帮助”。
当连接到逻 辑路径时, 逻辑文件适用于所有为逻辑路径维护的语法组。输入到“物理文件”中的文件名将替换分配到逻辑路径的物理路径中的保留字<FILENAME> 。要保持此 名称独立于 操作系统,请选择以字母开始的名称,该名称最多由8 个字符组成且不包含特殊字符。
通过选择“ 保存”,保 存定义。
在ABAP/4 程序中使用 逻辑文件
可以使用功 能模块 FILE_GET_NAME 从 ABAP/4 程序中的逻 辑文件名创 建物理文件 名。要在程 序中插入调 用功能模块 ,请在 ABAP/4 编辑器屏幕 中选择“编 辑 -> 插入语句” 。在出现的 对话框窗口 中,标志“调用功能”并键入FILE_GET_NAME。 该功能模块 的参数列表如下。
输入参数
参数 |
功能 |
CLIENT |
逻 辑文件和路 径的维护表 格是客户相 关的。所以 可输入所需 客户。当前 客户存储在 系统字段 SY-MANDT 中。 |
LOGICAL_FILENAME |
将 要转换的大 写字母输入 逻辑文件名 。 |
OPERATING_SYSTEM |
可 以输入事务 SF04 列表中包含 的任何操作 系统(参见将操作系统 分配到语法 组 (页 12) )。根据与 操作系统连 接的语法组 创建物理文 件名。默认 参数是系统 字段 SY-OPSYS 的值。 |
PARAMETER_1 PARAMETER_2 |
如 果指定这些 输入参数, 则物理路径 名中的保留 字 <PARAM_1> 和 <PARAM_2> 将由输入值 替换。 |
USE_PRESENTATION |
用 此标志可决 定是否输入 显示服务器 的操作系统 而不是由参 数 OPERATING_SYSTEM 输入的操作 系统。 |
WITH_FILE_EXTENSION |
如 果设置此标 志不等于 SPACE ,则为逻辑 文件名定义 的文件格式 将附加到物 理文件名。 |
输出参数
参数 |
功能 |
EMERGENCY_FLAG |
如 果此参数不 等于 SPACE ,则在逻辑 路径中不定 义物理名称 。紧急物理 名称可从表 格 FILENAME 和参数文件 参数创建。 |
FILE_FORMAT |
此 参数是为逻 辑文件名定 义的文件格 式。例如, 可以使用此 参数决定按 何种模式打 开文件。 |
FILE_NAME |
此 参数是物理 文件名(要 使用文件, 可以通过 ABAP/4 语句使用此 物理文件名 )。 |
例外参 数
参数 |
功能 |
FILE_NOT_FOUND |
如 果没有定义 逻辑文件, 则出现此例 外。 |
OTHERS |
如 果发生其它 错误,则出 现此例外。 |
假定逻辑文 件 MYTEMP 和逻辑路径 TMP_SUB 在前述主题 中已定义, 并假定下列 程序:
DATA: FLAG,
FORMAT(3),
FNAME(60).
WRITE SY-OPSYS.
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
LOGICAL_FILENAME = 'MYTEMP'
OPERATING_SYSTEM = SY-OPSYS
PARAMETER_1 = '01'
IMPORTING
EMERGENCY_FLAG = FLAG
FILE_FORMAT = FORMAT
FILE_NAME = FNAME
EXCEPTIONS
FILE_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC = 0.
WRITE: / 'Flag :', FLAG,
/ 'Format :', FORMAT,
/ 'Phys. Name:', FNAME.
ENDIF.
此程序输出 如下:
HP-UX
FLAG :
FORMAT :BIN
Phys. Name: /tmp/TEST01
在此示例中 ,SAP 系统运行于 操作系统 HP-UX 之下,该操 作系统是 UNIX 语法组的成 员之一。如 同为 UNIX 语法组定义 的那样,逻 辑文件名 MYTEMP 和逻辑路径 TMP_SUB 一起转换为 物理文件名 /tmp/TEST01 。字段 FNAME 可用于以后 的程序流以 使用目录 /tmp 中的文件 TEST01 。
假定具有物 理文件名 TEST 的逻辑文件 名 EMPTY 与没有指定 物理路径的 逻辑路径连 接。如果在 上例中用‘ EMPTY’ 替换输出参 数‘MYTEMP’ ,则输出结 果如下:
HP-UX
FLAG : X
FORMAT :
Phys. Name: /usr/sap/S11/SYS/global/TEST
系统创建紧 急文件名, 其路径取决 于当前 SAP 系统的安装 。
使用演示服 务器上的文 件
要使用演示 服务器上的文件,请使用功能库中提供的特殊功能模块。必须使用内表格作为程序与功能模块之间的接口。下列主题说明:
物理文件名 取决于演示 服务器的操作系统。如同使用平台独 立的文件名 (页 12)所述,可以使用逻辑文件名编写平台相关的ABAP/4 程序。
要通过用户 对话从内表 格向演示服务器写入数据,请使用功能模块DOWNLOAD。 最重要的参 数列表如下。有关详细信息,参见事务SE37 中的功能模块文档。
重要输入参 数
参数 |
功能 |
BIN_FILESIZE |
二 进制文件长 度 |
CODEPAGE |
仅 用于在 DOS 中下载:值 IBM |
FILENAME |
文 件名(用户 对话的默认 值) |
FILETYPE |
文 件类型(用 户对话的默 认值) |
ITEM |
用 户对话窗口 标题 |
MODE |
写 入模式(‘ empty’ = 改写,‘A’ = 追加) |
用 FILETYPE 可指定传输模式。可能值有:
BIN
二进制文件 :必须指定 文件长度, 并且内表格 必须包含有 数据类型 X 的一列。
ASC
ASCII 文件.
DAT
Excel 文件:列由 定位符分隔 ,行由回车 符和换行码 分隔。
WK1
Excel 文件和 Lotus 文件:数据 将写入 WK1 电子表格。
重要输出参 数
参数 |
功能 |
ACT_FILENAME |
文 件名(在用 户对话期间 输入) |
ACT_FILETYPE |
文 件类型(在 用户对话期 间输入) |
FILESIZE |
传 输字节数 |
表 格参数
参数 |
功能 |
DATA_TAB |
内 部源表格 |
例 外参数
参数 |
功能 |
INVALID_FILESIZE |
无 效参数 BIN_FILESIZE |
INVALID_TABLE_WIDTH |
无 效表格结构 |
INVALID_TYPE |
参 数 FILETYPE 无效值 |
假定表示所 用的操作系 统是 WINDOWS NT 并假定下列 程序:
PROGRAM SAPMZTST.
DATA: FNAME(128), FTYPE(3), FSIZE TYPE I.
TYPES: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
DATA: LIN TYPE LINE,
TAB TYPE ITAB.
DO 5 TIMES.
LIN-COL1 = SY-INDEX.
LIN-COL2 = SY-INDEX ** 2.
APPEND LIN TO TAB.
ENDDO.
CALL FUNCTION 'DOWNLOAD'
EXPORTING
CODEPAGE = 'IBM'
FILENAME = 'd:\temp\saptest.xls'
FILETYPE = 'DAT'
ITEM = 'Test for Excel File'
IMPORTING
ACT_FILENAME = FNAME
ACT_FILETYPE = FTYPE
FILESIZE = FSIZE
TABLES
DATA_TAB = TAB
EXCEPTIONS
INVALID_FILESIZE = 1
INVALID_TABLE_WIDTH = 2
INVALID_TYPE = 3.
WRITE: 'SY-SUBRC:', SY-SUBRC,
/ 'Name :', (60) FNAME,
/ 'Type :', FTYPE,
/ 'Size :', FSIZE.
启动程序后 ,将出现如 下用户对话 窗口:
在此窗口中 ,用户可更 改默认值。 在单击“确 定”后,系 统将从内表 格 TAB (已在程序 中填入数据 )向文件 d:\temp\saptest.xls 传送数据。 如果该文件 已经存在, 则系统询问 用户是否替 换此文件。 系统将在列 之间设置分 隔符,以及 在每行结尾 设置回车符 和换行。
此示例输出 如下:
SY-SUBRC: 0
Name : d:\temp\saptest.xls
Type : DAT
Size : 27
在演示服务 器上可以从 Excel 打开 d:\temp\saptest.xls 文件。出现 如下 Excel 屏幕:
在不使用用 户对话的情况下,要向演示服务器写入数据,请使用功能模块WS_DOWNLOAD 。最重要的 参数列表如 下。有关详细信息,参见事务SE37 中的功能模块文档。
重要输入参 数
参数 |
功能 |
BIN_FILESIZE |
二 进制文件长 度 |
CODEPAGE |
仅 在 DOS 中下载:值 IBM |
FILENAME |
文 件名 |
FILETYPE |
文 件类型 |
MODE |
写 模式(‘empty’ = 改写,‘A’ = 追加) |
使用 FILETYPE 可以指定传 输模式。可 能值有:
BIN
二进制文件 :必须指定 文件长度, 并且内表格 必须包含有 数据类型 X 的一列。
ASC
ASCII 文件,系统 在每行之后 设置行结束 标志。
DAT
Excel 文件:系统 用定位符分 隔列,用回 车符和换行 码分隔行。
WK1
Excel 文件和 Lotus 文件:数据 将写入 WK1 电子表格。
输出参数
参数 |
功能 |
FILELENGTH |
传 输字节数 |
表 格参数
参数 |
功能 |
DATA_TAB |
内 部源表格 |
例 外参数
参数 |
功能 |
FILE_OPEN_ERROR |
系 统不能打开 文件 |
FILE_WRITE_ERROR |
系 统不能向文 件写入数据 |
INVALID_FILESIZE |
无 效的参数 BIN_FILESIZE |
INVALID_TABLE_WIDTH |
无 效的表格结 构 |
INVALID_TYPE |
无 效的参数 FILETYPE 值 |
假定用于表 示的操作系 统是 WINDOWS NT 并假定下列 程序:
PROGRAM SAPMZTST.
DATA: FLENGTH TYPE I.
DATA TAB(80) OCCURS 5.
APPEND 'This is the first line of my text. 'TO TAB.
APPEND 'The second line. ' TO TAB.
APPEND ' The third line. ' TO TAB.
APPEND ' The fourth line. ' TO TAB.
APPEND ' Fifth and final line. ' TO TAB.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
CODEPAGE = 'IBM'
FILENAME = 'd:\temp\saptest.txt'
FILETYPE = 'ASC'
IMPORTING
FILELENGTH = FLENGTH
TABLES
DATA_TAB = TAB
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5.
WRITE: 'SY-SUBRC :', SY-SUBRC,
/ 'File length:', FLENGTH.
此示例输出 如下:
SY-SUBRC : 0
File length: 140
系统将向 ASCII 文件 d:\temp\saptest.txt. 传输表格 TAB 的五行。使 用 WINDOWS“ 文件管理器 ”,如下所 示可以检查 文件的存在 及长度:
现在可以使 用演示服务 器上的任何 编辑器打开 文件。在下 示例中,使 用 DOS 编辑器:
要通过用户 对话将数据 从演示服务器读取到给内表格中,请使用功能模块UPLOAD 。最重要的 参数列表如 下。有关详细信息,参见事务SE37 中的功能模块文档。
重要输入参 数
参数 |
功能 |
CODEPAGE |
仅 在 DOS 中加载:值 IBM |
FILENAME |
文 件名(用户 对话默认值 ) |
FILETYPE |
文 件类型(用 户对话默认 值) |
ITEM |
用 户对话窗口 标题 |
使用 FILETYPE 可以指定传输模式。可能值有:
BIN
二进制文件 。
ASC
ASCII 文件:具有 行结束标志 的文本文件 。
DAT
作为文本文 件保存的 Excel 文件,列由 定位符分隔 ,行由回车 符和换行码 分隔。
WK1
作为 WK1 电子表格保 存的 Excel 文件和 Lotus 文件。
重要输出参 数
参数 |
功能 |
FILESIZE |
传 输字节数 |
ACT_FILENAME |
文 件名(在用 户对话期间 输入) |
ACT_FILETYPE |
文 件类型(在 用户对话期 间输入) |
表 格参数
参数 |
功能 |
DATA_TAB |
内 部目标表格 |
例外参数
参数 |
功能 |
CONVERSION_ERROR |
在 数据转换中 的错误 |
INVALID_TABLE_WIDTH |
无 效的表格结 构 |
INVALID_TYPE |
不 正确参数 FILETYPE |
假定用于表 示的操作系 统是 WINDOWS NT 并假定如下 Excel 表格:
如果此表格 作为文本文 件(列之间 有定位符) 保存到 d:\temp\mytable.tab, 则下列程序 可以读取表 格:
PROGRAM SAPMZTST.
DATA: FNAME(128), FTYPE(3), FSIZE TYPE I.
TYPES: BEGIN OF LINE,
COL1(10) TYPE C,
COL2(10) TYPE C,
COL3(10) TYPE C,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
DATA: LIN TYPE LINE,
TAB TYPE ITAB.
CALL FUNCTION 'UPLOAD'
EXPORTING
CODEPAGE = 'IBM'
FILENAME = 'd:\temp\mytable.tab'
FILETYPE = 'DAT'
ITEM = 'Read Test for Excel File'
IMPORTING
FILESIZE = FSIZE
ACT_FILENAME = FNAME
ACT_FILETYPE = FTYPE
TABLES
DATA_TAB = TAB
EXCEPTIONS
CONVERSION_ERROR = 1
INVALID_TABLE_WIDTH = 2
INVALID_TYPE = 3.
WRITE: 'SY-SUBRC:', SY-SUBRC,
/ 'Name :', (60) FNAME,
/ 'Type :', FTYPE,
/ 'Size :', FSIZE.
SKIP.
LOOP AT TAB INTO LIN.
WRITE: / LIN-COL1, LIN-COL2, LIN-COL3.
ENDLOOP.
在启动此程 序后,将出 现用户对话 窗口:
在此窗口中 ,用户可以 更改默认值 。单击“确 定”后,系 统将数据从 文件 d:\temp\mytable.tab 传输到内表 格 TAB 。
此示例输出 如下:
SY-SUBRC: 0
Name : d:\temp\mytable.tab
Type : DAT
Size : 69
Billy the Kid
My Fair Lady
Herman the German
Conan the Barbarian
内表格 TAB 的内容等于 初始 Excel 表格的内容 。
不通过用户 对话,要将 数据从演示服务器读取到内表格,请使用功能模块WS_UPLOAD 。最重要的 参数列表如 下。有关详细信息,参见事务SE37 中的功能模块文档。
重要输出参 数
参数 |
功能 |
CODEPAGE |
仅 在 DOS 中下载:值 IBM |
FILENAME |
文 件名 |
FILETYPE |
文 件类型 |
使用 FILETYPE 可以指定传 输模式。可 能值有:
BIN
二进制文件 。
ASC
ASCII 文件:具有 行结束标志 的文本文件 。
DAT
作为文本文 件保存的 Excel 文件,列由 定位符分隔 ,行由回车 符和换行码 分隔。
WK1
作为 WK1 电子表格保 存的 Excel 文件和 Lotus 文件。
输出参数
参数 |
功能 |
FILELENGTH |
传 输字节数 |
表 格参数
参数 |
功能 |
DATA_TAB |
内 部目标表格 |
例外参数
参数 |
功能 |
CONVERSION_ERROR |
在 数据转换中 的错误 |
FILE_OPEN_ERROR |
系 统不能打开 文件 |
FILE_READ_ERROR |
系 统不能从文 件中读取数 据 |
INVALID_TABLE_WIDTH |
无 效的表格结 构 |
INVALID_TYPE |
无 效的参数 FILETYPE 值 |
假定用于表 示的操作系 统是 WINDOWS NT 并假定如下 文本文件:
下列程序将 读取该文本 文件:
PROGRAM SAPMZTST.
DATA: FLENGTH TYPE I.
DATA: TAB(80) OCCURS 5 WITH HEADER LINE.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
CODEPAGE = 'IBM'
FILENAME = 'd:\temp\mytext.txt'
FILETYPE = 'ASC'
IMPORTING
FILELENGTH = FLENGTH
TABLES
DATA_TAB = TAB
EXCEPTIONS
CONVERSION_ERROR = 1
FILE_OPEN_ERROR = 2
FILE_READ_ERROR = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5.
WRITE: 'SY-SUBRC:', SY-SUBRC,
/ 'Length :', FLENGTH.
SKIP.
LOOP AT TAB.
WRITE: / TAB.
ENDLOOP.
此示例输出 如下:
要获取演示 服务器上的 文件和演示服务器操作系统的信息,请使用功能模块WS_QUERY 。最重要的 参数列表如 下。有关详细信息,参见事务SE37 中的功能模块文档。
重要输入参 数
参数 |
功能 |
FILENAME |
查 询命令‘FE’ 、‘FL’ 、和‘DE’ 的文件名 |
QUERY |
查 询命令 |
输入 参数QUERY 定义查询命令。一些重要查询命令列表如下:
CD:查 询当前目录
EN:查 询环境变量
FL:查 询用 FILENAME 指定文件的 长度
FE:查 询用 FILENAME 指定文件的 存在性
DE:查 询用 FILENAME 指定目录的 存在性
WS:查 询演示服务 器的窗口系 统
OS:查 询演示服务 器的操作系 统
输出参数
参数 |
功能 |
RETURN |
查 询结果(‘ 0’表示‘ no’,‘ 1’表示‘ yes’) |
例外参数
参数 |
功能 |
INV_QUERY |
QUERY 或 FILENAME 的错误值 |
假定用于表 示的操作系 统是 WINDOWS NT,并假 定文件 SYSTEM.INI 存在(如下 所示):
下述程序决 定操作系统 及此文件的 属性:
PROGRAM SAPMZTST.
DATA: FNAME(60), RESULT(30), FLENGTH TYPE I.
FNAME = 'C:\WINNT35\SYSTEM.INI'.
CALL FUNCTION 'WS_QUERY'
EXPORTING
QUERY = 'OS'
IMPORTING
RETURN = RESULT
EXCEPTIONS
INV_QUERY = 1.
IF SY-SUBRC = 0.
WRITE: / 'Operating System:', RESULT.
ENDIF.
CALL FUNCTION 'WS_QUERY'
EXPORTING
QUERY = 'WS'
IMPORTING
RETURN = RESULT
EXCEPTIONS
INV_QUERY = 1.
IF SY-SUBRC = 0.
WRITE: / 'Windows:', RESULT.
ENDIF.
CALL FUNCTION 'WS_QUERY'
EXPORTING
FILENAME = FNAME
QUERY = 'FE'
IMPORTING
RETURN = RESULT
EXCEPTIONS
INV_QUERY = 1.
IF SY-SUBRC = 0.
WRITE: / 'File exists ?', RESULT.
ENDIF.
CALL FUNCTION 'WS_QUERY'
EXPORTING
FILENAME = FNAME
QUERY = 'FL'
IMPORTING
RETURN = FLENGTH
EXCEPTIONS
INV_QUERY = 1.
IF SY-SUBRC = 0.
WRITE: / 'File Length:', FLENGTH.
ENDIF.
此程序输出 如下:
Operating System: NT
Windows: WN32
File exists ? 1
File Length: 210
WN32 窗口系统是 WINDOWS NT 的窗口系统 。关于缩写 的详细信息 ,请将光标 放在功能模 块文档屏幕 的 QUERY 字段上并选 择“帮助” 。