壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1071|回复: 0

sap部分开发笔记9

[复制链接]
发表于 2010/1/8 14:22:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x

【处理字符串】  



ABAP/4 提供多个处 理类型 C 的数据对象 的关键字, 即字符串。

在字符串运 算期间,系 统不进行类 型转换。用 下述主题中 所述的字符 串处理关键 字,系统将 所有运算数 都当作类型 C 字段,而不 考虑它们的 实际类型。

处理字符串 的方法有:

移动字段内容

替换字段内容

转换大/小写并替换字符

转换为可排序格式

覆盖字符字段

搜索字符串

压缩字段内容

获得字符串长度

连接字符串

拆分字符串

有关 MOVE 语句变体( 只使用字符 串)的解释 ,参见

分配字符串部分

移动字段内

要移动字段 内容,请使 用以下主题 中所述的 SHIFT 语句的各种 变体。SHIFT 允许按字节 移动字段内 容(或在文 本字段按字 符移动)。

对于 SHIFT 语句,可以 执行以下功 能:

按给定位置数移动字段串

移动字段串到给定串

根据第一个或最后一个字符移动字段串

按给定位置 数移动字段

要按给定位 置数移动字 段内容,请 使用 SHIFT 语句,用法 如下:

语法

SHIFT <c> [BY <n> PLACES] [<mode>].

该语句将字 <c> 移动 <n> 个位置。如 果省略 BY <n> PLACES 则将 <n> 解释为一个 位置。如果 <n> 0 或负值,则 <c> 保持不变。 如果 <n> 超过 <c> 长度,则 <c> 用空格填充 <n> 可为变量。

