用键循环遍历动态哈希表

2020-08-17 12:44发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我正在研究实现IF_RSPLFA_SRVTYPE_IMP_EXEC_REF(参考数据计划)的自定义计划功能类型。

实现类的EXECUTE方法具有I_TH_REF_DATA TYPE HASHED TABLE作为"导入"参数。 该表实际上包括我的参考数据。 该表的结构是在运行时根据聚合级别的结构动态定义的。 它包含构成聚合级别的所有特征和关键数据。

为避免对表进行全面扫描,我想使用某种"部分"键(仅包含有限的一组特征)遍历该表。 产品协助建议如下:

 DATA spfli_tab类型哈希表
 OF SPFLI
 使用唯一键primary_key
 成分carrid connid
 使用非唯一排序键city_from_to
 组件城市从城市到
 使用非唯一排序键city_to_from
 组件从城市到城市。

 循环至spfli_tab分配使用密钥city_from_to。

但是。 不适用于我的任务,因为表I_TH_REF_DATA是在计划引擎内部定义的,我无法控制其结构(包括键)。

我事先知道聚合级别的结构,并且想使用一个包含0FISCPER,0CURRENCY,ZSCOPE和ZVERSION特性的键进行循环。 我需要类似的东西

在I_TH_REF_DATA分配处循环使用关键组件'0FISCPER''0CURRENCY''ZSCOPE''ZVERSION'

但是,似乎ABAP语法没有为此提供

请告知,如何遍历动态哈希表以避免全表扫描?

谢谢

Val

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我正在研究实现IF_RSPLFA_SRVTYPE_IMP_EXEC_REF(参考数据计划)的自定义计划功能类型。

实现类的EXECUTE方法具有I_TH_REF_DATA TYPE HASHED TABLE作为"导入"参数。 该表实际上包括我的参考数据。 该表的结构是在运行时根据聚合级别的结构动态定义的。 它包含构成聚合级别的所有特征和关键数据。

为避免对表进行全面扫描,我想使用某种"部分"键(仅包含有限的一组特征)遍历该表。 产品协助建议如下:

 DATA spfli_tab类型哈希表
 OF SPFLI
 使用唯一键primary_key
 成分carrid connid
 使用非唯一排序键city_from_to
 组件城市从城市到
 使用非唯一排序键city_to_from
 组件从城市到城市。

 循环至spfli_tab分配使用密钥city_from_to。

但是。 不适用于我的任务,因为表I_TH_REF_DATA是在计划引擎内部定义的,我无法控制其结构(包括键)。

我事先知道聚合级别的结构,并且想使用一个包含0FISCPER,0CURRENCY,ZSCOPE和ZVERSION特性的键进行循环。 我需要类似的东西

在I_TH_REF_DATA分配处循环使用关键组件'0FISCPER''0CURRENCY''ZSCOPE''ZVERSION'

但是,似乎ABAP语法没有为此提供

请告知,如何遍历动态哈希表以避免全表扫描?

谢谢

Val

付费偷看设置
发送
8条回答
N-Moskvin
1楼-- · 2020-08-17 13:23

1)使用动态键名按键排序顺序访问表

那么您不能在编程时定义键,但可以在运行时定义它吗? 您要使用表的排序键根据键的排序顺序在记录中循环吗?

"根据基于聚合级别的定义动态地设置您的键名
 数据键名TYPE c长度30。
 案例//IF。
   " ...
   键名='MY_DYN_KEY_NAME'。
   " ...
 ENDCASE//ENDIF。

 环回I_TH_REF_DATA ASSIGNING 使用键(键名)。  "(限制)。
   " ...
 ENDLOOP。

2)动态地从表中获取键名和键属性

我现在不清楚的是,您是否已经在运行时知道该键还是仅知道键组件? 但是,如果您不知道键或键组件,则可以使用GET_KEYS方法在运行时使用类CL_ABAP_TABLEDESCR读取键和组件来获取它们。

数据:lo_tabledescr类型引用到cl_abap_tabledescr,
       lt_keys类型abap_table_keydescr_tab。
 字段符号:与lt_keys相似,
                     类型abap_table_keycompdescr。

 通过数据获取表的键和键组成
 lo_tabledescr?= cl_abap_tabledescr => describe_by_data(I_TH_REF_DATA)。

 lt_keys = lo_tabledescr-> get_keys()。
 在lt_keys ASSIGNING 处循环播放,其中access_kind ='S'"排序模式
                                          AND key_kind ='K'。  "与关键组件
    ",根据以下决定检查是否要使用键 -name:
    " -is_primary'X'是//''否
    " -access_kind'H'散列//'S'排序
    " -is_unique'X'是//''否
    " -key_kind'T'行类型//'K'键组件
    " ...

    循环-组件分配。
    "检查是否要使用关键组件 -name
    " ...

    结局。
 ENDLOOP。
