REPORT ZHELLOWORLD.
* 基本的输入输出操作
WRITE '!!!!@#!@#!@#!@#!@#/ANY NUMBER'.
* 输出换行符
WRITE /.
* Data Type learning
* 设置变量名txt1且长度为15,变量类型为C(字符——这里为长度是15的字符串)
* 并设定变量的值为 Data Object
DATA txt1(15) TYPE C VALUE 'Data Object'.
WRITE: txt1.
WRITE /.
* 自定义一个类型名叫t_txt,这个类型是长度为15的字符串
TYPES t_txt(15) TYPE c.
* 使用自定义的类型来声明一个叫做txt2的变量
* 并给它赋值为 Data Object2
DATA txt2 TYPE t_txt VALUE 'Data Object2'.
* 输出这个变量+回车+sggd+回车 <——————如何在一句WRITE里面输出一堆东西
WRITE: txt2,/'sggd',/.
* 注意冒号: 输出一串东西的组合需要在WRITE后面加冒号,且不同的东西用逗号隔开
==========================================================
* This is to run another program
* 可以运用SUBMIT语句来运行另外一个程序文件
* SUBMIT ZWFWEAFEWF.
WRITE '!!!!@#!@#!@#!@#!@#'. "Long Comment,句尾可以用一个双引号来开启注释模式
WRITE /.
* 由于ABAP没有布尔变量,可以用一个字符来模拟布尔变量
DATA: bool_ind TYPE C.
bool_ind = 'X'.
IF bool_ind = 'X'.
WRITE / 'True'.
ELSE.
WRITE / 'False'.
ENDIF.
===============================================================
* 类型N表示一个数字字符串,可用来存储员工编号、邮政编码等
"Used for post code, employee code and other number
DATA temp1(7) TYPE N VALUE '3838438'.
WRITE: temp1,/.
* FORMAT COLOR COL_KEY.
* 使用FORMAT语句来处理输出格式化的问题
* 这句话表示对COLOR进行格式化,格式是COL_KEY,而COL_KEY代表一种系统内置的颜色
* 在这个语句之后,所有用WRITE语句输出的,全部都会使用COL_KEY所代表的颜色。
* If you write format function started at here
* Then the following text would all become this color
* 类型d代表日期,类型t代表时间
DATA: temp2 TYPE d,
temp3 TYPE t.
temp2 = '20051231'.
temp3 = '121559'.
* 日期和时间可以自动按照格式进行加减
* 例如年末31号加1就变成次年1号。
temp2 = temp2 + 1.
temp3 = temp3 + 1.
WRITE: /,temp2,' ',temp3.
* 定义一个类型为I的整形
DATA: tmp4 TYPE I,
tmp5 TYPE I VALUE 5.
* 在ABAP中使用赋值语句,一定要用空格分隔开
tmp4 = 1.
* ABAP中的循环语句,这里循环tmp5次
* 因为tmp5的VALUE是5,也就是循环5次
DO tmp5 TIMES.
tmp4 = tmp4 + 2.
ENDDO.
WRITE: /,tmp4,' ',tmp5,/.
DATA: tmp6 TYPE f.
* 在ABAP中使用数学函数,注意函数中的变量与前后括号要用空格隔开
* 例如(2)就会报错,而( 2 )不会报错
* Inside SQRT function, before and after the number
* It must have a space
tmp6 = SQRT( 2 ).
* 格式化输出tmp6,这里用COL_KEY所代表的系统颜色进行格式化
WRITE: tmp6 COLOR COL_KEY.
==============================================================
* 定义一个16进制的X类型变量temp7
DATA temp7 TYPE X.
temp7 = 'F3D9'.
* temp7 = temp7 + 1.
WRITE: /,temp7,/.
* 定义类型为p的小数,类型为f的浮点数
DATA: pack TYPE p,
float TYPE f.
pack = '-12.345'.float = '75E-034'.
WRITE: /,pack,' ',/,float.
TYPES newTypeNm(10) TYPE c.
DATA: chinese_name(10) TYPE c,
f_name TYPE newTypeNm VALUE 'cheong',
l_name TYPE f_name VALUE 'Jacky'. " 这里可以使用变量来对变量进行格式化,格式化后的变量跟被用来格式的变量的格式相同
chinese_name = 'Zhang XueYou'.
WRITE: f_name, l_name, chinese_name.
TYPES: spfli_type TYPE spfli,
surname(15) TYPE c, " If the length is less than data, then the exceed part will be dropped
BEGIN OF address, " 用来定义一个叫做address的结构体
name TYPE surname, " 结构体address里面包含3个变量,一个是name,2个是street,3个是city
street(30) TYPE C,
city TYPE spfli_type-cityfrom, " 使用系统默认的格式来进行格式化
END OF address.
DATA my_add TYPE address.
my_add-name = 'Zhang Ming'. " 对结构体中的变量进行赋值
my_add-street = 'No.10 Xitucheng Road'.
my_add-city = 'Singapore'.
WRITE: /,my_add. " 可以整体打印结构体
==========================================================
* 定义一个新的结构体类型,名叫person
TYPES: BEGIN OF person, " 开始定义person中的变量列表
addr TYPE address, " person中包含2个变量,一个是addr,另一个是address
addr2 TYPE address,
END OF person.
* 这里我们可以看到,address是之前定义的包含3个变量的结构体。
* 而这个person中包含2个address类型的变量
* 这是一个结构体嵌套着结构体的“类型”
DATA my_person TYPE person. " 接着我们用这个复合的person类型来定义一个叫my_person的变量
DATA my_add2 TYPE address.
my_add2-name = 'Yong LI'.
my_add2-street = 'No.1 Road Hongyannan'.
my_add2-city = 'Beijing'.
my_person-addr2 = my_add.
my_person-addr = my_add2.
WRITE: /,my_person.
WRITE: /,my_person-addr,/,my_person-addr2.
* 似乎文字类型无法使用,有待研究
* serial_no = 001.
* sentence = 'Peter''s Company'.
DATA long_sen(40) TYPE c.
* 如何分行连接结构体
long_sen = 'This is ' &
'a very long ' &
'sentence.'.
*WRITE: /,serial_no.
*WRITE: /,sentence.
WRITE: /,long_sen.
CONSTANTS pi TYPE P DECIMALS 10 VALUE '3.1415926'. " 定义一个不可改变的常量
DATA: time1 TYPE T,
date1 TYPE D.
time1 = sy-uzeit. " 用sy-uzeit命令获取系统时间
date1 = sy-datum. " 用sy-datum命令获取系统日期
WRITE: /,pi,' ',time1 ,' '.
WRITE date1 YYMMDD. " 按照YYMMDD的格式输出日期
================================================================
DATA time2 TYPE T.
* 以下是等价的拷贝、赋值表达式
time2
=
time1
.
MOVE
time1
TO
time2
.
WRITE
:
/
,
pi
,
' '
,
time1
,
' '
.
* ????暂时无法通过编译的部分,有待考察????
DATA
:
text
(
8
)
TYPE C VALUE
'abcdefgh'
,
len
TYPE i
.
" 对于 Unicode 而言,DESCRIBE LENGTH 只能与 IN BYTE MODE 或 IN CHARACTER MODE 附加项一起使用
* DESCRIBE FIELD text LENGTH len. " Put the text's length into len value.
WRITE
:
text
,
'has length'
,
len
.
* DESCRIBE FIELD my_person LENGTH len.
* WRITE: /,my_person,'----',len.
* 定义2个变量,变量里面是结构体。
* 试图查看拷贝的情况
DATA
:
BEGIN OF
add_personel
,
title
(
5
)
VALUE
'Mr'
,
name
(
20
),
street
(
40
)
TYPE
N
,
no
(
3
)
TYPE
N
,
postcode
(
6
)
TYPE
N
,
END OF
add_personel
.
DATA
:
BEGIN OF
add_company
,
position
(
20
)
VALUE
'Consultant'
,
name
(
20
)
VALUE
'Jack Huang'
,
street
(
40
)
TYPE
N
VALUE
'Beijing Avenue'
,
no
(
3
)
TYPE
N
VALUE
'002'
,
postcode
(
6
)
TYPE
N
VALUE
'100875'
,
END OF
add_company
.
WRITE
:
/
,
add_company
.
WRITE
:
/
,
add_personel
.
* 关键点,MOVE-CORRESPONDING语句将add_company中
* 与add_personel结构体中变量名相同的部分进行拷贝
* 例如:他们都有name、street、no、postcode
MOVE-CORRESPONDING
add_company
TO
add_personel
.
CLEAR
add_company
.
WRITE
:
/
,
'*'
,
add_company
.
WRITE
:
/
,
'*'
,
add_personel
.
* 不过目前street打印出来的是一段数字,具体问题是啥还有待观察
* 类型转换和赋值
DATA
:
char1
(
10
)
TYPE C VALUE
'-X1Y2Z3.A4'
,
numc
(
10
)
TYPE
N
,
timeT
TYPE
T
VALUE
'010001'
,
integer
TYPE I
.
* 赋值的时候可以自动进行类型转换
numc
=
char1
.
integer
=
timeT
.
WRITE
:
/ char1
,
/ numc
,
/ timeT
,
/ Integer
.
* 数值运算
DATA
:
n
TYPE
f
,
x TYPE
f
,
y
TYPE
f
.
x
=
'32.0'
.
y
=
'24.0'
.
* 加法
COMPUTE
n
=
x
+ y
.
WRITE
:
/
,
x
,
' '
,
y
.
WRITE
:
/
,
'Result'
,
n
.
* 减法
n
=
x
-
y
.
WRITE
:
/
,
'Result'
,
n
.
* 乘法
MULTIPLY x BY
y
.
" 这么做,会把x乘以y的数值直接存储到x里面
" 此后x=x*y=32*24=768
WRITE
:
/
,
'Result'
,
x DECIMALS
3
.
* 除法
DIVIDE x BY
y
.
n
=
x
/ y
.
WRITE
:
/
,
'DIVIDE'
,
x
,
'/'
,
y
,
'='
,
n
.
* 整除
n
=
x DIV
y
.
WRITE
:
/
,
'Result'
,
n
.
* 取余数
n
=
x MOD
y
.
WRITE
:
/
,
'Result'
,
n
.
* 幂——次方
n
=
x
**
2
.
WRITE
:
/
,
'Result'
,
n
.
* 小插曲,想双击变量名来全选变量,这样就不用鼠标一个一个拖
* 但是双击后居然是弹出个小窗口……
* 【顺带】ABAP的数值表示法是:1,0240000000000000E+03
* 不懂为何用逗号,来表示小数点,非常容易误导
* 在ABAP中比较有意义的运算
* 跟财务、供应链相关的时间、日期运算
DATA
:
seconds
TYPE i
,
hours
TYPE i
,
time111
TYPE
t
VALUE
'100000'
,
time112
TYPE
t
VALUE
'080000'
.
seconds
=
time111
-
time112
.
hours
=
seconds /
3600
.
WRITE
:
/
'Seconds between time1 and time2:'
,
seconds
,
/
'Hours between time1 and time2:'
,
hours
.