原文链接:ABAP's - 'Tips' and 'Traps' alongwith New syntax - SAP Community
原文作者:Ankit_Maskara
在自我成长的不断推动下,我开始尝试使用 ABAP 中的新编程语法。一路上,我学到了一些技巧和窍门,也发现了一些不足之处。 通过这篇文章,我想以我的实验为基础,介绍一下这段旅程的要点。同时,感谢 jeffrey.towell2 在此发表的精彩博客。
免责声明:如前所述,所有这些都是基于我的经验,可能会有一些不足之处,我很乐意从反馈意见和你们的经验中吸取教训。
技巧 #1 使用 sorted tables 触发隐式 BINARY SEARCH
经常在表格表达式中使用排序表,因为它会触发隐式二进制搜索,这样我们就不需要在表格表达式中指定 "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.
我将不断补充我所学到的知识。