ABAP关键字详解(超级全面)


前言

      ABAP这门语言对于我们从其他语言转行或者新人来说我个人认为还是比较难的因为它不同于我们其他语言,你像C#和JAVA的语法非常相似甚至有些关键字都一样还有现在比较火的go语言,C和C++也是比较相似的,还有Python这门语言它的语法是非常简单简洁的,以上这些语言我认为语法以及关键字以及对数据的操作都是非常相似互通的,但是ABAP这门语言由于最初是借鉴了COBOL语言的而这门语言又比较古老导致现在的ABAP还留有它的身影,语法关键字对数据的操作和我们现在常见的语言还是又很大差别的,所以今天这边文章来给大家介绍一下ABAP中的一些关键字详解,笔者也是边学习边写文章有不好或者说错的地方还望大家多多见谅。感谢!


一、什么是ABAP?

           ABAP可以说是和SAP紧密结合,甚至可以说SAP = ABAP,我们SAP系统就是由ABAP开发的,没有ABAP也就没有我们现在强大的SAP系统,ABAP有四种常见的用处,第一个就是可以开发报表,ABAP本来也是德语AllgemeinerBerichtsaufbereitungsprozessor的缩写,意思是“通用报表预处理器”。可以看出来我们ABAP开发报表的历史也是很久远了,从刚开始的画竖线横线制作报表,到FUN ALV 再到现在比较高级的OO ALV,还有就是可以做增强,就是对我们的SAP系统标准程序来做卡控以及功能的延展,还可以运用在smartforms智能表单中来通过取数调用函数传参实现打印程序,还有就是几种常见的接口开发,例如RFC、WebService 等等。


二、ABAP的关键字语法详解

      
以下内容每一个关键字和语法我都会在小标题写入尽量多的搜索词方便大家 Ctrl+F 快速定位到想看的位置

    1.声明变量TYPE与LIKE的区别

            a.简单点来说,TYPE参照的必须是一个类型,LIKE参照的必须是一个对象。
                
            b.TYPE 是用来引用一个标准的ABAP类型(如i,c,d,p,n等)或者数据字典中的数据元素、域、结构、表类型等。TYPE 声明的变量是原始类型的一个复制品,如果原始类型是在数据字典中定义的,它的语义属性会被保留。
                
            c.LIKE 是用来引用一个已经在程序中声明的变量或常量,或者一个全局类的公共属性。LIKE 声明的变量是原始对象的一个别名,它继承了原始对象的所有属性,包括数据类型和值。这里的值指的是 LIKE 声明时指定的值,而不是原始对象的当前值。简单点说就是只会继承数据类型不会继承值。
                
            d.TYPE 后面一般用三种类型
                  1, dataelement = 数据元素 (一个的)2, structure = 结构(一行的) 3, table type = 表类型(多行的)

                                                                                       示例代码

DATA: v1 TYPE i VALUE 10,  "参考ABAP预定义i类型声明一个v1的变量
      v2 LIKE v1 VALUE 20. ”参考变量v1声明一个v2的变量,这里如果不指定value 20 默认值为0

WRITE: / v1, v2. "输出 10 20

v1 = 40.
WRITE: / v1, v2. "输出 40 20

v2 = 50.
WRITE: / v1, v2. "输出 40 50

    2.CONSTANTS 和 DATA声明数据的区别

            a.CONSTANTS声明出来的数据是常量,DATA声明出来的数据是变量。

            b.CONSTANTS常量的数值一旦确定是不能修改的而且必须是最初定义的时候就用VALUE关键字赋值好了,DATA变量的数值一旦确定在程序运行过程中是可以反复修改的而且最初可以用VALUE关键字赋值也可以在程序运行过程中赋值。

            c.CONSTANTS常量一定是全局变量,DATA变量可以声明为全局变量也可以声明为局部变量。

CONSTANTS: lc_constant TYPE I VALUE 10. " 定义常量

DATA: gv_variable TYPE I. " 定义变量
gv_variable = 20. " 给变量赋值

    3.声明内表的几种方式、设置内表初始化大小、

            
            a.声明内表常见的有参考 结构类型 或者参照 结构 ,这里很明显结构类型是一个类型,而结构是一个已存在的数据对象。所以这里的语法就要有所不同。参考结构类型使用 TYPE TABLE OF 参考结构体就是用LIKE TABLE OF,什么时候用TYPE 什么时候用LIKE上面也介绍过了。但其实这里 TYPE TABLE OF可以参考结构类型也可以参考一个结构。是因为 TYPE 可以引用一个数据对象作为数据类型,这种情况下,TYPE 的作用和 LIKE 一样,都是复制数据对象的类型

                                                                                       示例代码

TYPES: BEGIN OF t_struct,"声明一个结构类型
         col1 TYPE i,
         col2 TYPE i,
       END OF t_struct.

