程序员干货程序员

ABAP基础-语法

2018-10-16  本文已影响24人  常威爆打来福

1 数据定义

1一般性类型

形参类型 兼容性检查规则
无类型 或 TYPE ANY 接受任意类型实参
TYPE C, N, P, X 检查实参类型是否是C, N, P, X中的任意一种
TYPE TABLE 检查实参是否为标准表,等价TYPE STANDARD TABLE
TYPE ANY TABLE 检查实参是否为内表
TYPE INDEX TABLE 检查实参是否为索引表
TYPE STANDARD TABLE 检查实参是否为标准表
TYPE SORTED TABLE 检查实参是否为排序表

2 内置基本数据类型

数据类型 默认大小 有效大小 初始值 说明 示例
C 1 1-65535 SPACE 文本字符(串) 'Name'
N 1 1-65535 '00..0' 数字文本 '0123'
T 6 6 '000000' 事件(HHMMSS) '123010'
D 8 8 '00000000' 日期(YYYYMMSS) '20080808'
I 4 4 0 整型(整数) 99
F 8 8 0 浮点型 5E+04
P 8 1 - 16 0 压缩型 12.91
X 1 1-65535X '0' 十六进制 '3A'
String 1 无限定 SPACE 字符串(长度可变) 'A String'
XString 1 无限定 SPACE 十六进制字符串 'A3FF'

3 程序内部数据定义

参照自程序中已经声明的数据对象生成新数据语法格式。如果参照自定义类型类型仍然使用TYPE,如果参数程序中已经存在的数据对象生成新数据,则需使用LIKE。

上述语句中的1_type和dobj 分别代表程序内部类型和数据对象

REPORT z_calling_program.

TYPES t_name(10) TYPE c.
DATA:chinese_name(20) TYPE c,
     f_name           TYPE t_name VALUE 'Cheong',
     l_name           TYPE f_name VALUE 'Jack'.

chinese_name = 'Zhang Xue'.
WRITE: f_name, l_name, chinese_name.
TYPES|DATA BEGIN OF structure.
                 k1 [TYPE type  | LIKE dobj ]   ...,
                 k2 [TYPE type  | LIKE dobj ]   ...,
                 ...
                 kn [TYPE type  | LIKE dobj ]   ...,
            END OF structure.
REPORT z_calling_program.

TYPES : spfli_type  TYPE spfli,
        surname(20) TYPE c,
        BEGIN OF address,
          name       TYPE surname,
          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 Nanyang Ave'.
my_add-city = 'Singapore'.

WRITE / my_add.
创建结构体
如果在同一个程序中已经定义了结构体类型或者对象,或者数据字典中定义了结构,则可以使用TYPES和DATA语句的一般形式直接参照该结构生成新的结构体
TYPES|DATA structure TYPE str_type | LIKE str_dobj...
特别指出的时还可以参照数据字典中定义的数据库表结构声明结构体
TYPES|DATA structure TYPE dbtab.

4 程序中的数据对象

DESCRIBE FIELD dobj 
  [TYPE typ [COMPONENTS com]] 
  [LENGTH ilen IN {BYTE|CHARACTER} MODE] 
  [DECIMALS dec] 
  [OUTPUT-LENGTH olen] 
  [HELP-ID hlp] 
  [EDIT MASK mask]. 

其中:

REPORT z_describe_attribute.
DATA: text(8) TYPE c VALUE 'abcdefg'.

DESCRIBE FIELD text LENGTH DATA(len) IN CHARACTER MODE.
WRITE : text , 'has length', len.
确定运行时数据对象属性

2 基本数据操作

1 数据赋值

MOVE source TO destination.
destination = source.

这两种形式是完全等价的。

REPORT z_data_manipulation.

DATA: source(7)      TYPE c VALUE 'Stephen',
      destination(7) TYPE c VALUE 'Yang'.

MOVE source TO destination.
WRITE: source , destination.
source  = 'Yang'.
destination = source.
WRITE: source , destination.
MOVE语句
TYPES: BEGIN OF structure,
...
       END OF structure.
DATA: struct1 TYPE structure,
      struct2 TYPE structure.
...
struct2 = struct1.

