范围内的最大数据

2020-08-23 04:58发布

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

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


你好

我有一系列数据,我想知道其中包含的最大数据是什么。

我为我的英语致歉,我尝试使用一些示例来更好地解释

数据:lt_datum数据的TYPE RANGE。

_______

示例1

标志选项低高
   I GT 20.02.2020
 

在这种情况下很简单:最大值为31.12.9999

_______

示例2

标志选项低高
   我BT 20.02.2020 31.12.2020
   情商30.09.2020
   我BT 01.01.2019 31.12.2019
   I LE 01.01.2016
 

我知道这是一种愚蠢的填充范围的模式,但我想知道在这种情况下的最大值31.12.2020

_______

示例3

标志选项低高
   E BT 20.02.2020 31.12.2020
   情商30.09.2020
   我BT 01.01.2019 31.12.2019
   I LE 01.01.2016
 

也许tis是一种更愚蠢的方式来填充范围...但是我想知道在这种情况下的最大值31.12.2019

那么...有一个简单的方法可以得到这个日期吗? 如果我有一个包含所有可用数据的表,就可以轻松完成,就像我将使用该范围执行SELECT MAX一样。。。我从来没有见过这样的表。

那么,您有什么建议吗?

谢谢。

此致

Guido

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

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


你好

我有一系列数据,我想知道其中包含的最大数据是什么。

我为我的英语致歉,我尝试使用一些示例来更好地解释

数据:lt_datum数据的TYPE RANGE。

_______

示例1

标志选项低高
   I GT 20.02.2020
 

在这种情况下很简单:最大值为31.12.9999

_______

示例2

标志选项低高
   我BT 20.02.2020 31.12.2020
   情商30.09.2020
   我BT 01.01.2019 31.12.2019
   I LE 01.01.2016
 

我知道这是一种愚蠢的填充范围的模式,但我想知道在这种情况下的最大值31.12.2020

_______

示例3

标志选项低高
   E BT 20.02.2020 31.12.2020
   情商30.09.2020
   我BT 01.01.2019 31.12.2019
   I LE 01.01.2016
 

也许tis是一种更愚蠢的方式来填充范围...但是我想知道在这种情况下的最大值31.12.2019

那么...有一个简单的方法可以得到这个日期吗? 如果我有一个包含所有可用数据的表,就可以轻松完成,就像我将使用该范围执行SELECT MAX一样。。。我从来没有见过这样的表。

那么,您有什么建议吗?

谢谢。

此致

Guido

付费偷看设置
发送
7条回答
Baoming ROSE
1楼-- · 2020-08-23 05:37

我的建议(具有Abap部门)

我选择了除 Yorman Jose OviedoPeña以外的其他方式 希望在进行操作之前先简化列表。