DATA: itab1 TYPE TABLE OF t_struct."参照结构类型声明一个内表


DATA: struc TYPE t_struct.      "参照结构类型声明一个结构
DATA: itab2 LIKE TABLE OF struc."用LIKE参照结构类声明一个内表(注意上方黄色标注)
DATA: itab3 TYPE TABLE OF struc."用TYPE参照结构类声明一个内表(注意上方黄色标注)

DATA: itab4 LIKE TABLE OF t_struct."这行会报错因为t_struct是一个类型,LIKE必须参照对象

DATA itab5 TYPE resb."参照数据库透明表可以不用写TABLE OF 因为参照的类型本身就是表 

                 
            b.
                 
            c.内表带表头行与不带表头行的区别
                 
            d.
                 
            e.
                 
            f.创建deep 纵深 结构内表
                 
创建的数据结构是一个结构包着一个内表

  TYPES:
        BEGIN OF ty_tabledata, "包着的内表的结构类型
            data1  TYPE  char10,
            data2   TYPE  char10,
        END OF ty_tabledata.

DATA lt_tabledata TYPE TABLE OF ty_tabledata. "根据上面的结构类型创建一个内表

TYPES:
        BEGIN OF ty_result,   "最终的数据结构 data字段就是上面创建的内表
            proc_num  TYPE  int,
            status    TYPE char1,
            data      like  lt_tabledata,
        END OF ty_result.

  DATA  tt_result   TYPE ty_result. "这是最终的数据效果 是一个结构包含着一个内表

  tt_result-proc_num = '88'.
  tt_result-status = 'E'.
  
  DATA  data   like  lt_tabledata WITH HEADER LINE.
  data-data1 = '我是data1'."先给data内表赋值 再把data内表添加到结构中的第三个字段data当中去
  data-data2 = '我是data2'.
  APPEND data to tt_result-data.

  data-data1 = '我是data2-1'.
  data-data2 = '我是data2-2'.
  APPEND data to tt_result-data.

"这是最终的json
json = '{"PROC_NUM":"88","STATUS":"E","DATA":[{"DATA1":"我是data1","DATA2":"我是data2"},{"DATA1":"我是data2-1","DATA2":"我是data2-2"}]}'.

    4.结构声明、

            a.
                
            b.
                
            c.

    5.内表操作,添加 插入 删除 清空 修改 读取 排序 获取行数

            a.
                
            b.
                
            c.获取内表行数

DESCRIBE TABLE gt_data LINES lv_lines.
* 描述 gt_data 这个内表的 行数 赋值给 lv_lines.

    6.REPORT 后缀

            a. 去掉程序标题、去掉左上角标题 NO STANDARD PAGE HEADING
去掉程序标题
                
            b.限制打印的长度 LINE-SIZE
在这里插入图片描述

                
            c.打印分页 LINE-COUNT
在这里插入图片描述

    7.检查一个内表中是否存在指定的行 LINE_EXISTS()

            a.代码示例

* LT_RETURN 是一个有TYPE字段的内表

IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ) OR LINE_EXISTS( LT_RETURN[ TYPE = 'A' ] ).

* 这种语法是用来在ABAP中检查一个内表中是否存在指定的行

                
            b.LINE_EXISTS()函数详解
                  LINE_EXISTS是一个谓词函数,它接受一个表达式作为参数,并返回一个布尔值。
                
            c.代码详解
                  这种语法的意思是,检查LT_RETURN内表中是否存在TYPE字段等于’E’或者’A’的行,并返回相应的真或假。如果存在这样的行,那么结果为真;如果不存在这样的行,那么结果为假。这种语法可以方便地在条件判断中使用,而不需要使用其他函数或者操作符。

    8.拼接字符串

            a.示例1 (最实用的方法)

DATA(MSG) = |{ LINES( LT_ROWS ) } records processed|.

* LT_ROWS是一个内表  records processed是死值字符串
* LINES() 是一个函数,用来返回一个内表的行数。
* { } 是一个表达式分隔符,用来表示在字符串中插入一个表达式的值。
* || 是一个字符串分隔符,用来表示字符串的开始和结束。

假设内表中有10行数据那么MSG的值就为: 10 records processed
扩展用法:
在字符串中插入其他变量的值:DATA(MSG) = |The name is { name }|. 这样就可以把name变量的值放在字符串中。
假设name变量值为小贱贱那么MSG的值就为: The name is 小贱贱
在字符串中插入转义字符:DATA(MSG) = |This is a new line\n|. 这样就可以在字符串中换行。

在字符串中插入格式化字符:DATA(MSG) = |The number is { number TYPE p DECIMALS 2 }|. 这样就可以在字符串中显示带有小数点的数字。
假设number变量值为123.456那么MSG的值就为: The number is 123.46
在字符串中插入表达式的结果:DATA(MSG) = |The sum is { x + y }|. 这样就可以在字符串中显示两个数的和。

                
            b.示例2 (最简单的方法)

