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.

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

相关推荐
2401_857636391 小时前
洗衣店订单管理:Spring Boot技术革新
java·spring boot·后端
何中应1 小时前
Maven的生命周期与依赖作用域介绍
java·后端·maven
guangcheng0312q1 小时前
C++与Rust那些事之跳过析构函数
开发语言·c++·后端·rust
Pandaconda2 小时前
【计算机网络 - 基础问题】每日 3 题(三十四)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
碳苯2 小时前
【rCore OS 开源操作系统】Rust 异常处理
开发语言·人工智能·后端·rust·操作系统·os
艾伦~耶格尔3 小时前
Maven 高级之分模块设计与继承、聚合
java·后端·学习·maven·项目管理
钟陵逍遥子3 小时前
Go下载安装教程
后端·go
The博宇3 小时前
Scala面试题大全~基础题(15题)
开发语言·后端·scala
paopaokaka_luck4 小时前
基于SpringBoot+Vue的非物质文化遗产保护与传播系统设计实现【原创】(地图组件)
java·vue.js·spring boot·后端·毕业设计