对不同(<mode> 选项,可以 按以下方式 移动字段 <c>


LEFT:

向左移动 <n> 位置,右边 <n> 个空格填充 (默认设置 )。


RIGHT:

向右移动 <n> 位置,左边 <n> 个空格填充


CIRCULAR:

向左移动 <n> 位置,以便 左边 <n> 个字符出现 在右边。

DATA: T(10) VALUE 'abcdefghij',


STRING LIKE T.

STRING = T.

WRITE STRING.

SHIFT STRING.

WRITE / STRING.

STRING = T.

SHIFT STRING BY 3 PLACES LEFT.

WRITE / STRING.

STRING = T.

SHIFT STRING BY 3 PLACES RIGHT.

WRITE / STRING.

STRING = T.

SHIFT STRING BY 3 PLACES CIRCULAR.

WRITE / STRING.

输出为:

abcdefghij

bcdefghij

defghij


abcdefg

defghijabc

移动字段串 到给定串

要移动字段 内容以到给 定串,则使 SHIFT 语句,用法 如下:

语法

SHIFT <c> UP TO <str> <mode>.

ABAP/4 查找 <c> 字段内容直 到找到字符 <str> 并将字段 <c> 移动到字段 边缘。 <mode> 选项与按给定位置数移动字段串中所 述相同。<str> 可为变量。

如果 <c> 中找不到 <str> 则将 SY-SUBRC 设置为 4 并且不移动 <c>。否 则,将 SY-SUBRC 设置为0

DATA: T(10) VALUE 'abcdefghij',



STRING LIKE T,


STR(2) VALUE 'ef'.

STRING = T.

WRITE STRING.

SHIFT STRING UP TO STR.

WRITE / STRING.

STRING = T.

SHIFT STRING UP TO STR LEFT.

WRITE / STRING.

STRING = T.

SHIFT STRING
UP TO STR RIGHT.

WRITE / STRING.

STRING = T.

SHIFT STRING
UP TO STR CIRCULAR.

WRITE / STRING.

输出如下:

abcdefghij

efghij

efghij


abcdef

efghijabcd

根据第一个 或最后一个 字符移动字 段串

假设第一个 或最后一个 字符符合一 定条件,则 可用 SHIFT 语句将字段 向左或向右 移动。为此 ,请使用以 下语法:

语法

SHIFT <c> LEFT
DELETING LEADING
<str>.

SHIFT <c> RIGHT DELETING TRAILING <str>.

假设左边的 第一个字符 或右边的最 后一个字符 出现在 <str> 中,该语句 将字段 <c> 向左或向右 移动。字段 右边或左边 用空格填充 <str> 可为变量。

DATA: T(14) VALUE '
abcdefghij',


STRING LIKE T,


STR(6) VALUE 'ghijkl'.

STRING = T.

WRITE STRING.

SHIFT STRING LEFT DELETING LEADING SPACE.

WRITE / STRING.

STRING = T.

SHIFT STRING RIGHT DELETING TRAILING STR.

WRITE / STRING.

该过程输出 如下:


abcdefghij

abcdefghij


abcdef

替换字段内

要用其它字 符串替换字 段串的某些 部分,请使 REPLACE 语句。

语法

REPLACE <str1> WITH <str2> INTO <c> [LENGTH <l>].

ABAP/4 搜索字段 <c> 中模式 <str1> <l> 个位置第一 次出现的地 方。如果未 指定长度, 按全长度搜 索模式 <str1>

然后,语句 将模式 <str1> 在字段 <c> 中第一次出 现的位置用 字符串 <str2> 替换。如果 指定长度<l> 则只替换模 式的相关部 分。

如果将系统 字段 SY-SUBRC 的返回代码 设置为0 则说明在 <c> 中找到 <str1> 且已用<str2> 替换。非 0 的返回代码 值意味着未 替换。

<str1> <str2> <len> 可为变量。

DATA: T(10) VALUE 'abcdefghij',


STRING LIKE T,


STR1(4) VALUE 'cdef',


STR2(4) VALUE 'klmn',


STR3(2) VALUE 'kl',


STR4(6) VALUE 'klmnop',


LEN TYPE I VALUE 2.

STRING = T.

WRITE STRING.

REPLACE STR1 WITH STR2 INTO STRING.

WRITE / STRING.

STRING = T.

REPLACE STR1 WITH STR2 INTO STRING LENGTH LEN.

WRITE / STRING.

STRING = T.

REPLACE STR1 WITH STR3 INTO STRING.

WRITE / STRING.

STRING = T.

REPLACE STR1 WITH STR4 INTO STRING.

WRITE / STRING.

该过程的输 出如下:

abcdefghij

abklmnghij

abklmnefgh

abklghij

abklmnopgh

请注意,在 最后一行中 ,字段 STRING 是如何在右 边截断的。 长度为 4 的搜索模式 cdef 用长度为6 klmnop 替换。然后 ,填充字段 STRING 的剩余部分 直到字段结 尾。

created with Help to RTF file format converter

转换大/ 写并替换字

可以将字母 转换大/ 写或使用替 换规则。

要转换大/ 写,请使用 TRANSLATE 语句,用法 如下:

语法

TRANSLATE <c> TO UPPER CASE.

TRANSLATE <c> TO LOWER CASE.

这些语句将 字段 <c> 中的所有小 写字母转换 成大写或反 之。

使用替换规 则时,请使 用以下语法

语法

TRANSLATE <c> USING <r>.

该语句根据 字段 <r> 中存储的替 换规则替换 字段 <c> 的所有字符 <r> 包含成对字 母,其中每 对的第一个 字母用第二 个字母替换 <r> 可为变量。

有关包含更 复杂替换规 则的 TRANSLATE 语句的更多 变体,参见 关键字文档

DATA: T(10) VALUE 'AbCdEfGhIj',


STRING LIKE T,


RULE(20) VALUE 'AxbXCydYEzfZ'.

STRING = T.

WRITE STRING.

TRANSLATE STRING TO UPPER CASE.

WRITE / STRING.

STRING = T.

TRANSLATE STRING TO LOWER CASE.

WRITE / STRING.

STRING = T.

TRANSLATE STRING USING RULE.

WRITE / STRING.

该过程的输 出如下:

AbCdEfGhIj

ABCDEFGHIJ

abcdefghij

xXyYzZGhIj

转换为可排 序格式

可以将字符 字段转换为 可按字母顺 序排列的格 式:

语法

CONVERT TEXT <c> INTO SORTABLE CODE <sc>.

该语句为字 符字段 <c> 填充可排序 目标字段 <sc> 字段 <c> 必须是类型 C且字段 <sc> 必须是类型 X ,最小长度 <c> 长度的16

该语句目的 是为字符字 <c> 创建相关字 <sc> 作为 <c> 的按字母顺 序排列的排 序关键字。 在内表的内 容和已解压 缩的数据中 进行排序( 参见内表排序 和给摘录数据集排序)。

如果对未转 换的字符字 段进行排序 ,则系统创 建与各字母 的特定平台 内部编码相 对应的顺序 。在对目标 字段进行排 序之后,转 CONVERT TEXT 按这样的方 式创建目标 字段,相应 的字符字段 顺序按字母 排序。例如 ,在德语中 ,顺序为‘ Miller Moller M ller Muller ,而不是‘ Miller Moller Muller M ller

转换方法依 赖于运行 ABAP/4 程序的文本 环境。文本 环境在用户 主记录中定 义。例外的 是可以使用 如下语句, 在程序中设 置文本环境

语法

SET LOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].

