通过ABAP编码逻辑合并范围

2020-08-18 23:38发布

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

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


我需要将两个范围表(表a和表b)逻辑合并到第三个范围表c中。

此后,应在SELECT语句中使用此范围表c。

两个范围表都引用相同的数据元素,并且可以包含n个条目。

如果存在矛盾的条件,则应始终使用表b中的条件。

在我看来,这项任务可以通过集合论解决。

输入看起来像这样:

 range_table_a =值#((符号='I'选项='EQ'低='Z001')
                          (sign ='I'option ='EQ'low ='Z002'));

 range_table_b =值#((符号='E'选项='EQ'低='Z002'));  

在range_table_a和range_table_b进行逻辑合并之后,我希望得到此结果:

 range_table_c =值#((符号='I'选项='EQ'低='Z001')
                          (sign ='E'option ='EQ'low ='Z002'));  

有没有人在SAP标准中看到任何有关此的信息?

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

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


我需要将两个范围表(表a和表b)逻辑合并到第三个范围表c中。

此后,应在SELECT语句中使用此范围表c。

两个范围表都引用相同的数据元素,并且可以包含n个条目。

如果存在矛盾的条件,则应始终使用表b中的条件。

在我看来,这项任务可以通过集合论解决。

输入看起来像这样:

 range_table_a =值#((符号='I'选项='EQ'低='Z001')
                          (sign ='I'option ='EQ'low ='Z002'));

 range_table_b =值#((符号='E'选项='EQ'低='Z002'));  

在range_table_a和range_table_b进行逻辑合并之后,我希望得到此结果:

 range_table_c =值#((符号='I'选项='EQ'低='Z001')
                          (sign ='E'option ='EQ'low ='Z002'));  

有没有人在SAP标准中看到任何有关此的信息?

付费偷看设置
发送
12条回答
骆驼绵羊
1楼 · 2020-08-19 00:24.采纳回答

似乎我对我的问题造成了一些困惑,并尝试纠正它。

在当前用例中,我们有一个每天运行的报告,其中包含不同的预定义报告变体。

这些日期和时间每天固定,主要由范围表组成。

但是有时对于某些程序运行,有必要对变量进行临时更改。 为了避免仅在2个小时内更改生产系统中的变体并在之后将其还原,通过直接在生产中进行定制,将此短期更改作为"例外"进行了请求。 此临时异常的优先级应高于标准变体的范围表条目。

我还没有完全完成开发工作,但是大多数要求的测试用例已经在工作:

 METHOD check_combinations。
     check_combination(
          iv_test_name ='无冲突-必须使用较高和较低的prio范围'
          it_lower_prio = VALUE ttr_auart((sign ='I'option ='EQ'low ='Z001'))
          it_higher_prio = VALUE ttr_auart((符号='I'选项='EQ'低='Z002'))
          it_expected_result = VALUE range_c10_t((sign ='I'option ='EQ'low ='Z001')
                                                  (sign ='I'option ='EQ'low ='Z002')))。
     check_combination(
          iv_test_name ='冲突-必须使用更高的prio范围'
          it_lower_prio = VALUE ttr_auart((sign ='I'option ='EQ'low ='Z001'))
          it_higher_prio = VALUE ttr_auart((符号='E'选项='EQ'低='Z001'))
          it_expected_result = VALUE range_c10_t((sign ='E'option ='EQ'low ='Z001')))。

     check_combination(
          iv_test_name ='冲突-必须使用更高的prio范围'
          it_lower_prio = VALUE ttr_auart((sign ='I'option ='EQ'low ='Z001'))
          it_higher_prio = VALUE ttr_auart((sign ='E'option ='EQ'low ='Z001')
                                                (符号='I'选项='EQ'低='Z002'))
          it_expected_result = VALUE range_c10_t((sign ='E'option ='EQ'low ='Z001')
                                                  (sign ='I'option ='EQ'low ='Z002')))。
     check_combination(
          iv_test_name ='部分冲突-必须使用较高的prio范围和较低的表的一部分'
          it_lower_prio = VALUE ttr_auart((sign ='I'option ='EQ'low ='Z002')
                                                (符号='I'选项='EQ'低='Z001'))
          it_higher_prio = VALUE ttr_auart((符号='E'选项='EQ'低='Z001'))
          it_expected_result = VALUE range_c10_t((sign ='I'option ='EQ'low ='Z002')
                                                  (sign ='E'option ='EQ'low ='Z001')))。
     "支票之间
     check_combination(
          iv_test_name ='无冲突-必须使用较高prio范围和较低prio表的所有值'
          it_lower_prio = VALUE ttr_kunwe((sign ='I'option ='BT'low ='1000'high ='2000'))
          it_higher_prio = VALUE ttr_kunwe((sign ='I'option ='BT'low ='1999'high ='2005'))
          it_expected_result = VALUE range_c10_t((sign ='I'option ='BT'low ='1000'high ='2005')))。

     check_combination(
          iv_test_name ='冲突-必须使用较高的prio范围,因为它是较低的prio的对面'
          it_lower_prio = VALUE ttr_kunwe((sign ='E'option ='BT'low ='1000'high ='2000'))
          it_higher_prio = VALUE ttr_kunwe((sign ='I'option ='EQ'low ='1001')))
          it_expected_result = VALUE range_c10_t((sign ='I'option ='EQ'low ='1001')))。


   终结法。
 

