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.