该语句根据 语言 <lg> 设置文本环 境。对于选 COUNTRY 只要特定国 家语言不同 ,就可以在 语言以外指 定国家。对 于选项 MODIFIER 只要一个国 家内语言不 同,就可以 指定另一个 标识符,例 如,排序顺 序在电话簿 和词典之间 不同。

字段 <lg> <cy> <m> 必须是类型 C 且长度必须 与表 TCP0C 的关键字段 长度相等。 TCP0C 是一个表格 ,从中进行 平台相关的 文本环境维 护。在语句 SET LOCALE 期间,系统 根据 TCP0C 的条目设置 文本环境。 除了内部传 送的平台特 性之外,用 SET 语句指定表 关键字。如 <lg> 等于 SPACE ,则系统根 据用户主记 录设置文本 环境。如果 对于指定的 关键字在表 中无条目, 则系统将产 生运行错误

文本环境影 ABAP/4 中依赖于字 符集的所有 操作。

有关该主题 的详细信息 ,参见 CONVERT TEXT SET LOCALE LANGUAGE 的关键字文 档。

关于如何根 据语言排序 的示例,参 见内表排序。

覆盖字符字

要用另一字 符字段覆盖 字符字段, 请使用 OVERLAY 语句,用法 如下:

语法

OVERLAY <c1> WITH <c2> [ONLY <str>].

该语句用 <c2> 的内容覆盖 字段 <c1> 中包含 <str> 中字母的所 有位置。<c2> 保持不变。 如果省略 ONLY <str> 则覆盖字段 <c1> 中所有包含 空格的位置

如果至少要 替换 <c1> 中的一个字 符,则将 SY-SUBRC 设置为 0。对于所 有其它情况 ,将SY-SUBRC 设置为 4。如果 <c1> <c2> 长,则只覆 <c2> 中的长度。

DATA: T(10) VALUE 'a c e g i ',


STRING LIKE T,


OVER(10) VALUE 'ABCDEFGHIJ',


STR(2) VALUE 'ai'.

STRING = T.

WRITE STRING.

WRITE / OVER.

OVERLAY STRING WITH OVER.

WRITE / STRING.

STRING = T.

OVERLAY STRING WITH OVER ONLY STR.

WRITE / STRING.

该过程的输 出如下:

a c e g i

ABCDEFGHIJ

aBcDeFgHiJ

A c e g I

搜索字符串

要搜索特定 模式的字符 串,请使用 SEARCH 语句,用法 如下:

语法

SEARCH <c> FOR <str> <options>.

该语句在字 <c> 中搜索<str> 中的字符串 。如果成功 ,则将 SY-SUBRC 的返回代码 值设置为0 SY-FDPOS 设置为字段 <c> 中该字符串 的偏移量。 否则将 SY-SUBRC 设置为4

搜索串 <str> 可为下列格 式之一:

<str>

<pattern>

<pattern> 任何字符顺 序)。忽略 尾部空格。


.<pattern>.

<pattern> ,但是不忽 略尾部空格

*<pattern>

索以 <pattern> 结尾的词。


<pattern>*

索以 <pattern> 开始的词。

单词之间用 空格、逗号 、句号、分 号、冒号、 问号、叹号 、括号、斜 杠、加号和 等号等分隔

DATA STRING(30) VALUE 'This is a little sentence.'.

WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.

ULINE /1(26).

SEARCH STRING FOR 'X'.

WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',


SY-FDPOS UNDER 'SY-FDPOS'

SEARCH STRING FOR 'itt
'.

WRITE: / 'itt
', SY-SUBRC UNDER 'SY-SUBRC',


SY-FDPOS UNDER 'SY-FDPOS'

SEARCH STRING FOR '.e .'.

WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',


SY-FDPOS UNDER 'SY-FDPOS'.

SEARCH STRING FOR '*e'.

WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',


SY-FDPOS UNDER 'SY-FDPOS'.

SEARCH STRING FOR 's*'.

WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',


SY-FDPOS UNDER 'SY-FDPOS'.

该过程的输 出如下:

SEARCHED SY-SUBRC SY-FDPOS

X
4
0

itt
0
11

.e .
0
15

*e
0
10

s*
0
17

搜索字符字 <c> 的各种选项 <options> 如下


