马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服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. 结果分别是 5,0 和 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 将数据传送 给子程序时 (参见通过参数进行数据传递)。 对字符字段 、数值文本 字段、十六 进制字段及 日期和时间 字段指定偏 移量是有意 义的。 对于类型 F、I 和 P 的数值字段 或字段串不 要使用指定 偏移量。它 们不能与文 字或文本符 号一同使用 (有关文本 符号的详细 信息,参见文本符号 )。 DATA TIME TYPE T VALUE '172545'. WRITE TIME. WRITE / TIME+2(2). CLEAR TIME+2(4). WRITE / TIME. 该过程的输 出如下: 172545 25 170000 首先,在 WRITE 语句中通过
指定偏移量
选择分钟数
。然后,通
过在清除语
句中指定偏
移量将分钟
数和秒数设
置为初始默
认值。 |