范围内的最大数据

2020-08-23 04:58发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好 我有一系列数据,我想知道...

         点击此处--->   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
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 ...

一周热门 更多>