ABBREVIATED

在字段 <c> 中搜索包含 <str> 中指定字符 串的单词, 其中字符可 能被其它字 符隔开。单 词和字符串 的第一个字 母必须相同


STARTING AT <n1>

在字段 <c> 中搜索从 <n1> 开始的 <str> 。结果 SY-FDPOS 参照相对于 <n1> 的偏移量而 不是字段的 开始。


ENDING AT <n2>

在字段 <c> 搜索 <str> 直到位置 <n2>


AND MARK

如果找到搜 索串,则将 搜索串中的 所有字符( 和使用 ABBREVIATED 时的所有字 符)转换为 大写形式。

DATA: STRING(30) VALUE 'This is a fast first example.',


POS TYPE I,


OFF TYPE I.

WRITE / STRING.

SEARCH STRING FOR 'ft' ABBREVIATED.

WRITE: / 'SY-FDPOS:', SY-FDPOS.

POS = SY-FDPOS + 2.

SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.

WRITE / STRING.

WRITE: / 'SY-FDPOS:', SY-FDPOS.

OFF = POS + SY-FDPOS -1.

WRITE: / 'Off:', OFF.

该过程的输 出如下:

This is a fast first example.

SY-FDPOS:
10

This is a fast FIRST example.

SY-FDPOS:
4

Off:
15

请注意,在 找到单词‘ fast 之后,为了 查找包含‘ ft’的第 二个单词, 必须在偏移 SY-FDPOS 上加2,然 后从位置 POS 开始查找。 否则,会再 次找到单词 fast 。要获得‘ first 相对于字段 STRING 开始的偏移 量,从 POS SY-FDPOS 计算。

获得字符串 长度

要决定字符 串到最后一 个字符而不 SPACE 的长度,请 使用内部函 STRLEN 用法如下:

语法

[COMPUTE] <n> = STRLEN( <c> ).

STRLEN 将操作数 <c> 作为字符数 据类型处理 ,而不考虑 其实际类型 。不进行转 换。

关键字 COMPUTE 可选。有关 内部函数的 详细信息, 参见 使用数学函数。

DATA: INT TYPE I,


WORD1(20) VALUE '12345'.


WORD2(20).


WORD3(20) VALUE '
4
'.

INT = STRLEN( WORD1 ). WRITE
INT.

INT = STRLEN( WORD2 ). WRITE / INT.

INT = STRLEN( WORD3 ). WRITE / INT.

结果分别是 50 4

压缩字段内

要删除字符 字段中多余 空格,请使 CONDENSE 语句,用法 如下:

语法

CONDENSE <c> [NO-GAPS].

该语句去除 字段 <c> 中的前导空 格并用一个 空格替换其 它空格序列 。结果是左 对齐单词, 每个单词用 空格隔开。 如果指定附 加的 NO-GAPS 则去除所有 空格。

DATA: STRING(25) VALUE ' one
two
three
four',


LEN TYPE I.

LEN = STRLEN( STRING ).

WRITE: STRING, '!'.

WRITE: / 'Length: ', LEN.

CONDENSE STRING.

LEN = STRLEN( STRING ).

WRITE: STRING, '!'.

WRITE: / 'Length: ', LEN.

CONDENSE STRING NO-GAPS.

LEN = STRLEN( STRING ).

WRITE: STRING, '!'.

WRITE: / 'Length: ', LEN.

该过程的输 出如下:


one
two
three
four !

Length:

25

one two three four
!

Length:
18

onetwothreefour
!

Length:
15

请注意,字 STRING 的总长度保 持不变(惊 叹号!), 但删除的空 格再次出现 在右边。

连接字符串

要将单个字 符串连接成 一体,请使 CONCATENATE 语句,用法 如下:

语法

CONCATENATE <c1> ... <cn> INTO <c> [SEPARATED BY <s>].

该语句连接 字符串 <c1> <cn> 并将结果赋 <c>

该操作忽略 尾部空格。

附加 SEPARATED BY <s> 允许指定字 符字段 <s>,它 放置在单个 字段间已定 义的长度中

如果结果符 <c>,则 SY-SUBRC 设置为0 然而,如果 结果必须被 截断,则将 SY-SUBRC 置为4

DATA: C1(10)
VALUE
'Sum',


C2(3)
VALUE
'mer',



C3(5)
VALUE
'holi ',


C4(10)
VALUE
'day',


C5(30),


SEP(3)
VALUE ' - '.

CONCATENATE C1 C2 C3 C4 INTO C5.