str = str1 && str2

                
            c.示例3

* 使用CONCATENATE函数
CONCATENATE str1 str2 INTO str "就是将str1和str2拼接成str
CONCATENATE str1 str2 INTO str SEPARATED BY ' ' "就是在str1和str2之间加上一个空格。 也可以加其他字符

    9.清空内表

            a.
            REFRESH ITABCLEAR ITAB[ ] 这两种清空内表的方式有什么不同

REFRESH ITAB 会删除内表 ITAB 的所有行,并释放除初始内存需求外的所有内存空间
CLEAR ITAB[] 也会删除内表 ITAB 的所有行,但不会释放内存空间

通常,CLEAR 用于清空变量和工作区,REFRESH 和 FREE 用于内表

                
            b.REFRESH ITABFREE ITAB 那这两个又有什么区别?

REFRESH ITAB 会删除内表 ITAB 的所有行,并释放除初始内存需求外的所有内存空间  。
FREE ITAB 会删除内表 ITAB 的所有行,并释放所有占用的内存空间,包括初始内存需求  。
 一般来说,FREE 应该只在不再需要内表或者不会立即重新填充内表的情况下使用,以便节省内存 。

    10.删除字符串中的空格

            a.使用 CONDENSE 可以删除前导尾随空格,将连续空格变为一个空格

DATA:testval TYPE char50 VALUE '  你         好'.

CONDENSE testval.
WRITE testval.

运行效果

                
            b.CONDENSE 后缀 NO-GAPS 可选项 加上之后可以删除所有空格

DATA:testval TYPE char50 VALUE '  你         好'.

CONDENSE testval NO-GAPS.
WRITE testval.

在这里插入图片描述

                
            c.

    11.判断一个字符串是否包含另一个字符串中的字符

            a.CO 是abap中的一个比较运算符

DATA: text1 TYPE c  VALUE 'ABCDEF+',
      text2 TYPE c  VALUE 'ABCD'.
IF text1 CO text2.
  WRITE: 'text2包含text1'.
ELSE.
  WRITE: 'text2不包含text1'.
ENDIF.

运行效果

                
            b.每一个字符串都是含有空的,所以text1为空的话 它也被text2包含

DATA: text1 TYPE c  VALUE '',
      text2 TYPE c  VALUE 'ABCD'.
IF text1 CO text2.
  WRITE: 'text2包含text1'.
ELSE.
  WRITE: 'text2不包含text1'.
ENDIF.

运行效果
                
            c.这样也算包含

DATA: text1 TYPE c  VALUE 'AB',
      text2 TYPE c  VALUE 'ABCD'.
IF text1 CO text2.
  WRITE: 'text2包含text1'.
ELSE.
  WRITE: 'text2不包含text1'.
ENDIF.

运行效果

    12.split 按指定字符分割字符串

            a.split 用于将一个字符串按照某个分隔符拆分成多个子字符串,可以存储到单独的目标字段或者内表中。

DATA: lv_str TYPE string VALUE 'steel_rods'.
DATA: lv_res1 TYPE string,
      lv_res2 TYPE string.
SPLIT lv_str AT '_' INTO lv_res1 lv_res2.
* 如果分隔符位于字符串的首或尾,那么拆分后的结果可能会包含一个空字符串。
WRITE: lv_res1,lv_res2.

在这里插入图片描述

                
            b.分割字符串存入内表

DATA:lv_string TYPE string.
DATA :BEGIN OF ls_string,"声明一个结构只有一个字段col1
        col1 TYPE char50,
      END OF ls_string.

DATA:lt_string LIKE STANDARD TABLE OF ls_string."参照上面的结构声明一个STANDARD(标准)内表
*不加STANDARD就声明的是通用表,通用表的类型可以是标准表,也可以是排序表或者哈希表,具体取决于赋值给它的数据对象的类型。
lv_string = '1,2,3,4'.
SPLIT lv_string AT ',' INTO TABLE lt_string."将字符串分割存入内表中

LOOP AT lt_string INTO ls_string.
  WRITE:/ ls_string-col1.
ENDLOOP.

在这里插入图片描述

                
            c.

    n.预留位置后续接着补充

            a.
                
            b.
                
            c.


三、总结

        以上内容介绍了ABAP的一些关键字和语法详解本文,主要目的是帮助初学者以及初级ABAP作为资料参考查找,笔者也是接触ABAP不久,如果有说错漏掉或者不好的地方还望大家提出来见谅。感觉笔者写的好的别忘了关注点赞加评论哦,也欢迎大家一起来讨论。谢谢!

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao贱贱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值