SAP ABAP算法题:拆分最小有效时间段的方法

该文介绍了如何在ABAP中利用PROIVIDE语法处理和拆分输入的重叠时间段,以生成不重复的最小时间段。代码示例展示了如何从用户输入或预设测试数据中拆分结果,并逐步处理重叠部分,最终得到完整的不重叠时间段列表。
摘要由CSDN通过智能技术生成
需求场景: 输入N个时间段,拆分成不重复的,最小时间段
当使用ABAP语言时,可以使用ABAP特有的PROIVIDE语法,可以大大简化算法,增强程序易读性

以下代码可以直接显示测试数据拆分结果,也支持手动输入多个时间段验证拆分结果

TYPES: BEGIN OF ty_itab,
         begda TYPE d,
         endda TYPE d,
         orgeh TYPE char20,
       END OF ty_itab.
TYPES: BEGIN OF ty_result,
         begda TYPE d,
         endda TYPE d,
         orgeh TYPE char100,
       END OF ty_result.
DATA it_itab TYPE TABLE OF ty_itab.
DATA wa_itab TYPE ty_itab.
DATA it_itab1 TYPE TABLE OF ty_itab.  "无重叠时间段
DATA it_itab2 TYPE TABLE OF ty_itab.  "重叠时间段
DATA it_result TYPE TABLE OF ty_result. "最终结果表
DATA wa_result TYPE ty_result.
DATA it_result1 TYPE TABLE OF ty_result. "临时结果表
DATA wa_result1 TYPE ty_result.
DATA it_itab3 TYPE TABLE OF ty_itab.
DATA begda     TYPE d.
DATA endda     TYPE d.

DATA: flag1(1) TYPE c,
      flag2(1) TYPE c.




SELECTION-SCREEN     PUSHBUTTON 2(10) but1 USER-COMMAND cli1.
PARAMETERS: p_begda TYPE sy-datum.
PARAMETERS: p_endda TYPE sy-datum.
PARAMETERS: p_orgeh TYPE char20.

INITIALIZATION.
  but1 = '添加时间段'.
  wa_itab-begda = '20180921'.
  wa_itab-endda = '20191009'.
  wa_itab-orgeh = 'A'.
  APPEND wa_itab TO it_itab2.

  wa_itab-begda = '20191010'.
  wa_itab-endda = '20200317'.
  wa_itab-orgeh = 'B'.
  APPEND wa_itab TO it_itab2.

  wa_itab-begda = '20200318'.
  wa_itab-endda = '20230528'.
  wa_itab-orgeh = 'C'.
  APPEND wa_itab TO it_itab2.

  wa_itab-begda = '20210901'.
  wa_itab-endda = '20230528'.
  wa_itab-orgeh = 'D'.
  APPEND wa_itab TO it_itab2.

  wa_itab-begda = '20230301'.
  wa_itab-endda = '20230328'.
  wa_itab-orgeh = 'E'.
  APPEND wa_itab TO it_itab2.


AT SELECTION-SCREEN.
  CASE sscrfields.
    WHEN 'CLI1'.

      wa_itab-begda = p_begda.
      wa_itab-endda = p_endda.
      wa_itab-orgeh = p_orgeh.
      APPEND wa_itab TO it_itab.
      CLEAR: p_begda,p_endda,p_orgeh.
  ENDCASE.



START-OF-SELECTION.

  IF it_itab IS INITIAL.
    it_itab[] = it_itab2[].
  ENDIF.

  CLEAR it_itab2.

  WRITE:/ '输入的时间段:'.
  LOOP AT it_itab INTO wa_itab.
    WRITE:/ wa_itab-begda,wa_itab-endda,wa_itab-orgeh.
  ENDLOOP.

  WRITE: / '区分重叠与不重叠部分'.

  SORT it_itab BY begda.
  LOOP AT it_itab INTO wa_itab.
    IF sy-tabix = 1.
      begda = wa_itab-begda.
      endda = wa_itab-endda.
      APPEND wa_itab TO it_itab1.
    ELSE.
      IF wa_itab-begda >= begda AND wa_itab-begda <= endda.
*      重叠
        APPEND wa_itab TO it_itab2.
      ELSE.
        begda = wa_itab-begda.
        endda = wa_itab-endda.
        APPEND wa_itab TO it_itab1.
      ENDIF.
    ENDIF.
  ENDLOOP.

  WRITE : / '不重叠部分:'.
  LOOP AT it_itab1 INTO wa_itab.
    WRITE:/ wa_itab-begda,wa_itab-endda,wa_itab-orgeh.
  ENDLOOP.
  WRITE : / '重叠部分:'.
  LOOP AT it_itab2 INTO wa_itab.
    WRITE:/ wa_itab-begda,wa_itab-endda,wa_itab-orgeh.
  ENDLOOP.

* 将重叠部分逐一加入不重叠部分以拆分数据
*  不重叠部分先放入结果
  LOOP AT it_itab1 INTO wa_itab.
    MOVE-CORRESPONDING wa_itab TO wa_result.
    APPEND wa_result TO it_result.
  ENDLOOP.
  WRITE:/ '逐一处理重叠部分'.
  LOOP AT it_itab2 INTO wa_itab.
    WRITE:/ '第' , sy-tabix, '条重叠数据'.
    CLEAR it_itab3.
    APPEND wa_itab TO it_itab3.
    PROVIDE FIELDS orgeh FROM it_result INTO wa_result
                                   VALID flag1
                                   BOUNDS begda AND endda
            FIELDS orgeh FROM it_itab3 INTO wa_itab
                                   VALID flag2
                                   BOUNDS begda AND endda
            BETWEEN '18000101' AND '99991231'.

      wa_result1-begda = wa_result-begda.
      wa_result1-endda = wa_result-endda.
      IF flag2 = 'X' AND flag1 = 'X'.
        wa_result1-orgeh = wa_result-orgeh && '/' && wa_itab-orgeh.
      ELSEIF flag2 = 'X' AND flag1 NE 'X'.
        wa_result1-orgeh = wa_itab-orgeh.
      ELSE.
        wa_result1-orgeh = wa_result-orgeh.
      ENDIF.
      APPEND wa_result1 TO it_result1.
*      SKIP.
    ENDPROVIDE.

    LOOP AT it_result1 INTO wa_result1.
      WRITE:/ wa_result1-begda,wa_result1-endda,wa_result1-orgeh.
    ENDLOOP.
    it_result[] = it_result1[].
    CLEAR it_result1[].
  ENDLOOP.

  WRITE:/ '最终结果'.
  LOOP AT it_result INTO wa_result.
    WRITE:/ wa_result-begda,wa_result-endda,wa_result-orgeh.
  ENDLOOP.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值