计算类

 CLASS lc_date_calculation定义。

   公共部分。
     方法get_max_date_from_range
       输入
         date_range TYPE trgr_date
       正在返回
         VALUE(最大日期)TYPE数据表。

     方法convert_range_single_values
       输入
         date_range TYPE trgr_date
       正在返回
         VALUE(dates_range_simplified)TYPE trgr_date。
 ENDCLASS。


 类别lc_date_calculation IMPLEMENTATION。

   方法get_max_date_from_range。

     DATA(simplified_range)= convert_range_single_values(date_range)。
     "如果I EQ和E EQ在同一日期,则E为主导
     SORT简化范围通过低降号升序排列。
     从简化的范围比较低符号中删除相邻的重复项。

     "查找是否有GT。
     读取表简体
          INTO DATA(range_line_gt)
          带钥匙标志='I'
                   选项=" GT"。
     如果sy-subrc EQ 0。
       "查找是否有排除的GT。
       读取表简体
          INTO DATA(不包括range_line_gt_)
          带钥匙标志='E'
                   选项=" GT"。
       如果sy-subrc EQ 0。
         IF range_line_gt_排除-低GT range_line_gt-低。
           max_date = range_line_gt_排除-低-1。
           返回。
         万一。
       其他。
         max_date ='99991231'。
         返回。
       万一。
     万一。

     否则,将获得最大I EQ值。
     读取表简体
          INTO DATA(range_line)
          带钥匙标志='I'
                   option ='EQ'。
     如果sy-subrc EQ 0。
       max_date = range_line-low。
     万一。

   终结法。


   方法convert_range_single_values。

     LOOP AT date_range
          引用到数据(lo_line_range)。
       如果lo_line_range-> option EQ'BT'。
         DATA(计算日期)= lo_line_range->低。
         做。
           追加值trgs_datum(sign = lo_line_range-> sign
                                    选项='EQ'
                                    低=计算日期)至date_range_simplified。
           计算日期=计算日期+ 1。
           如果计算日期GT lo_line_range->高或
              lo_line_range-> high是INITIAL。
             出口。
           万一。
         ENDDO。
       其他。
         追加值trgs_datum(sign = lo_line_range-> sign
                                  选项= lo_line_range->选项
                                  低= lo_line_range-> low)简化为dates_range_simplified。
       万一。
     结局。

   终结法。

 ENDCLASS。
 

和相应的ABAP单元,可以轻松测试您的示例。 (您只需要执行CTRL + SHIFT + F10即可运行它)。

 CLASS ltc_date_calculation DEFINITION
       用于检测
       危险等级危害
       持续时间短
       最后。

   专用部分。
     方法设置。
     方法check_convert_range_is_ok用于测试。
     方法check_max_date_exampl_1用于测试。
     方法check_max_date_exampl_2用于测试。
     方法check_max_date_exampl_3用于测试。

     数据o_cut类型参考lc_date_calculation。

 ENDCLASS。


 类别ltc_date_calculation IMPLEMENTATION。

   方法设置。
     o_cut = NEW#()。
   终结法。


   方法check_convert_range_is_ok。
     "鉴于我有一个奇怪的例子
     DATA(my_input_range)=值trgr_date((符号='I'选项='BT'低='20200101'高='20200103')
                                             (sign ='I'option ='NE'low ='20200105'))。
     "当我调用transform方法时
     DATA(my_result_range)= o_cut-> convert_range_single_values(my_input_range)。
     "那么我应该在结果表中有4个条目,并且条目很好
     cl_abap_unit_assert => assert_equals(
       行为=线(my_result_range)
       exp = 4
       msg ='结果中应该有4行!'  )。
     cl_abap_unit_assert => assert_table_contains(
       表= my_result_range
       line = VALUE trgs_datum(sign ='I'option ='EQ'low ='20200102'))。
     cl_abap_unit_assert => assert_table_contains(
       表= my_result_range
       line = VALUE trgs_datum(sign ='I'option ='NE'low ='20200105'))。
   终结法。


   方法check_max_date_exampl_1。
     "鉴于我有Guido示例1
     DATA(my_input_range)= VALUE trgr_date((sign ='I'option ='GT'low ='20200220'))。
     "当我致电Max finder时
     DATA(max_value)= o_cut-> get_max_date_from_range(my_input_range)。
     "那么结果应该是...
     cl_abap_unit_assert => assert_equals(
       行为= max_value
       exp ='99991231')。
   终结法。


   方法check_max_date_exampl_2。
     "鉴于我有Guido示例1
     DATA(my_input_range)=值trgr_date((符号='I'选项='BT'低='20200220'高='20201231')
                                             (符号='E'选项='EQ'低='20200930')
                                             (符号='I'选项='BT'低='20190101'高='20191231')
                                             (sign ='I'option ='LE'low ='20160101'))。
     "当我致电Max finder时
     DATA(max_value)= o_cut-> get_max_date_from_range(my_input_range)。
     "那么结果应该是...
     cl_abap_unit_assert => assert_equals(
       行为= max_value
       exp ='20201231')。
   终结法。



 方法check_max_date_exampl_3。
     "鉴于我有Guido示例1
     DATA(my_input_range)=值trgr_date((符号='E'选项='BT'低='20200220'高='20201231')
                                             (符号='E'选项='EQ'低='20200930')
                                             (符号='I'选项='BT'低='20190101'高='20191231')
                                             (sign ='I'option ='LE'low ='20160101'))。
     "当我致电Max finder时
     DATA(max_value)= o_cut-> get_max_date_from_range(my_input_range)。
     "那么结果应该是...
     cl_abap_unit_assert => assert_equals(
       行为= max_value
       exp ='20191231')。
   终结法。


 ENDCLASS。
 