两个结构相同的结构体数据进行赋值操作,把原对象所有组件的值整体拷贝到目标结构体;如果两个结构体组件结构并不完全相同,只有部分组件由对应关系,此时若整体赋值,则没有意义;可以逐个组件进行赋值,也可以使用MOVE-CORRESPONDING语句在两个结构体中的所有同名组件间赋值,而木匾结构体中其他字段值不变。语法格式与MOVE语句相似:
MOVE-CORRESPONDING source_struct TO destination_struct.

REPORT z_data_manipulation.
DATA: BEGIN OF add_personel,
        title(5)    VALUE 'Mr',
        name(20),
        street(20),
        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(20)   TYPE c VALUE 'Beijing Avenue',
        no(3)        TYPE n VALUE '002',
        postcode(6)  TYPE n VALUE '100875',
      END OF add_company.
MOVE-CORRESPONDING add_company TO add_personel.

WRITE add_personel.
MOCE-CORRESPONDING操作

2 类型转换

REPORT z_data_manipulation.
DATA: char(10) TYPE c VALUE '-X1Y2Z3.A4',
      numc(10) TYPE n,
      time     TYPE t VALUE '010001',
      int      TYPE i.

numc = char. int = time.
WRITE : / char , / numc , / time , / int.
基本类型对象转换

3 数值运算

运算 数学表达式 关键字语句
加法 n = x + y. ADD y to x
减法 n = x - y. SUBTRACT y FROM x
乘法 n = x * y. MULTIPLY x BY y
除法 n = x / y. DIVIDE x BY y
整除 n = x DIV y.
取余 n = x MOD y.
幂(乘方) n = x ** y.

说明:
1.如果将几种数学表达式组合在一起,优先级依次为括号内的运算,函数,乘方,算术乘除,最后是加减运算。对于同优先级的运算符从左到右依此进行,而乘方运算例外,是从右到左进行。
2.使用数学表达式时,运算符+,-,,/,*,以及括号都是ABAP关键字,前后均必须有空格。

函数名 说明
ABS 返回输入参数的绝对值
SIGN 返回输入参数符号:正数返回1,0返回0,负数返回-1
TRUNC 返回输入参数的整数部分
FRAC 返回输入参数的小数部分
CEIL 返回不小于输入参数的最小整数值
FLOOR 返回不大于输入参数的最小整数值
REPORT z_data_manipulation.
DATA: result(20) TYPE c,
      float      TYPE f VALUE '2.5E00'.

result = trunc( float ).
WRITE result.
数学函数

2 F类型参数的函数列表

函数名 说明
COS, SIN, TAN 三角函数
ACOS, ASIN, ATAN 反三角函数
COSH, SINH, TANH 双曲函数
EXP 底数为e的幂函数
LOG 底数为e的自然对数
LOG10 底数为10的对数
SQRT 平方根
REPORT z_data_manipulation.
DATA: seconds TYPE i,
      hours   TYPE i,
      time1   TYPE t VALUE '100000', "10:00:00 AM"
      time2   TYPE t VALUE '080000'. "08:00:00 AM"
seconds = time1 - time2.
hours = seconds / 3600.
WRITE : / 'Seconds between time1 and time2:', seconds,
/ 'Hours between time1 and time2:', hours.
时间运算

4 数据输出

数据类型 输出长度 对齐方式
C 字段长(定义长度) 左对齐
N 字段长 左对齐
T 6 左对齐
D 8 左对齐
X 2 * 字段长 左对齐
F 22 右对齐
I 11 右对齐
P 2 * 字段长(+1个小数位) 右对齐
选项 应用类型 说明
LIFT-JUSTIFIED 所有类型 输出左对齐,调整字段对齐方式
GENTERED 所有类型 输出剧中,调整字段对齐方式
RIGHT-JUSTIFIED 所有类型 输出右对齐,调整字段对齐方式
UNDER g 所有类型 输出直接开始于字段g
NO-GAP 所有类型 忽略输出时字段后的一位空格
USING EDIT MASK m 所有类型 指定数据字典中定义的格式模板
USING NO EDIT MASK 所有类型 撤销对格式模板的激活
NO-ZERO 所有类型 用空格替换字段中的0,C和N类型,还将替代前导0
NO-SING 数值类型 不输出前导符号
DECIMALS d 数值类型 输出d定义小数点后的数字位数,如需截断,则四舍五入
EXPONENT e 数值类型 对F类型字段在e>定义幂指数
ROUND r 数值类型 用10的负r次方乘p类型字段,然后取整
CURRENCY c 数值类型 按系统表格TCURX中定义的格式将货币c格式化
DD/MM/YY or MM/DD/YY 时间日期类型 格式调整,'/'为用户主记录中定义的分隔符
DD/MM/YYYY or MM/DD/YYYY 时间日期类型 格式调整,'/'为用户主记录中定义的分隔符
DDMMYY or MMDDYY or YYMMDD 时间日期类型 格式调整,无分隔符
REPORT z_data_manipulation.
DATA : g(5) TYPE c VALUE 'Hello',
       f(5) TYPE c VALUE 'ABAP'.
