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.

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

相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp3 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国5 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy5 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9656 小时前
pip install 已经不再安全
后端
寻月隐君6 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github