通过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:25

例如,如果表1列出了范围基于的field1的值列表:

从表1中选择字段1到表range_a_itab中,其中字段1 = range_a

从表1中选择field1到表range_b_itab中,其中field1 = range_b

现在使用range_a_itab和range_b_itab中的条目创建range_c

绿领巾童鞋
3楼-- · 2020-08-19 00:15

另一个选择是使用每个范围的数据元素有效值中的select。 然后将返回的值添加到具有I EQ值模式的新范围中。

ZJXianG
4楼-- · 2020-08-19 00:41

在单个值列表中进行转换:

如何在不使用单个值的情况下转换范围或模式 进行查询以知道存在哪些实际值,或者您想针对所有可能的值(基于数据类型)执行此操作? 关于数字,小数,文本和字符串值呢?

考虑到问题" Z001"和" Z002"中给定的值,我认为它们来自定制表,因此不应 可能有太多的值,因此这是非常可行的,但是这样一来,已经可以对原始请求进行限制:将范围表A与范围表B合并到范围表C中,而B对于"矛盾条件"具有优先权。

什么是"矛盾条件"?

对于给定的示例:

  • 范围A选择了Z001和Z002
  • < li>范围B选择除Z002之外的所有内容
  • 范围A和B的简单组合仅选择Z001
  • "组合"范围C与"处理矛盾条件"仅选择Z001

因此,在这里,简单地将A和B组合在一起而不检查"矛盾条件"将已经达到要求的结果,整个讨论甚至都没有必要。

A 但是,真正的矛盾将是以下,恕我直言:

  • 范围A仅选择Z002
  • 范围B选择除Z002之外的所有内容
  • 范围A和B的简单组合不选择任何内容
  • "组合"范围 带有"处理矛盾条件"的C会选择除Z002之外的所有内容

现在是预期结果吗?基于这个问题,我会说是,但我们仍然不知道业务案例。

愤怒的猪头君
5楼-- · 2020-08-19 00:37

对我来说,这是可能的。

您必须在单个值列表中转换范围(以避免LOW/HIGH值)。

您必须将表B的条目添加到表C。

您必须在表A上循环以检查该条目是否已经存在,如果没有,则将其添加

并且您必须重建BT值(如果连续使用相同的SIGN OPTION的多个值是连续的,则可以将其替换为BT)。

不太复杂

歪着头看世界
6楼-- · 2020-08-19 00:38
< p>嗨,亚历山大,

这类问题的另一种选择可能是让数据库通过使用联接并使每个集合具有两个集合的交集 范围表的相应位置相应地反映在WHERE子句的左侧/右侧。

致谢

Ryan Crosby

一周热门 更多>