太Q了
2楼-- · 2020-08-17 13:33

嗨,Mateusz,谢谢您的输入。

让我进入更多细节以使情况更加清楚。

任何实现IF_RSPLFA_SRVTYPE_IMP_EXEC_REF接口的ABAP类都实现EXECUTE方法,该方法通常包含以下内容:

数据:l_th_ref_data类型REF TO数据。
 FIELD-SYMBOLS:类型哈希表,
                键入任何。

 创建数据l_th_ref_data类似于i_th_ref_data。
 ASSIGN l_th_ref_data-> *至。

 循环到分配的i_th_ref_data。
 "这里有些逻辑
 将收集到中。
 结束循环。

我了解我无法在I_TH_REF_DATA上定义任何新密钥。 因此,我需要将数据复制到另一个内部表,并根据需要为此新表定义键。 可以用作此"新表"的示例。 但是,我无法在此表上定义任何内容,因为" CREATE DATA LIKE"构造仅创建源表(I_TH_REF_DATA)的"副本"。 而且,我只能使用字段符号来操纵该表。 尝试在代码中使用l_th_ref_data会导致错误" l_th_ref_data不是内部表"。

因此,使用RTTI创建新表并相应地定义其结构(包括键)似乎是不可避免的。 这样迈克尔的建议看起来很合理。 大概在我看来。

最诚挚的问候,

Val

jovirus
3楼-- · 2020-08-17 13:40

如果要在表上创建索引,但由于此输入表是通用类型的,并且您知道要定义的组件名称,则不能 键(您确定这些组件将永远存在),并且您知道该表是标准表或排序表,因此建议您静态定义一个临时内部表,其中一个组件是与表中行对应的表索引 输入表,从输入表对其进行初始化,然后使用此临时表的顺序来访问输入表的行。

示例:

 TYPES:BTYIN ty_temp_table,
           0 FISCPER TYPE ...
           0货币类型...
           ZSCOPE类型...
           ZVERSION TYPE ...
           TABIX TYPE sytabix,
         结束ty_temp_table,
         tt_temp_table ty_temp_table的类型排序表
              使用非唯一键0FISCPER,0CURRENCY,ZSCOPE,ZVERSION。

 temp_table = VALUE#(
     FOR  IN 索引INTO i_th_line_tabix
     (值#(基本对应#()tabix = i_th_line_tabix))。

 将temp_table引用到数据中(temp_line)
       0FISCPER = ...
         AND 0货币= ...
         AND ZSCOPE = ...
         AND ZVERSION = ...
    =  [temp_line-> tabix]。
   ... 
打个大熊猫
4楼-- · 2020-08-17 13:45

谢谢你,桑德拉,我记下来。 这绝对适合scanario:

 LOOP AT unique_combinations参考到DATA(组合)。
   将temp_table引用到数据中(temp_line)
       0FISCPER =组合-> 0fiscper
         AND 0CURRENCY =组合-> 0currency 

最诚挚的问候,

Val

SKY徐
5楼-- · 2020-08-17 13:37

嗨,Val,

参数I_TH_REF_DATA是按值传递的,因此只需进行动态排序(是的,可以对哈希表进行排序),然后执行 通常的组更改逻辑。 因此,在I_TH_REF_DATA的循环中,您只需填充一个本地表,并在任何新的组合中都可以使用从先前组合中收集的记录来调用您的方法。 您不需要此处的唯一组合表。

这也无需排序即可使用,但是您必须先收集一组中包含的记录,例如 在唯一组合表的非关键部分。 这样做的缺点是您必须复制记录(或使用引用)。

我不明白您为什么担心全表扫描,无论如何您解释的逻辑都需要全表扫描 。

我认为第一种选择既简单又有效。 观察到SORT ...是ABAP内核中的一条语句,因此它很快。

问候

Gregor

打一壶酱油
6楼-- · 2020-08-17 13:49

Hi Gregor,

谢谢您的建议。 我一定会尝试,看看它如何影响性能。

最诚挚的问候,

Val

一周热门 更多>