移动字段内容
按给定位置数移动字符串
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>个字符出现在右边。
* shifting strings by a given number of places
string1 LIKE t1.
string1 = t1.
WRITE string1.
SHIFT string1.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES LEFT.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES RIGHT.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES CIRCULAR.
WRITE / string1.
输出如下:
abcdefghij
bcdefghij
defghij
abcdefg
defghijabc
移动字符串到给定串
SHIFT <c> UP TO <str> <mode>.
ABAP/4 查找<c>字段内容直到找到字符串<str> 并将字段<c>移动到字段边缘。<mode> 选项与上述相同。<str> 可为变量。
如果 <c> 中找不到<str>,则将SY-SUBRC设置为 4 并且不移动 <c>。否则,将SY-SUBRC设置为0。
* shifting up to a given string
DATA: t2(10) TYPE c VALUE 'abcdefghij',string2 LIKE t2,
str2(2) TYPE c VALUE 'ef'.
string2 = t2.
WRITE string2.
SHIFT string2 UP TO str2.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 LEFT.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 RIGHT.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 CIRCULAR.
WRITE / string2.
输出如下:
abcdefghij
efghij
efghij
abcdef
efghijabcd
根据第一个或最后一个字符移动字段串
SHIFT <c> LEFT DELETING LEADING <str>.
SHIFT <c> RIGHT DELETING TRAILING <str>.
假设左边的第一个字符或右边的最后一个字符出现在 <str> 中,该语句将字段 <c> 向左或向右移动。字段右边或左边用空格填充 。<str>可为变量。
* shifting a string depending on the first or last sign
string3 LIKE t3,
str3(6) TYPE c VALUE 'ghijkl'.
string3 = t3.
WRITE string3.
SHIFT string3 LEFT DELETING LEADING space.
WRITE / string3.
string3 = t3.
SHIFT string3 RIGHT DELETING TRAILING str3.
WRITE / string3.
输出如下:
abcdefghij
abcdefghij
abcdef
替换字段内容
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> 可为变量。
* replacing values
DATA: t4(10) TYPE c VALUE 'abcdefghij',
string4 LIKE t4,
str41(4) TYPE c VALUE 'cdef',
str42(4) TYPE c VALUE 'klmn',
str43(2) TYPE c VALUE 'kl',
str44(6) TYPE c VALUE 'klmnop',
len4 TYPE i VALUE 2.
string4 = t4.
WRITE string4.
REPLACE str41 WITH str42 INTO string4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str42 INTO string4 LENGTH len4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str43 INTO string4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str44 INTO string4.
WRITE / string4.
输出如下:
abcdefghij
abklmnghij
abklmnefgh
abklghij
abklmnopgh转换大/小写并替换字符
TRANSLATE <c> TO UPPER CASE.
TRANSLATE <c> TO LOWER CASE.
这些语句将字段 <c>中的所有小写字母转换成大写或反之。
TRANSLATE <c> USING <r>.
该语句根据字段 <r> 中存储的替换规则替换字段 <c> 的所有字符 。<r> 包含成对字母,其中每对的第一个字母用第二个字母替换 。<r> 可为变量。
* translating signs
DATA: t5( 10) TYPE c VALUE 'AbCdEfGhIj',
string5 LIKE t5,
rule5( 20) TYPE c VALUE 'AxbXCydYEzfZ'.
string5 = t5.
WRITE string5.
TRANSLATE string5 TO UPPER CASE. "#EC SYNTCHAR
WRITE / string5.
string5 = t5.
TRANSLATE string5 TO LOWER CASE. "#EC SYNTCHAR
WRITE / string5.
string5 = t5.
TRANSLATE string5 USING rule5. "#EC SYNTCHAR
WRITE / string5.
输出如下:
AbCdEfGhIj
ABCDEFGHIJ
abcdefghij
xXyYzZGhIj
CONVERTTEXT <c> INTO SORTABLE CODE <sc>.
该语句为字符字段<c>填充可排序目标字段<sc>。 字段<c>必须是类型C且字段<sc> 必须是类型X,最小长度为<c>长度的16倍。
该语句目的是为字符字段<c>创建相关字段<sc>,作为<c>的按字母顺序排列的排序关键字。在内表的内容和已解压缩的数据中进行排序。
如果对未转换的字符字段进行排序,则系统创建与各字母的特定平台内部编码相对应的顺序。在对目标字段进行排序之后,转换CONVERTTEXT按这样的方式创建目标字段,相应的字符字段顺序按字母排序。例如 ,在德语中,顺序为‘ Miller、 Moller、 M ller、 Muller’ ,而不是‘ Miller、 Moller、 Muller、 M ller’。
转换方法依赖于运行ABAP/4程序的文本环境。文本环境在用户主记录中定义。例外的是可以使用如下语句, 在程序中设置文本环境:
SETLOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].
该语句根据语言<lg> 设置文本环境。对于选项COUNTRY,只要特定国家语言不同,就可以在语言以外指定国家。对于选项MODIFIER,只要一个国家内语言不同,就可以指定另一个标识符,例如,排序顺序在电话簿和词典之间不同。
字段<lg>、<cy>和<m>必须是类型C且长度必须与表TCP0C的关键字段长度相等。TCP0C是一个Table,维护平台相关的文本环境。在语句SET LOCALE期间,系统根据TCP0C中的条目设置文本环境。除了内部传送的平台特性之外,用SET语句指定表关键字。如果<lg>等于SPACE,则系统根据用户主记录设置文本环境。如果对于指定的关键字在表中无条目,则系统将产生运行错误。
文本环境影响ABAP/4中依赖于字符集的所有操作。
覆盖字符字段
OVERLAY <c1> WITH <c2> [ONLY <str>].
该语句用<c2> 的内容覆盖字段 <c1> 中包含<str> 中字母的所有位置。<c2> 保持不变。如果省略 ONLY<str>, 则覆盖字段 <c1> 中所有包含空格的位置。
如果至少要替换<c1>中的一个字符,则将 SY-SUBRC 设置为0。对于所有其它情况,将SY-SUBRC设置为4。如果<c1> 比 <c2> 长,则只覆盖<c2>中的长度。
* overlaying strings
string6 LIKE t6,
over6(10) TYPE c VALUE 'ABCDEFGHIJ',
str6(2) TYPE c VALUE 'ai'.
string6 = t6.
WRITE string6.
WRITE / over6.
OVERLAY string6 WITH over6.
WRITE / string6.
string6 = t6.
OVERLAY string6 WITH over6 ONLY str6.
WRITE / string6.
输出如下:
a c e g i
ABCDEFGHIJ
aBcDeFgHiJ
A c e g I
搜索字符串
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> 开始的词。 |
单词之间用空格、逗号、句号、分号、冒号、问号、叹号、括号、斜杠、加号和等号等分隔。
*searching strings
DATA string7(30) TYPE c VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH string7 FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR 'itt '.
WRITE: / 'itt ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR '*e'.
WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 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> 中指定字符串的单词,其中字符可能被其它字符隔开。单词和字符串 的第一个字母必须相同。
STARTINGAT <n1>
在字段 <c>中搜索从 <n1> 开始的<str>。结果 SY-FDPOS 参照相对于<n1> 的偏移量而不是字段的开始。
ENDINGAT <n2>
在字段 <c> 搜索 <str> 直到位置 <n2>。
ANDMARK
如果找到搜索串,则将搜索串中的所有字符(和使用ABBREVIATED时的所有字符)转换为大写形式。
DATA: string8(30) TYPE c VALUE 'This is a fast first example.',
pos8 TYPE i,
off8 TYPE i.
WRITE / string8.
SEARCH string8 FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', sy-fdpos.
pos8 = sy-fdpos + 2.
SEARCH string8 FOR 'ft' ABBREVIATED STARTING AT pos8 AND MARK.
WRITE / string8.
WRITE: / 'SY-FDPOS:', sy-fdpos.
off8 = pos8 + sy-fdpos - 1.
WRITE: / 'Off:', off8.
输出如下:
This is a fast first example.
SY-FDPOS: 10
This is a fast FIRST example.
SY-FDPOS: 4
Off: 15
获得字符串长度
[COMPUTE]<n> = STRLEN( <c> ).
STRLEN将操作数 <c> 作为字符数据类型处理,而不考虑其实际类型。不进行转换。关键字COMPUTE 可选。
* length of a string
DATA: int TYPE i,
word1(20) TYPE c VALUE '12345',
word2(20) TYPE c ,
word3(20) TYPE c VALUE ' 4 '.
int = strlen( word1 ). WRITE int.
int = strlen( word2 ). WRITE / int.
int = strlen( word3 ). WRITE / int.
结果分别是 5,0 和 4。
压缩字段内容
CONDENSE <c> [NO-GAPS].
该语句去除字段<c>中的前导空格并用一个空格替换其它空格序列。结果是左对齐单词,每个单词用空格隔开。如果指定附加的NO-GAPS,则去除所有空格。
* condensing strings
DATA: string9(25) TYPE c VALUE ' one two three four',
len9 TYPE i.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
CONDENSE string9.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
CONDENSE string9 NO-GAPS.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
输出如下:
one two three four !
Length: 25 one two three four !
Length: 18 onetwothreefour !
Length: 15
连接字符串
CONDENSE <c> [NO-GAPS].
该语句去除字段<c>中的前导空格并用一个空格替换其它空格序列。结果是左对齐单词,每个单词用空格隔开。如果指定附加的NO-GAPS,则去除所有空格。
CONCATENATE <c1> ... <cn> INTO <c> [SEPARATED BY <s>].
该语句连接字符串<c1>与<cn>并将结果赋给<c>。
该操作忽略尾部空格。
附加SEPARATED BY <s>允许指定字符字段<s>,它放置在单个字段间已定义的长度中。
如果结果符合 <c>,则将SY-SUBRC设置为0。然而,如果结果必须被截断,则将SY-SUBRC设置为4。
* concatenating strings
DATA: c1(10) TYPE c VALUE 'Sum',
c2(3) TYPE c VALUE 'mer',
c3(5) TYPE c VALUE 'holi ',
c4(10) TYPE c VALUE 'day',
c5(30) TYPE c ,
sep(3) TYPE c 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
拆分字符串
SPLIT <c> AT <del> INTO <c1> ... <cn>.
该语句在字符字段<c>搜索分界字符串<del>,并将分界符之前和之后的部分放到目标字段<c1>... <cn> 中。
要将所有部分放到不同目标字段中,必须指定足够目标字段。否则,用字段<c>的剩余部分填充最后目标字段并包含分界符。
如果所有目标字段足够长且不必截断任何部分,则将SY-SUBRC设置为0。否则,将其设置为4。
* splitting strings
DATA: string10(60) TYPE c ,
p1(20) TYPE c VALUE '++++++++++++++++++++',
p2(20) TYPE c VALUE '++++++++++++++++++++',
p3(20) TYPE c VALUE '++++++++++++++++++++',
p4(20) TYPE c VALUE '++++++++++++++++++++',
del10(3) TYPE c VALUE '***'.
string10 = ' Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5'.
WRITE string10.
SPLIT string10 AT del10 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
分配字符串部分
MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].
将左对齐的字符字段<c1>的百分比<p>(或如果用RIGHT选项指定,则为右对齐)复制到<c2>。
<p>值可为0和100之间的任何数。将要从<f1>复制的长度取整为下一个整数。
如果语句中某一参数不是类型 C,则忽略参数PERCENTAGE。
* moving parts of strings
DATA: mc1(10) TYPE c VALUE 'ABCDEFGHIJ',
mc2(10) TYPE c .
MOVE mc1 TO mc2 PERCENTAGE 40.
WRITE mc2.
MOVE mc1 TO mc2 PERCENTAGE 40 RIGHT.
WRITE / mc2.
输出如下:
ABCD
ABCD