ABAP 알고리즘 문제: 최소 유효 시간 분할

5072 단어
필요 장면: N개의 시간대를 입력하여 중복되지 않는 최소 시간대로 나누기
예1, (20190101-20190105) +(20190103-20190107) =>(20190101-2019003) +(20190104-20190105) +(20190106-2019007)
사고방식 분석: 모든 시간점을 얻고 최소 범위를 나누어 시작 날짜가 유효 시간대에서 나온 것으로 판단하고 종료 날짜 +1을 새로운 시작 날짜로 한다.
코드는 다음과 같습니다.
LOOP AT lt_euilzw INTO ls_euilzw.
  APPEND ls_euilzw-datefrom TO lt_date.
  APPEND ls_euilzw-dateto     TO lt_date.
ENDLOOP.

SORT lt_date.
DELETE ADJACENT DUPLICATES FROM lt_date.
CLEAR ls_euilzw-datefrom.
CLEAR ls_euilzw-dateto.

LOOP AT lt_date INTO DATA(ls_date).

  IF ls_euilzw-datefrom IS NOT INITIAL.
    LOOP AT lt_euilzw INTO DATA(ls_euilzw_q)
      WHERE datefrom =< ls_euilzw-datefrom
      AND dateto >= ls_euilzw-datefrom.
      EXIT.
    ENDLOOP.
    IF sy-subrc <> 0.
      CLEAR ls_euilzw-datefrom.
    ENDIF.

  ENDIF.

  IF ls_euilzw-datefrom IS INITIAL.
    ls_euilzw-datefrom = ls_date.
  ELSE.
    ls_euilzw-dateto = ls_date.
  ENDIF.

  IF ls_euilzw-datefrom = ls_euilzw-dateto.
    CLEAR ls_euilzw-dateto.
  ENDIF.

  IF ls_euilzw-dateto IS NOT INITIAL.
    APPEND ls_euilzw TO lt_euilzw_tmp.
    ls_euilzw-datefrom = ls_euilzw-dateto + 1.
    IF sy-subrc <> 0.
      CLEAR ls_euilzw-datefrom.
    ENDIF.
    CLEAR ls_euilzw-dateto.
  ENDIF.

ENDLOOP.

LOOP AT lt_euilzw_tmp INTO ls_euilzw.
  WRITE :/ ls_euilzw-datefrom ,ls_euilzw-dateto.
ENDLOOP.
 
전재 대상:https://www.cnblogs.com/yibing-jia/p/11275161.html

좋은 웹페이지 즐겨찾기