1.赋值(三种方法)
MOVE F1 TO F2
WRITE VALUE TO FIELD
等号
偏移量
MOVE [+<偏移量>] [(<取位数>)] to [+<偏移量>][(<取数位>)]
WRITE…
DATA: LV_DATE1 TYPE SY-DATUM.
DATA: LV_DATE2 TYPE SY-DATUM.
LV_DATE1 = SY-DATUM.
LV_DATE2 = LV_DATE1.
LV_DATE2+6(2) = 30.
WRITE LV_DATE1.
SKIP.
WRITE LV_DATE2.
字段变量组件复制。
move-corresponding to
types:begin of ty_s1,
id type char10,
name type char20,
end of ty_s1.
types:BEGIN OF ty_s2.
INCLUDE type ty_s1. " structre is used by standard structure.
TYPES:COUNT TYPE INT2.
TYPES: END OF TY_S2.
DATA: LS_S1 TYPE TY_S1.
DATA: LS_S2 TYPE TY_S2.
LS_S1-id = 00001 .
LS_S1-name = 'Harry'.
MOVE-CORRESPONDING LS_S1 TO LS_S2.
WRITE LS_S1.
SKIP.
WRITE:/,ls_s2-id.
WRITE:/,ls_s2-name.
WRITE:/,ls_s2-count.
通过指针实现数据的赋值
FIELD-SYMBOLS <FS1>.
DATA:LV_DATA1 TYPE CHAR10 VALUE 'ABCD'.
DATA:LV_DATA2 TYPE INT2 VALUE 10.
ASSIGN LV_DATA2 TO <FS1>.
WRITE:/, '<FS1>', <FS1>.
WRITE:/, 'lv_data2', lv_data2.
if <fs1> is ASSIGNED.
<fs1> = 8.
ENDIF.
WRITE:/, 'lv_data2', lv_data2.
2.数值处理
在不同类型的数据对象之间赋值,会自动进行类型的转换;
转换过程遵照固定的规则,如C类型数据赋值给N类型,只有数字字符传递,其它忽略;
C不能直接赋值给I,需要C-N-I;
可以使用move to 或write to 语句。
以下是LV_DATA1不能直接赋值给lv_data2.
FIELD-SYMBOLS <FS1>.
DATA:LV_DATA1 TYPE CHAR10 VALUE 'ABCD'.
DATA:LV_DATA2 TYPE INT2 VALUE 10.
DATA:LV_DATA4 TYPE INT2 VALUE 7.
ASSIGN LV_DATA2 TO <FS1>.
WRITE:/, '<FS1>', <FS1>.
WRITE:/, 'lv_data2', lv_data2.
if <fs1> is ASSIGNED.
<fs1> = 8.
ENDIF.
WRITE:/, 'lv_data2', lv_data2.
WRITE SY-ULINE.
LV_DATA1 = 12345 .
data : lv_data3(6) type n.
lv_data3 = lv_data1.
lv_data2 = lv_data3.
WRITE:/, 'lv_data1', lv_data1.
WRITE:/, 'lv_data2', lv_data2.
算术运算符与比较逻辑运算符
-
-
- / div mod(/ 与DIV是一样)
-
运算符与变量之间必须有空格。
比较运算符
EQ 或= (等于)
<> 或 >< 或NE:(不等于)
<或LT: 小于
<=或LE: 小于等于
或GT: 大于
= 或GE: 大于等于
逻辑运算符:
AND:
OR:
NOT:
比较逻辑运算符是用于逻辑判断。
ABAP函数有
ABS :返回输入参数的绝对值
TRUNC:返回输入参数的整数部份
FRAC : 返回输入参数的小数部份
STRLEN:获取字符串长度函数
DATA: LV_STRING TYPE STRING.
LV_STRING = '1123456789'.
DATA: LV_NUMBER TYPE I.
LV_NUMBER = STRLEN( LV_STRING ).
WRITE:/,'LV_NUMBER:',LV_NUMBER.
日期数据的运算与时间数据的运算。
字符串处理
字符串移位
将字符串整体或者子串进行位移:
shift [by places] []
" 字符串移位
Data lv_string1 type string.
LV_STRING1 = 'ABCDEFG'.
WRITE SY-ULINE.
WRITE:/,'LV_STRING1:', LV_STRING1.
SHIFT LV_STRING1 BY 3 PLACES RIGHT.
WRITE:/,'LV_STRING1:', LV_STRING1.
移除字符串C左边/右边的子字符串C1:
shift c left/right deleting
leading/trailing c1
" 字符串移位
Data lv_string1 type string.
DATA LV_SUBS(3) TYPE C VALUE 'ABC'.
DATA LV_SUBS1(3) TYPE C VALUE 'EFG'.
LV_STRING1 = 'ABCDEFG'.
WRITE SY-ULINE.
WRITE:/,'LV_STRING1:', LV_STRING1.
SHIFT LV_STRING1 BY 3 PLACES RIGHT.
WRITE:/,'LV_STRING1:', LV_STRING1.
SHIFT LV_STRING1 LEFT DELETING LEADING SPACE.
WRITE:/,'LV_STRING1:', LV_STRING1.
SHIFT LV_STRING1 RIGHT DELETING TRAILING LV_SUBS1.
WRITE:/,'LV_STRING1:', LV_STRING1.
替代字符串
REPLACE WITH INTO
将字符串中的以来取代
字竺串转换
translate to upper/lower case.
将全部字符转成大写/小写
寻找字符串
从字符串F中搜索字符串g
SEARCH F FOR G
会回存到两个数,sy-subrc 和 sy-fdpos(sy-fdpos这个是开始位置)
如果查找这些则必须加 ’ ..’
字符串合并
将多个字街串合并成一个字符串
concaenate F1…Fn into g [separated by h]
字符串拆分
将一个字符串拆分并赋值给多个变量。
split f at g into h1…hn
去除字符串的空格:
condense c
清除变量内容
CLEAR
3.流程控制
SAP中无非就是数据流和凭证流;把这些可以串联接起来就可以了
IF .
.
ELSEIF
ELSE
ENDIF
case . " 这里是变量,主要用于屏幕的功能码。
when .
.
when .
.
when …
when others.
.
endcase.
循环语句
计数循环;条件循环 loop 循环
计数循环
DO [ TIMES]
ENDDO.
n:可以是数字或者变量,如果n是0要么负数,系统不执行该循环
TIMES:循环次数.
该语句埕中至少包含一个EXIT, STOP语句。
系统为量sy-index记录循环的次数.
条件循环
使用while指定循环条件:
WHILE
ENDWHILE
满足条件时候执行,不满足,退出.
loop循环
loop循环常用于实现内表数据的循环读取和操作
loop at itab
write:itab.
endloop.
循环语句关键字
continue :无条件终止当前循环,直接执行下一次循环
exit : 终止所有循环
CHECK:有条件终止当前循环
以下是上面的例子.
" 去触空格
CONDENSE LV_STRING1.
WRITE:/,'LV_STRING1:', LV_STRING1.
"字符串替换
lv_string1 = 'ABCDEFG'.
lv_string2 = '1234' .
" 将lv_string1 里的'ABC'替换成 '1234'.
WRITE SY-ULINE.
REPLACE LV_SUBS WITH LV_STRING2 INTO LV_STRING1.
WRITE:/,'LV_STRING1:', LV_STRING1.
"字符串查找
SEARCH LV_STRING1 FOR LV_STRING2.
WRITE:/ '查找结果',sy-subrc,sy-fdpos.
WRITE: SY-ULINE.
" 字符串拼接
CONCATENATE lv_string1 lv_string2 INTO lv_string1 SEPARATED BY SPACE.
WRITE:/,'LV_STRING1:', LV_STRING1.
CONDENSE lv_string1 NO-GAPS.
WRITE:/,'LV_STRING1:', LV_STRING1.
"字符串的拆分
CLEAR LV_STRING2.
DATA: LV_STRING3 TYPE STRING.
SPLIT lv_string1 AT SPACE INTO LV_STRING2 LV_STRING3 .
WRITE SY-ULINE.
WRITE:/,'LV_STRING2:', LV_STRING2.
WRITE:/,'LV_STRING3:', LV_STRING3.
" 条件语句(判读语句) 变量lv_number是否是偶数
DATA LV_NUMBER1 TYPE INT2.
DATA LV_RESULT TYPE INT2.
WRITE SY-ULINE.
LV_NUMBER1 = 7.
LV_RESULT = LV_NUMBER1 MOD 2.
IF lv_result = 0.
WRITE: 'lv_number1 是偶数'.
else.
write : 'lv_number1 是基数'.
endif.
" DO循环
WRITE SY-ULINE.
DO 5 TIMES.
WRITE:/,'当前是第',SY-index, '次循环'.
ENDDO.
" DO循环
WRITE SY-ULINE.
do 5 TIMES.
WRITE:/, '当前是第',SY-index, '次循环第一次打印'.
IF sy-index = 3.
CONTINUE.
endif.
WRITE:/, '当前是第',SY-index, '次循环的第二次打印'.
ENDDO.
" WHILE 循环
WRITE SY-ULINE.
While sy-index <= 5.
WRITE:/, '当前是第',SY-index, '次循环'.
ENDWHILE.
CHECK SY-INDEX = 5.