ABAP从逐条语句入门到精通——变量、…

来源:互联网 发布:java编程思想 最新版 编辑:程序博客网 时间:2024/05/21 22:57

REPORT ZHELLOWORLD.

基本的输入输出操作
WRITE '!!!!@#!@#!@#!@#!@#/ANY NUMBER'.

输出换行符
WRITE /.

Data Type learning
设置变量名txt1且长度为15,变量类型为C(字符——这里为长度是15的字符串)
并设定变量的值为 Data Object

DATA txt1(15TYPE VALUE 'Data Object'.
WRITEtxt1.
WRITE /.

自定义一个类型名叫t_txt,这个类型是长度为15的字符串
TYPES t_txt(15TYPE c.
使用自定义的类型来声明一个叫做txt2的变量
并给它赋值为 Data Object2

DATA txt2 TYPE t_txt VALUE 'Data Object2'.
输出这个变量+回车+sggd+回车  <——————如何在一句WRITE里面输出一堆东西
WRITEtxt2,/'sggd',/.
注意冒号 输出一串东西的组合需要在WRITE后面加冒号,且不同的东西用逗号隔开


==========================================================
This is to run another program
可以运用SUBMIT语句来运行另外一个程序文件
SUBMIT ZWFWEAFEWF.






WRITE '!!!!@#!@#!@#!@#!@#' "Long Comment,句尾可以用一个双引号来开启注释模式
WRITE /.


由于ABAP没有布尔变量,可以用一个字符来模拟布尔变量
DATAbool_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(7TYPE VALUE '3838438'.
WRITEtemp1,/.

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代表时间
DATAtemp2 TYPE d,
      temp3 
TYPE t.
temp2 
'20051231'.
temp3 
'121559'.
日期和时间可以自动按照格式进行加减
例如年末31号加1就变成次年1号。

temp2 
temp2 1.
temp3 
temp3 1.
WRITE/,temp2,',temp3.


定义一个类型为I的整形
DATAtmp4 TYPE I,
      tmp5 
TYPE VALUE 5.
ABAP中使用赋值语句,一定要用空格分隔开
tmp4 
1.
ABAP中的循环语句,这里循环tmp5
因为tmp5VALUE5,也就是循环5

DO tmp5 TIMES.
    tmp4 
tmp4 2.
ENDDO.
WRITE/,tmp4,',tmp5,/.


DATAtmp6 TYPE f.
ABAP中使用数学函数,注意函数中的变量与前后括号要用空格隔开
例如(2)就会报错,而)不会报错
Inside SQRT function, before and after the number
It must have space

tmp6 
SQRT).
格式化输出tmp6,这里用COL_KEY所代表的系统颜色进行格式化
WRITEtmp6 COLOR COL_KEY.

==============================================================


定义一个16进制的X类型变量temp7
DATA temp7 TYPE X.
temp7 
'F3D9'.
temp7 temp7 1.
WRITE/,temp7,/.

定义类型为p的小数,类型为f的浮点数
DATApack TYPE p,
      float 
TYPE f.
pack '-12.345'.float '75E-034'.
WRITE/,pack,',/,float.





TYPES newTypeNm(10TYPE c.
DATAchinese_name(10TYPE c,
      f_name           
TYPE newTypeNm VALUE 'cheong',
      l_name           
TYPE f_name     VALUE 'Jacky'这里可以使用变量来对变量进行格式化,格式化后的变量跟被用来格式的变量的格式相同
chinese_name 
'Zhang XueYou'.
WRITEf_namel_namechinese_name.

TYPESspfli_type TYPE spfli,
       surname
(15TYPE c   If the length is less than data, then the exceed part will be dropped
       
BEGIN OF address     用来定义一个叫做address的结构体
         name 
TYPE surname  结构体address里面包含3个变量,一个是name2个是street3个是city
         street
(30TYPE 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
TYPESBEGIN OF person    开始定义person中的变量列表
        addr 
TYPE address person中包含2个变量,一个是addr,另一个是address
        addr2 
TYPE address,
       
END OF person.
这里我们可以看到,address是之前定义的包含3个变量的结构体。
而这个person中包含2address类型的变量
这是一个结构体嵌套着结构体的类型


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(40TYPE c.
如何分行连接结构体
 long_sen 
'This is &
           
'a very long &
           
'sentence.'.
*WRITE: /,serial_no.
*WRITE: /,sentence.

WRITE/,long_sen.




CONSTANTS pi TYPE DECIMALS 10 VALUE '3.1415926'定义一个不可改变的常量
DATAtime1 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 ,'.



????暂时无法通过编译的部分,有待考察????
DATAtext(8TYPE 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.

WRITEtext'has length'len.

DESCRIBE FIELD my_person LENGTH len.
WRITE: /,my_person,'----',len.




定义2个变量,变量里面是结构体。
试图查看拷贝的情况

DATABEGIN OF add_personel,
        
title(5   VALUE 'Mr',
        name
(20),
        street
(40 TYPE   N,
        
no(3      TYPE   N,
        postcode
(6TYPE   N,
      
END OF add_personel.
DATABEGIN OF add_company,
        
position(20VALUE 'Consultant',
        name
(20VALUE 'Jack Huang',
        street
(40TYPE VALUE 'Beijing Avenue',
        
no(3TYPE VALUE '002',
        postcode
(6TYPE VALUE '100875',
      
END OF add_company.
WRITE/,add_company.
WRITE/,add_personel.
关键点,MOVE-CORRESPONDING语句将add_company
add_personel结构体中变量名相同的部分进行拷贝
例如:他们都有namestreetnopostcode

MOVE-CORRESPONDING add_company TO add_personel.
CLEAR add_company.
WRITE/,'*',add_company.
WRITE/,'*',add_personel.
不过目前street打印出来的是一段数字,具体问题是啥还有待观察


类型转换和赋值

DATAchar1(10TYPE VALUE '-X1Y2Z3.A4',
      numc
(10 TYPE N,
      timeT     
TYPE VALUE '010001',
      integer   
TYPE I.
赋值的时候可以自动进行类型转换
numc    
char1.
integer 
timeT.
WRITEchar1numctimeTInteger.



数值运算
DATATYPE f,
      
TYPE f,
      
TYPE f.
'32.0'.
'24.0'.
加法
COMPUTE y.
WRITE/,x,',y.
WRITE/,'Result',n.
减法
y.
WRITE/,'Result',n.
乘法
MULTIPLY BY y 这么做,会把x乘以y的数值直接存储到x里面
                        
此后x=x*y=32*24=768
WRITE/,'Result',DECIMALS 3.
除法
DIVIDE BY y.
y.
WRITE/,'DIVIDE',x,'/',y,'=',n.
整除
DIV y.
WRITE/,'Result',n.
取余数
MOD y.
WRITE/,'Result',n.
——次方
** 2.
WRITE/,'Result',n.
小插曲,想双击变量名来全选变量,这样就不用鼠标一个一个拖
但是双击后居然是弹出个小窗口……
【顺带】ABAP的数值表示法是:1,0240000000000000E+03
不懂为何用逗号,来表示小数点,非常容易误导





ABAP中比较有意义的运算
跟财务、供应链相关的时间、日期运算

DATAseconds TYPE i,
      hours   
TYPE i,
      time111 
TYPE VALUE '100000',
      time112 
TYPE VALUE '080000'.
seconds 
time111 time112.
hours   
seconds 3600.
WRITE'Seconds between time1 and time2:'seconds,
          
'Hours   between time1 and time2:'hours.
0 0