ABAP字段的相关知识.docx
《ABAP字段的相关知识.docx》由会员分享,可在线阅读,更多相关《ABAP字段的相关知识.docx(11页珍藏版)》请在冰豆网上搜索。
ABAP字段的相关知识
要将单个字符串连接成一体,请使用CONCATENATE语句,用法如下:
语法
CONCATENATE...INTO[SEPARATEDBY].
该语句连接字符串与并将结果赋给。
该操作忽略尾部空格。
附加SEPARATEDBY允许指定字符字段,它放置在单个字段间已定义的长度中。
如果结果符合,则将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'-'.
CONCATENATEC1C2C3C4INTOC5.
WRITEC5.
CONCATENATEC1C2C3C4INTOC5SEPARATEDBYSEP.
WRITE/C5.
该过程的输出如下:
Summerholiday
Sum-mer-holi-day
在C1到C5之间,忽略尾部空格。
分隔符SEP保留尾部空格。
增加前導零以及去掉前導零函數
DATA:
ebelnTYPEekko-ebeln.
"增加前导零
CALLFUNCTION'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input =ebeln
IMPORTING
output=ebeln.
"去掉前导零
CALLFUNCTION'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input =ebeln
IMPORTING
output=ebeln.
去掉小数点后面的零:
dataITYPEPDECIMALS3.
DATATC(10)TYPEC.
I='3.100'.
TC=I.
WRITEI.
WRITETC.
I=I*1.
TC=TC*1.
WRITETC.
TC=TC*I.
WRITETC.
WRITEI.
3.5 数据的转换及运算
在程序中经常会遇到不同数据类型之间的赋值转换需求。
本节将简要介绍在ABAP中数据转换的基本方法。
3.5.1 数据类型的转换
在不同的数据对象之间赋值时,系统会自动进行类型转换,转换过程遵照固定规则进行,例如将一个C类型数据赋值给N类型的对象,只有数字字符被传递,其他字符则被忽略。
1.DATA:
TEXT(10) TYPE C VALUE 'ABC1234567',
2. NUM(10) TYPE N,
3. INT TYPE I.
4.NUM = TEXT.
5.INT = NUM.
6.WRITE:
NUM,INT.
上例的输出结果为:
0001234567 1,234,567,变量TEXT赋值给NUM时,ABC被转换为000,当NUM赋值给INT时,默认取其整数部分。
需注意的是,C类型不能直接赋值给I,如果上例中语句写为TEXT=NUM,系统将报错提示数据类型转换错误。
ABAP中还可以使用以下语法实现数据间赋值:
1.MOVE A TO B.
2.WRITE A TO B.
A和B可以是不同类型的变量。
当然,与直接赋值方法一样,类型转换在不同类型间还是有一定限制的,读者可以在实际开发中揣摩。
不同进制之间的转换可参考如下方法:
1.DATA:
CHR TYPE C.
2.FIELD-SYMBOLS:
TYPE X, "定义一个十六进制的指针类型
3. TYPE C.
4.CHR = 'A'.
5.ASSIGN CHR TO CASTING. "将字符转换为十六进制
6. = + 1.
7.ASSIGN TO CASTING. "将十六进制指针对象转换为字符指针对象
8.MOVE TO CHR. "将指针变量赋值到字符变量
1.数字类型(numerictypes)
(1).类型
Abap支持三种数字类型:
I:
整型
范围:
-2147483648to2147483647
P:
16位
范围:
取决于小数位的长度
注意事项:
为了确保计算正确,必须在程序属性中把fixedpointarithmetic选中,参考图1。
F:
浮点类型
范围:
+/-2.2250738585072014E-308to1.7976931348623157E+308
注意事项:
因为长度的关系,所以尽量不要用两个该类型的数据相等作为判断条件
(2).定义方法
[f1]typeI.
[f1]typePdecimals[num].
[f1]typeF.
(3).使用
I类型:
主要是用于计数器,数量,索引,偏移量等等
例如:
*取得内表行数
DATA:
V_COUNTERTYPEI.
V_COUNTER=LINES(I_TAB).
*根据索引读取内表中的数据
DATA:
V_INDEXTYPEI.
READTABLEI_TABINDEXV_INDEX.
*截取字符串
DATA:
V_OFFSET_STARTTYPEI,
V_OFFSET_LENGTH TYPEI,
V_C(10)TYPEC,
L_C(3) TYPEC.
V_C=‘ABCDEFGHIJ’.
V_OFFSET_START=3.
V_OFFSET_LENGTH =5
L_C=V_C+V_OFFSET_START(V_OFFSET_LENGTH).
RESULT:
L_C=‘DEFGH’.
P类型:
主要和数据库中的QUAN类型关联;
常用场合:
大小,长度,重量,货币等有单位的场合
*根据单位把数量写入字符型变量中
WRITE:
[数量]to[字符型变量]unit[单位].
F类型:
常用场合:
计算
字符类型:
一.包括:
C:
字符
N:
应该算是字符型的数字
D:
日期类型,标准长度8(YYYYMMDD),注意其初期值的判断,不是space,而是'00000000',判断语句可以使用isinitialornot。
T:
时间类型,标准长度6(HHMMSS)
二.具体使用:
1.对字符串的操作
1).SHIFT:
截断字符串
SHIFT{c}[BY{n}PLACES][{mode}].:
作用:
去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。
如果n超出字符串的长度,则字符串变空,所以在做此操作的时候要注意n的指定。
可以首先获得该字符串的长度,方法:
len=STRLEN(C)。
Mode:
指定字符串截断的方向。
LEFT:
从左边截断
RIGHT:
从右边截断
CIRCULAR:
把左边的字符放到右边。
SHIFT{c}UPTO{str}{mode}.:
作用:
把字符串中在str以前的字符都去掉,同样可以指定mode,原理同上。
SHIFT{c}LEFTDELETINGLEADING{str}.
SHIFT{c}RIGHTDELETINGTRAILING{str}.:
作用:
这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。
以上语句常用的场合:
A.去掉字符串中的前导字符。
例如:
如果alv中定一了一个字段是10位的字符,里面放的是so,po等number,而你不想显示前面的0,那么就可以这样做:
SHIFT{c}LEFTDELETINGLEADING0.
B.已知某个字符串中包含固定的字符,想把这个固定字符前面的字符删掉,那么可以使用:
SHIFT{c}UPTO{str}。
例如:
某个物料,通过增强mga00002和mga00003对其加了前缀,这个前缀部分是在某固定值表中取得的数据,在具体显示中,要把其前缀去掉。
如TE-MRP-MAT1中想把te去掉,mrp表示该物料是跑mrp的,需求要求把te-去掉,mrp可以在固定值表中取得,则可以使用SHIFT{c}UPTO'MRP'.
2).REPLACE:
替换字符串
REPLACE{str1}WITH{str2}INTO{c}[LENGTH{l}].:
作用:
把字符串c中的str1替换成str2,如果指定l,就是指定了替换的长度。
如果替换成功,则SY-SUBRC设置成0。
常用场合:
字符串的替换操作比较常用,需要注意的是l的指定长度。
3).TRANSLATE:
转换字符串
TRANSLATE{c}TOUPPERCASE.
TRANSLATE{c}TOLOWERCASE.:
作用:
字符串的大小写的转换
TRANSLATE{c}USING{r}.:
作用:
根据规则r转换字符串c
常用场合:
Sap系统一般都是使用大写字母的,但是某些特定的字段却是用小写字母来标记的,在操作这些字段的时候就需要注意大小写的转换了。
转换规则倒是不太常用,到现在我还没有遇到过。
4).SEARCH:
查找字符串
SEARCH{c}FOR{str}{options}.:
作用:
在字符串c中查找str,如果找到了,SY-SUBRC为0,SY-FDPOS为找到字符串的具体位置。
需要说明的地方:
注意模式的使用
指定str:
查找str,str中后面的空格忽略
指定.str.:
查找str,包含了str中尾部的空格
指定*str:
查找以str结尾的字符串
指定str*:
查找以str开头的字符串
{options}的指定:
主要用到的就是:
STARTINGAT{n1}指定开始位置
ENDINGAT{n2}指定结束位置
常用场合:
一般用来判断某个字符串是否符合条件。
也可以结合其他语句对字符串进行操作。
5).CONDENSE:
去掉字符串中的空格
CONDENSE{c}[NO-GAPS].:
作用:
去掉字符串中的前面和后面的空格,如果指定NO-GAPS,则去掉字符串中的所有空格。
常用场合:
获得字符串的精确长度,用于判断。
6).SPLIT:
拆分字符串
SPLIT{c}AT{del}INTO{c1}...{cn}.
作用:
按照分割字符del把字符串c分割成c1…cn。
SPLIT{c}AT{del}INTOTABLE{itab}.
作用:
按照分割字符del把c分割,然后放到内表中的相应字段
常用场合:
文件名的分割,根据完整的文件路径加文件名把文件名分割出来。
难点:
无法确定要分割多少次.
解决方法:
两两分割,到最后的那个就是了。
例如:
str=c:
\dir1\dir2\dir3\file
Splitstrat'\'intostr1str2.
Findstr2for'/'.
Checksy-subrc=0.
Do.
Findstr2for'/'.
Ifsy-subrc=0.
Splitstr2intostr1str2.
Else.
Exit.
Endif.
Enddo.
文件上传的类型是字符串,把其分割后放到内表中。
例如上面的问题:
data:
beginofitaboccurs0,
col1(30)typec,
endofitab.
Splitstrat'\'intotableitab.
describetableitablinesline.
Readtableitabindexline.
Itab-col1就是file
7).CONCATENATE:
连接字符串
CONCATENATE{c1}...{cn}INTO{c}[SEPARATEDBY{s}].
作用:
把c1…cn用s分隔连接到c中
常用场合:
文件下载,对文件中的字段编辑。
移动字段串到给定串
要移动字段内容以到给定串,则使用SHIFT语句,用法如下:
语法
SHIFTUPTO.
ABAP/4查找字段内容直到找到字符串并将字段移动到字段边缘。
选项与按
给定位置数移动字段串中所述相同。
可为变量。
如果中找不到,则将SY-SUBRC设置为4并且不移动。
否则,将SY-SUBRC设置为0。
DATA:
T(10)VALUE'abcdefghij',
STRINGLIKET,
STR
(2)VALUE'ef'.
STRING=T.
WRITESTRING.
SHIFTSTRINGUPTOSTR.
WRITE/STRING.
STRING=T.
SHIFTSTRINGUPTOSTRLEFT.
WRITE/STRING.
STRING=T.
SHIFTSTRINGUPTOSTRRIGHT.
WRITE/STRING.
STRING=T.
SHIFTSTRINGUPTOSTRCIRCULAR.
WRITE/STRING.
输出如下:
abcdefghij
efghij
abcdef
efghijabcd
根据第一个或最后一个字符移动字段串
假设第一个或最后一个字符符合一定条件,则可用SHIFT语句将字段向左或向右移动。
为此,请
使用以下语法:
语法
SHIFTLEFTDELETINGLEADING.
SHIFTRIGHTDELETINGTRAILING.
假设左边的第一个字符或右边的最后一个字符出现在中,该语句将字段向左或向右移
动。
字段右边或左边用空格填充。
可为变量。
DATA:
T(14)VALUE'abcdefghij',
STRINGLIKET,
STR(6)VALUE'ghijkl'.
STRING=T.
WRITESTRING.
SHIFTSTRINGLEFTDELETINGLEADINGSPACE.
WRITE/STRING.
STRING=T.
SHIFTSTRINGRIGHTDELETINGTRAILINGSTR.
WRITE/STRING.
该过程输出如下:
abcdefghij
abcdefghij
abcdef
替换字段内容
要用其它字符串替换字段串的某些部分,请使用REPLACE语句。
语法
REPLACEWITHINTO[LENGTH].
ABAP/4搜索字段中模式前个位置第一次出现的地方。
如果未指定长度,按全长度
搜索模式。
然后,语句将模式在字段中第一次出现的位置用字符串替换。
如果指定长度,
则只替换模式的相关部分。
如果将系统字段SY-SUBRC的返回代码设置为0,则说明在中找到且已用替换。
非0的返回代码值意味着未替换。
、和可为变量。
DATA:
T(10)VALUE'abcdefghij',
STRINGLIKET,
STR1(4)VALUE'cdef',
STR2(4)VALUE'klmn',
STR3
(2)VALUE'kl',
STR4(6)VALUE'klmnop',
LENTYPEIVALUE2.
STRING=T.
WRITESTRING.
REPLACESTR1WITHSTR2INTOSTRING.
WRITE/STRING.
STRING=T.
REPLACESTR1WITHSTR2INTOSTRINGLENGTHLEN.
SWRTIRITENG/=ST.RING.
REPLACESTR1WITHSTR3INTOSTRING.
WRITE/STRING.
STRING=T.
REPLACESTR1WITHSTR4INTOSTRING.
WRITE/STRING.
该过程的输出如下:
abcdefghij
abklmnghij
abklmnefgh
abklghij
abklmnopgh
请注意,在最后一行中,字段STRING是如何在右边截断的。
长度为4的搜索模式
‘cdef’用长度为6的‘klmnop’替换。
然后,填充字段STRING的剩余部分直到
字段结尾。
转换大/小写并替换字符
可以将字母转换大/小写或使用替换规则。
要转换大/小写,请使用TRANSLATE语句,用法如下:
语法
TRANSLATETOUPPERCASE.
TRANSLATETOLOWERCASE.
这些语句将字段中的所有小写字母转换成大写或反之。
使用替换规则时,请使用以下语法:
语法
TRANSLATEUSING.
该语句根据字段中存储的替换规则替换字段的所有字符。
包含成对字母,其中每对
的第一个字母用第二个字母替换。
可为变量。
有关包含更复杂替换规则的TRANSLATE语句的更多变体,参见关键字文档。
DATA:
T(10)VALUE'AbCdEfGhIj',
STRINGLIKET,
RULE(20)VALUE'AxbXCydYEzfZ'.
STRING=T.
WRITESTRING.
TRANSLATESTRINGTOUPPERCASE.
WRITE/STRING.
STRING=T.
TRANSLATESTRINGTOLOWERCASE.
WRITE/STRING.
STRING=T.
TRANSLATESTRINGUSINGRULE.
WRITE/STRING.
该过程的输出如下:
AbCdEfGhIj
ABCDEFGHIJ
abcdefghij
xXyYzZGhIj