ABAP 的 “小技巧 ”和 “陷阱 ”以及新语法

原文链接:ABAP's - 'Tips' and 'Traps' alongwith New syntax - SAP Community

原文作者:Ankit_Maskara

在自我成长的不断推动下,我开始尝试使用 ABAP 中的新编程语法。一路上,我学到了一些技巧和窍门,也发现了一些不足之处。 通过这篇文章,我想以我的实验为基础,介绍一下这段旅程的要点。同时,感谢 jeffrey.towell2 在此发表的精彩博客

免责声明:如前所述,所有这些都是基于我的经验,可能会有一些不足之处,我很乐意从反馈意见和你们的经验中吸取教训。

经常在表格表达式中使用排序表,因为它会触发隐式二进制搜索,这样我们就不需要在表格表达式中指定 "BINARY SEARCH "子句。

ABAP 复制代码
DATA :  lt_mseg  TYPE SORTED TABLE OF mseg 
        WITH NON-UNIQUE KEY grund.

DATA : ls_mseg TYPE mseg.

" Below will trigger implicit Binary Search
ls_mseg = lt_mseg[ grund = '<Some value>' ].

技巧 #2 Value 操作符只适用于当前作用域中可访问的数据类型

Value 操作符只适用于当前作用域中可访问的数据类型。

sandra.rossi : 谢谢您纠正我的错误。

ABAP 复制代码
" Class 1 - Method 1
DATA : ls_val TYPE bwart_range.

" ts_val - Public type in Class 1
ls_val = VALUE ts_val( low = 'ABC' ).

" Class 2 - Method 1
DATA : ls_val TYPE bwart_range.

" ts_val - Public type in Class 1
ls_val = VALUE Class1=>ts_val( low = 'ABC' ).

" --------------------------------------------------------

" Class 1 - Method 1
DATA : ls_val TYPE bwart_range.

" ts_val - Private type in Class 1
ls_val = VALUE ts_val( low = 'ABC' ).

" Class 2 - Method 1
DATA : ls_val TYPE bwart_range.

" ts_val - Private type in Class 1 so gives Syntax Error
ls_val = VALUE Class1=>ts_val( low = 'ABC' ).

技巧 #3 定义排序表要仔细

下列两种语法之间有区别:

a. Data: <Itab> TYPE SORTED TABLE OF < > with <Key Attributes> <Field 1> , <Field 2 >. (这种其实就是 DATA 链式定义把逗号后面的内容解读为了字段定义)

b. Data: <Itab> TYPE SORTED TABLE OF < > with <Key Attributes> <Field 1> <Field 2 >. (一般情况下,我们使用这个)

matthew.billingham 感谢您提供了一个很好的例子。

ABAP 复制代码
DATA : lt_po_detail_sort TYPE SORTED TABLE OF ekpo 
                         WITH NON-UNIQUE KEY ebeln, ebelp.

" Same as
DATA : lt_po_detail_sort TYPE SORTED TABLE OF ekpo
                         WITH NON-UNIQUE KEY ebeln.
DATA ebelp. " Declares a single character variable

技巧 #4 使用如下的 Corresponding 语法

ABAP 复制代码
<Structure1 - Data type 1 > = CORRESPONDING <Data type 1> ( BASE  (  < Structure 2 - Data type 1 > )  < Structure 3 - Data type 2 > )

例子:

ABAP 复制代码
DATA:  ls_mara_proc  TYPE zmara,
          ls_mara       TYPE zmara,
          ls_admin_data TYPE zs_admindata.

    " Combine the custom material header 
    " fields and admin data
    " Point to note is component fields in
    " structure zs_admindata are also in zmara
    ls_mara_proc = CORRESPONDING 
                   zmara( BASE ( ls_mara )  ls_admin_data  ).

技巧 #5 在 For 循环中使用表格表达式

我们也可以在 For 循环中使用表格表达式,类似于:

xml 复制代码
<Itab 1> = Value <Table Type>( 
    FOR <Work Area> IN < Itab 2 with data>  ( 
    <field1> = <Itab 3> [ < search clause > ]-<field 1> 
    <field2> = < Work Area>-<field 2> ) 
)

例如:

ABAP 复制代码
DATA: lt_quality    TYPE ztt_quality,
          lt_quality_db TYPE ztt_quality,
          lt_mat_plant  TYPE SORTED TABLE OF zs_mat_plant 
                         WITH NON-UNIQUE KEY matnr.

" Map the selected materials and plants
lt_quality = VALUE ztt_quality(
             FOR ls_quality
             IN  lt_quality_db 
             ( matnr  = ls_quality-matnr
               werks  = lt_mat_plant[ matnr = ls_quality-matnr ]-werks ) ).

技巧 #6 灵活使用 Corresponding

我们可以使用 "Base"、"Mapping"、"Except "和 "Value"操作符。当我们需要将多个结构中的数据合并到一个结构中时,它非常方便。

请参考标准文档中的示例。

技巧 #7 使用 Assign 语句,检查 sy-subrc 的值

在使用字段符号的表格表达式中使用 ASSIGN 语句时,我们不需要检查异常 cx_sy_itab_line_not_found,而应该检查 sy-subrc 的值,该值被设置为表示读取失败。

技巧 #8 unassign field symbols 可以直接使用,clear field symbols 要先检查是否被赋值

我们可以直接取消字段符号的赋值,而无需检查它们是否已被赋值,但如果没有检查它们是否已被赋值,我们不能直接清除 clear 字段符号。

typescript 复制代码
UNASSIGN < Field symbol > " -  Works

CLEAR < Field symbol > " Does not work (dumps if field symbol is not assigned)

技巧 #9 使用 Group By

在需要应用控制中断等情况下,我们应该使用 Group By 子句。它更具可读性,易于维护,而且不会带来字段被星号标记的麻烦。

字段被星号化的麻烦。此外,它还不会导致四重循环。

ABAP 复制代码
LOOP AT ct_all_mat ASSIGNING FIELD-SYMBOL(<fs_all_mat>)
           GROUP BY ( field1 = <fs_all_mat>-field1 )
           ASCENDING ASSIGNING FIELD-SYMBOL(<fs_all_mat_grp_tab>).

      " Prepare the sequence number as a running number
      " irrespective of field1
      LOOP AT GROUP <fs_all_mat_grp_tab> 
              ASSIGNING FIELD-SYMBOL(<fs_all_mat_grp_rec>).
       " Processing for all item in a Group
      ENDLOOP.
" Processing once for each matching group.

 ENDLOOP.

我将不断补充我所学到的知识。

相关推荐
魔尔助理顾问3 小时前
一个简洁高效的Flask用户管理示例
后端·python·flask
李长渊哦6 小时前
使用Druid连接池优化Spring Boot应用中的数据库连接
数据库·spring boot·后端
web135085886356 小时前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring
nbsaas-boot7 小时前
Go 自动升级依赖版本
开发语言·后端·golang
zzyh1234568 小时前
springcloud的组件及作用
后端·spring·spring cloud
尚学教辅学习资料8 小时前
基于SpringBoot的图书借阅小程序+LW参考示例
spring boot·后端·小程序·java毕设·图书借阅
山海不说话8 小时前
从零搭建微服务项目Base(第5章——SpringBoot项目LogBack日志配置+Feign使用)
spring boot·后端·spring·spring cloud·微服务·logback
databook9 小时前
『Python底层原理』--CPython的变量实现机制
后端·python
初尘屿风9 小时前
小程序类毕业设计选题题目推荐 (29)
spring boot·后端·学习·微信·小程序·课程设计
JavaGuide10 小时前
武汉小米 Java 岗位一二面校招面经
java·后端