WRITE : g , f.
WRITE: /11 g,
/ f UNDER g,
/ f UNDER g RIGHT-JUSTIFIED.
WRITE: / g NO-GAP, f.
数据格式化

5 逻辑表达式

运算符 意义
EQ或= 等于
NE或<>或>< 不等于
LT或< 小于
LE或<= 小于等于
GT或> 大于
GE或>= 大于等于

3 结构控制

1.分支控制

IF <condition1>.
   <statement block>
ELSEIF <condition2>.
   <statement block>
ELSEIF <condition3>.
   <statement block>
...
ELSE.
   <statement block>
ENDIF.
REPORT z_data_manipulation.
IF sy-uzeit < 120000.
  WRITE / 'Good Morning!'.
  IF sy-uzeit < 060000.
    WRITE / 'You are very early.'.
  ENDIF.

ELSEIF sy-uzeit < 180000.
  WRITE / 'Good Afternoon'.
ELSE.
  WRITE / 'Good Evening'.
ENDIF.
IF/ENDIF
CASE f.
  WHEN f11 [OR f12 OR ...].
      <statement block>
  WHEN f21 [OR f22 OR ...].
      <statement block>
  WHEN ...
...
WHEN OTHERS.
    <statement block>
ENDCASE.
REPORT z_data_manipulation.
CASE sy-datum+4(2).
  WHEN '12' OR '01' OR '02'.
    WRITE / 'The season now is winter'.
  WHEN '03' OR '04' OR '05'.
    WRITE / 'The season now is Spring'.
  WHEN '06' OR '07' OR '08'.
    WRITE / 'The season now is Summer'.
  WHEN '09' OR '10' OR '11'.
    WRITE / sy-datum.
    WRITE / sy-datum+5.
    WRITE / sy-datum+3(2).
    WRITE / 'The season now is Autumn'.
  WHEN OTHERS.
    WRITE 'This is illegal data'.
ENDCASE.
CASE

2.循环控制

DO [n TIMES].
   <statement block>
ENDDO.

n用于控制循环次数,他可以是文字或变量。如果是0或负数,系统不进入死循环;如果没有限定n值,则必须用EXIT, STOP或REJECT等语句强制结束循环,否则将进入死循环。在循环过程中,系统字段SY-INDEX中包含已处理过的循环数值。DO循环可以嵌套,SY-INDEX则一直为当前循环次数索引。

REPORT z_data_manipulation.
DATA: outer_index TYPE i,
      inner_index TYPE i.

DO 2 TIMES.
  outer_index = sy-index.
  WRITE sy-index.
  SKIP.
  DO 3 TIMES.
    inner_index = sy-index.
    WRITE: outer_index NO-GAP ,'-' NO-GAP,
    inner_index LEFT-JUSTIFIED.
  ENDDO.
  SKIP.
ENDDO.
无条件循环
WHILE <condition>
     <statement block>
ENDWHILE
REPORT z_data_manipulation.
DATA: len        TYPE i,
      string(30) TYPE c VALUE  'Beijing 2008'.
WHILE string NE space.
  len = sy-index.
  SHIFT string.
  WRITE: /  len.
  WRITE: /  string.
ENDWHILE.
WRITE: / 'Length of string:', len.
无条件循环
REPORT z_data_manipulation.
DO 4 TIMES.
  IF sy-index = 2 . CONTINUE. ENDIF.
  WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
  CHECK sy-index BETWEEN 2 AND 3.
  WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
  IF sy-index = 3.EXIT . ENDIF.
  WRITE sy-index.
ENDDO.
SKIP.
循环的终止
上一篇下一篇

猜你喜欢

热点阅读