WRITE C5.

CONCATENATE C1 C2 C3 C4 INTO C5 SEPARATED BY SEP.

WRITE / C5.

该过程的输 出如下:

Summerholiday

Sum - mer - holi - day

C1 C5 之间,忽略 尾部空格。 分隔符 SEP 保留尾部空 格。

拆分字符串

要将字符串 拆分成两个 或更多小串 ,请使用 SPLIT 语句,用法 如下:

语法

SPLIT <c> AT <del> INTO <c1> ... <cn>.

该语句在字 符字段 <c> 搜索分界字 符串 <del> 并将分界符 之前和之后 的部分放到 目标字段 <c1> ... <cn> 中。

要将所有部 分放到不同 目标字段中 ,必须指定 足够目标字 段。否则, 用字段 <c> 的剩余部分 填充最后目 标字段并包 含分界符。

如果所有目 标字段足够 长且不必截 断任何部分 ,则将 SY-SUBRC 设置为0 否则,将其 设置为4

DATA: STRING(60),


P1(20) VALUE '++++++++++++++++++++',


P2(20) VALUE '++++++++++++++++++++',


P3(20) VALUE '++++++++++++++++++++',


P4(20) VALUE '++++++++++++++++++++',


DEL(3) VALUE '***'.

STRING = ' Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5'.

WRITE STRING.

SPLIT STRING AT DEL INTO P1 P2 P3 P4.

WRITE / P1.

WRITE / P2.

WRITE / P3.

WRITE / P4.

该过程的输 出如下:


Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5


Part 1


Part 2


Part 3


Part 4 *** Part 5

请注意,字 P1 ...P4 的内容全部 被改写且用 尾部空格填 充。

也可以将组 成原始串的 部分放到内 表中。

语法

SPLIT <c> AT <del> INTO <itab>.

对于字符串 的每一部分 ,系统添加 新表行(有 关内表的详 细信息,参 见创建和处理内表)。

分配字符串 部分

MOVE 语句的以下 变体只使用 类型 C 字段:

语法

MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].

将左对齐的 字符字段 <c1> 的百分比 <p>(或 如果用 RIGHT 选项指定, 则为右对齐 )复制到 <c2>

<p> 值可为 0 100 之间的任何 数。将要从 <f1> 复制的长度 取整为下一 个整数。

如果语句中 某一参数不 是类型 C,则忽略 参数 PERCENTAGE

DATA C1(10) VALUE 'ABCDEFGHIJ',


C2(10).

MOVE C1 TO C2 PERCENTAGE 40.

WRITE C2.

MOVE C1 TO C2 PERCENTAGE 40 RIGHT.

WRITE / C2.

该过程的输 出如下:

ABCD


ABCD

created with Help to RTF file format converter

指定数据对 象的偏移量

ABAP/4 中,可以在 所有处理数 据对象的语 句中指定基 本数据对象 的偏移量值

为此,请在 语句中指定 数据对象名 称,如下所 示:

语法

<f>[+<o>][(<l>)]

对字段 <f> 中从 <o>+1 开始且长度 <l> 的部分执行 该语句的操 作。

如果未指定 长度 <l>,则 对该字段 <o> 和结尾之间 的所有位置 进行处理。

通常,必须 将偏移量 <o> 和长度 <l> 指定为无符 号数值。能 够在以下例 外情况下可 以使用变量 动态指定:

    MOVE 或赋值运算 符给字段赋 值时

(参见用指定偏移量赋值

    WRITE TO 语句向字段 写入值时

参见用指定偏移量写入值)

    ASSIGN 将字段赋给 字段符号时

(参见使用字段符号)

    PERFORM 将数据传送 给子程序时

(参见通过参数进行数据传递)。

对字符字段 、数值文本 字段、十六 进制字段及 日期和时间 字段指定偏 移量是有意 义的。

对于类型 FI P 的数值字段 或字段串不 要使用指定 偏移量。它 们不能与文 字或文本符 号一同使用 (有关文本 符号的详细 信息,参见文本符号 )。

DATA TIME TYPE T VALUE '172545'.

WRITE TIME.

WRITE / TIME+2(2).

CLEAR TIME+2(4).

WRITE / TIME.

该过程的输 出如下:

172545

25

170000

首先,在 WRITE 语句中通过
指定偏移量
选择分钟数
。然后,通
过在清除语
句中指定偏
移量将分钟
数和秒数设
置为初始默
认值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 05:12 , Processed in 0.032701 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表