我的解决方案基于标准类CL_RSMDS_DDIC_UNIVERSE。

因此,每个具有类似用例的人,只需检查Report RSMDS_DEMO即可了解如何使用此set API:

对我来说,这个问题已解决。

派大星 ヾ
2楼-- · 2020-08-19 00:14

Alexander Geppart ,请继续 关于您的公开问题。

  • 评论答案或您的问题是否还有未解决的问题。
  • 否则将答案标记为接受,如果它可以帮助您解决问题
  • 或发布您自己的答案并接受 如果您自己找到了另一个有用的解决方案
  • ,或者将您的问题重定向到另一个相关且对解决您的问题有用的问题
  • 最后,请关闭您的问题
愤怒的猪头君
3楼-- · 2020-08-19 00:26

我得说,即使在此背后可能希望有一个"良好"的业务案例,也确实听起来像是一个很奇怪的要求。

您知道吗? 符号,选项,低和高的许多组合以及每种范围表的组合都是可能的。 您将必须遍历第一个表的每个条目,并根据其四个值检查整个第二个范围表是否已明确包含,明确排除,部分包含或排除或根本不处理此表(除非对哪些内容有限制) 范围可以在两个表中找到。)

这些值的来源是什么? 因为一个人应该已经能够清楚地定义一个"表"的选择选项,所以可以进行所需的选择。

大道至简
4楼-- · 2020-08-19 00:18

感谢您的反馈。

Tong__Ming
5楼-- · 2020-08-19 00:17
< 我什么都没找到。 我通常将范围表保持原样,从不进行物理合并,除非最后一刻直接在SELECT或LOOP的WHERE中:

 ...
 在range_table_a中的WHERE字段中
   AND字段在range_table_b中
   ... 
SAP砖家
6楼-- · 2020-08-19 00:34

我很想知道您如何使用此类来合并范围。 甚至背后的逻辑。 还有什么是业务(或技术)案例。 我希望您有时间研究和发布博客文章或至少一些代码片段。

hengyuye
7楼-- · 2020-08-19 00:29

到目前为止,我已经找到了cl_rsmds_ddic_universe类。

通过报告RSMDS_DEMO检查了其可能性,并查看了提供的单元测试。

使用诸如create_set_from_ranges之类的方法进行组合,相交,然后通过to_ranges()将其转换回
,这似乎正是我所要搜索的。

接下来的几天,我将使用sap中的这个库为我的用例建立一个测试基础,然后看看它如何进行。

我将不断更新此问题。

一周热门 更多>