SAP/ABAP

[ABAP] 날짜 관련 함수

jipgagosipda 2024. 8. 1. 14:44

FIMA_DAYS_AND_MONTHS_AND_YEARS: 기간 사이의 개월 수 구하기(일수, 연수 구하기도 가능)

기간 24개월 조회만 가능하도록 제한할 때 구현

"기간 사이의 개월 수 구하기
    CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
      EXPORTING
        I_DATE_FROM          = GV_MON_LOW "시작 날짜 (TYPE SY-DATUM 20220101)
        I_DATE_TO            = GV_MON_HIGH "종료 날짜
     IMPORTING
	"E_MONTHS = "일수
         E_MONTHS            = GV_MONTH. "개월 수 (TYPE I)
        "E_YEARS = "연수

 

RP_CALC_DATE_IN_INTERVAL: 기준일자에 대해 날짜 계산하기

날짜 값에서 -6개월할 때 구현

    CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
      EXPORTING
        DATE      = LV_DATE_LOW "계산할 날짜 (TYPE SY-DATUM)
        DAYS      = 0 "일 계산값
        MONTHS    = 6   "6개월 (월 계산값)
        SIGNUM    = '-' "빼주기 (부호 +, -)
        YEARS     = 0 "연 계산값
      IMPORTING
        CALC_DATE = LV_6MON_LOWD. "날짜 결과값 (TYPE SY-DATUM)

 

RH_PM_CONVERT_DATE_TO_MONTH: 일자 사이의 개월 수 계산

  CALL FUNCTION 'RH_PM_CONVERT_DATE_TO_MONTH'
    EXPORTING
      BEGDA  = P_SDATE "시작 날짜
      ENDDA  = P_EDATE "종료 날짜
    IMPORTING
      MONTHS = P_NUM. "개월 수

 

RE_ADD_MONTH_TO_DATE: MONTHS에 -, +, 숫자를 주면 원하는 OLDDATE부터 앞, 뒤의 월을 계산

  CALL FUNCTION 'RE_ADD_MONTH_TO_DATE'
    EXPORTING
      MONTHS  = P_GB " +1
      OLDDATE = P_INDATE "기준일 (TYPE SY-DATUM)
    IMPORTING
      NEWDATE = P_OUTDATE. "결과값 (TYPE SY-DATUM)

→ 기준일에 +1개월 된 값이 P_OUTDATE에 들어감.

 

날짜기간 범위값 테이블 만드는 방법

날짜 조회 기간 범위의 모든 날짜값을 나열한 테이블을 만드는 방법

DATA: LV_SDATE  TYPE SY-DATUM,
        LV_EDATE  TYPE SY-DATUM,
        LV_CHDATE TYPE SY-DATUM,
        LV_NUM    TYPE NUM2.

RANGES: LR_MONTH FOR S066-SPMON.

CLEAR: LV_SDATE, LV_EDATE, LV_CHDATE, LV_NUM, LR_MONTH.

  "잔액 필드 설정 준비(기간 값 받아오기)
  LV_SDATE = S_MONTH-LOW  && '01'.
  IF S_MONTH-HIGH IS NOT INITIAL.
  LV_EDATE = S_MONTH-HIGH && '01'.
  ENDIF.

  TRY.
      IF S_MONTH-HIGH IS NOT INITIAL.
	      
	      "일자 사이의 개월 수 계산
        PERFORM CONVERT_DATE_TO_MONTH USING LV_SDATE LV_EDATE CHANGING LV_NUM.
        LV_NUM = LV_NUM - 1.

        LR_MONTH-SIGN = 'I'.
        LR_MONTH-OPTION = 'EQ'.
        LR_MONTH-LOW = LV_SDATE(6).
        LR_MONTH-HIGH = ''.
        APPEND LR_MONTH.

        LR_MONTH-SIGN = 'I'.
        LR_MONTH-OPTION = 'EQ'.
        LR_MONTH-LOW = LV_EDATE(6).
        LR_MONTH-HIGH = ''.
        APPEND LR_MONTH.

      ELSE.
        LR_MONTH-SIGN = 'I'.
        LR_MONTH-OPTION = 'EQ'.
        LR_MONTH-LOW = LV_SDATE(6).
        LR_MONTH-HIGH = ''.
        APPEND LR_MONTH.
        LV_NUM = 0.
      ENDIF.
    CATCH CX_ROOT.
      LV_NUM = 0.
  ENDTRY.

  IF LV_NUM NE 0.
    LV_CHDATE = LV_SDATE.
    DO LV_NUM TIMES. "개월 수만큼 루프
	    "일자 +1개월 값을 계산하여 조회범위 내의 값을 모두 생성
      PERFORM ADD_MONTH_TO_DATE USING '+1' LV_CHDATE CHANGING LV_CHDATE.
      IF LV_CHDATE < LV_EDATE.
        LR_MONTH-SIGN = 'I'.
        LR_MONTH-OPTION = 'EQ'.
        LR_MONTH-LOW = LV_CHDATE(6).
        LR_MONTH-HIGH = ''.
        APPEND LR_MONTH.
      ENDIF.
    ENDDO.
  ENDIF.

  DELETE ADJACENT DUPLICATES FROM LR_MONTH COMPARING LOW.
  SORT LR_MONTH BY LOW.

 

'SAP > ABAP' 카테고리의 다른 글

[ABAP] RFC  (0) 2024.08.09
[ABAP] FIELD-SYMBOL 필드 심볼  (0) 2024.08.05
[ABAP] MOVE-CORRESPONDING, KEEPING TARGET LINES  (0) 2024.08.01
[ABAP] FOR ALL ENTRIES IN 인터널 테이블과의 조인  (0) 2024.07.30