我认为代码不完整,有一些示例无法正常工作。

我管理I GT Date_1和E GT Date_2,但您可能还有其他奇怪的情况,例如E GT Date ...

闻人可可
2楼-- · 2020-08-23 05:58

我从来没有觉得选择选项是 适用于日期... https://blogs.sap.com/2014/02/07/dates-and-select-options/

hongfeng1314
3楼-- · 2020-08-23 05:51

感谢弗雷德里克(Frederic)为提供测试课程所做的努力(如果OP始终能够做到这一点,那将是一个奇妙的尝试 世界),我可以找到一个最简单的算法,然后添加了另一个测试用例(Frederic提到的那些"奇怪的"例子):

其他测试方法:

 METHODS high_values_excluded FOR 测试。

 方法high_values_excluded。
   DATA(my_input_range)=值trgr_date((符号='I'选项='BT'低='20200220'高='20201231')
                                           (sign ='E'option ='BT'low ='20201230'high ='20201231'))。
   DATA(max_value)= o_cut-> get_max_date_from_range(my_input_range)。
   cl_abap_unit_assert => assert_equals(
     行为= max_value
     exp ='20201229')。
 终结法。
 

短代码,适用于所有测试用例:

 CLASS lc_date_calculation DEFINITION。
   公共部分。
     方法get_max_date_from_range
       输入
         date_range TYPE trgr_date
       正在返回
         VALUE(最大日期)TYPE数据表。
 ENDCLASS。
 类别lc_date_calculation IMPLEMENTATION。
   方法get_max_date_from_range。
     数据日期类型为d的非唯一键table_line。
     循环至date_range参考数据(lr_line_range)。
       如果lr_line_range-> low不是INITIAL。
         收集lr_line_range->低INTO日期。
         收集转换d(lr_line_range-> low-1)放入日期。
         收集转换d(lr_line_range-> low + 1)放入日期。
       万一。
       如果lr_line_range-> high不是INITIAL。
         收集lr_line_range->高INTO日期。
         收集转换d(lr_line_range-> high-1)放入日期。
         收集转换d(lr_line_range-> high + 1)放入日期。
       万一。
     结局。
     将转换d('99991231')收集到日期中。
     在table_line不在date_range的地方删除日期。
     max_date = dates [lines(date)]。
   终结法。
 ENDCLASS。
clever101
4楼-- · 2020-08-23 06:01

Matthew Billingham ,这是专门为您设计的,我尝试删除我的匈牙利语 记号:)

小熊yu生菜
5楼-- · 2020-08-23 05:40

你好,

出色的解决方案!

非常感谢您的答复。

由于冠状病毒,我为我的最新答案表示歉意。 我很好(至少到现在为止),但是在我发表第一篇文章之后,我不得不面对一些比在数据范围内找到最大值更大的问题。

再次感谢您!

最诚挚的问候,

Guido

粗暴的香蕉
6楼-- · 2020-08-23 05:46

当我编写测试时,我想知道SAP的结果是什么,所以我用SE16事务进行了真正的测试。

它可能会很快变得很复杂

(我认为您可以重构代码,我们很快会看到两次相同的语句)

一周热门 更多>