数据可间断与数据不可间断要分开考虑,示例代码处理方式为数据不可间断
*数据投影,总的时间线无间断
分散的时间段两端的时间点投影成一个个时间点,点与点之间连成线形成段
*数据投影,总的时间线可间断
分散的时间段两端的时间点投影成一个个时间点,标记开始点,结束点,根据开始点结束点连线形成段
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.