ABAP 多数据源数据有效期分段操作

数据可间断与数据不可间断要分开考虑,示例代码处理方式为数据不可间断

*数据投影,总的时间线无间断

分散的时间段两端的时间点投影成一个个时间点,点与点之间连成线形成段

*数据投影,总的时间线可间断

分散的时间段两端的时间点投影成一个个时间点,标记开始点,结束点,根据开始点结束点连线形成段

FORM frm_get_period.
**********************************************************************
**********************************************************************
  DATA:BEGIN OF ls_date,
         date      TYPE d,
         date_type TYPE char5,
       END OF ls_date,
       lt_date LIKE TABLE OF ls_date.
  DATA: lv_date      TYPE d,
        lv_date_type TYPE char5.

*1类型数据,连续不间断
  LOOP AT p0008 WHERE begda <= pn-endda AND endda >= pn-begda.
    ls_date-date = p0008-begda.
    ls_date-date_type = 'BEGDA'.
    APPEND ls_date TO lt_date.
    ls_date-date = p0008-endda.
    ls_date-date_type = 'ENDDA'.
    APPEND ls_date TO lt_date.
  ENDLOOP.

*2类型数据可间断
  LOOP AT p9110 WHERE begda <= pn-endda AND endda >= pn-begda.
    ls_date-date = p9110-begda.
    ls_date-date_type = 'BEGDA'.
    APPEND ls_date TO lt_date.

    ls_date-date = p9110-begda - 1.
    ls_date-date_type = 'ENDDA'.
    APPEND ls_date TO lt_date.

    ls_date-date = p9110-endda.
    ls_date-date_type = 'ENDDA'.
    APPEND ls_date TO lt_date.

    IF p9110-endda < '99991231'.
      ls_date-date = p9110-endda + 1.
      ls_date-date_type = 'BEGDA'.
      APPEND ls_date TO lt_date.
    ENDIF.
  ENDLOOP.

  LOOP AT p9111 WHERE begda <= pn-endda AND endda >= pn-begda.
    ls_date-date = p9111-begda.
    ls_date-date_type = 'BEGDA'.
    APPEND ls_date TO lt_date.

    ls_date-date = p9111-begda - 1.
    ls_date-date_type = 'ENDDA'.
    APPEND ls_date TO lt_date.

    ls_date-date = p9111-endda.
    ls_date-date_type = 'ENDDA'.
    APPEND ls_date TO lt_date.

    IF p9111-endda < '99991231'.
      ls_date-date = p9111-endda + 1.
      ls_date-date_type = 'BEGDA'.
      APPEND ls_date TO lt_date.
    ENDIF.
  ENDLOOP.

  SORT lt_date.
  DELETE ADJACENT DUPLICATES FROM lt_date.

  IF lt_date IS NOT INITIAL AND line_index( lt_date[ date_type = 'BEGDA' ] ) > 1.
    DELETE lt_date TO ( line_index( lt_date[ date_type = 'BEGDA' ] ) - 1 ) .
  ENDIF.

  CLEAR gt_period.
  LOOP AT lt_date INTO ls_date.
    IF ls_date-date_type = 'BEGDA'.
      gs_period-begda = ls_date-date.
    ELSE.
      gs_period-endda = ls_date-date.

      IF ( gs_period-begda <= pn-endda AND gs_period-endda >= pn-begda )
           OR gs_period-endda = '99991231'.
        APPEND gs_period TO gt_period.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值