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.

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

相关推荐
梦梦代码精7 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
两点王爷7 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
leoZ2318 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
海上彼尚9 小时前
Cursor 模型的强度实测排行
前端·人工智能·后端
GoGeekBaird10 小时前
从「跑完即销毁」到「用完再销毁」:云沙箱的一次进化
后端·github·ai编程
孫治AllenSun10 小时前
【LangChain4J-09】开发学习知识点
spring boot·后端·学习
lisin-lee-cooper11 小时前
简单聊聊 Spring 框架源码
java·后端·spring
复方金银花颗粒11 小时前
reactor和proactor的好处和坏处。为什么要用reactor而不用 proactor?
后端·信号处理
IT_陈寒12 小时前
JavaScript的这个隐式转换特性差点让我加班到凌晨
前端·人工智能·后端
用户83562907805112 小时前
使用 Python 在 Excel 中添加和编辑形状
后端·python