SAP CRM

날짜 계산 함수

마징가07 2015. 2. 16. 11:57
날짜 더하는 FUNCTION이다


SAP SD에서는 

RP_CALC_DATE_IN_INTERVAL
라는 이름으로 있어서 잘 썼는데

CRM에는 없어서 배껴서 만들어 두고 쓰면 좋다.

 1. PATTEN      


 CALL FUNCTION 'ZRP_CALC_DATE_IN_INTERVAL'

          EXPORTING
            date      l_date
            days      l_int
            months    0
            signum    '+'
            years     0
          IMPORTING
            calc_date p_date.


L_DATE : 기준일자
L_INT : 더하려는 일수
달을 더하려면 MONTHS에, 해를 더하려면 YEARS에 값을 넣는다.
SIGNUM : 기본값은 PLUS(+)이나 빼려면 -를 넣으면 된다. 
P_DATE : 다시 리턴 받은 값.


FUNCTION zrp_calc_date_in_interval.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(DATE) TYPE  DATUM
*"     VALUE(DAYS) TYPE  NUMC2
*"     VALUE(MONTHS) TYPE  NUMC2
*"     VALUE(SIGNUM) TYPE  CHAR1 DEFAULT '+'
*"     VALUE(YEARS) TYPE  NUMC2
*"  EXPORTING
*"     VALUE(CALC_DATE) TYPE  DATUM
*"----------------------------------------------------------------------
  DATAACT_DATE   TYPE D,             "Tagesdatum
        DYS        TYPE P,             "Frist in Tagen
        MON        TYPE P,             "Frist in Monaten
        YRS        TYPE P,             "Frist in Jahren
        TTL_YRS    TYPE P              "Jahre (insgesamt)
                   VALUE 0,
        ROUND      TYPE P              "Rundungsfaktor (wg. Ganz-
                   DECIMALS 2          "zahlendarstellung), um kommerz.
                   VALUE '0.50'.       "Rundung zu umgehen
  ACT_DATE DATE.                     "Datum uebernehmen   QXOK067676
* Datums-Berechnung darf nur innerhalb definierter Grenzen
* (LOW-DATE,HIGH-DATE) erfolgen
  IF DATE <> '99991231' OR            "kleiner Obergrenze  QXOK067676
       SIGNUM '-' AND              "in Vergangenheit    QXOK067676
     DATE <> '18000101' OR             "groesser Obergrenze QXOK067676
       SIGNUM <> '-' ).                "in Zukunft          QXOK067676
    IF SIGNUM '-'.                   "Berechnung in Vergangenheit?
      DYS DAYS.                    "Werte mit negativem Vor-
      MON MONTHS.                  "zeichen versehen
      YRS YEARS.
      ROUND ROUND.                 "Rundungskonstante
    ELSE.
      DYS DAYS.                      "Werte mit positivem Vor-
      MON MONTHS.                    "zeichen belassen
      YRS YEARS.
    ENDIF.
*   Frist in Tagen
    ACT_DATE ACT_DATE + DYS.         "Frist in Tagen
*   Frist in Monaten
*   es koennte auch vorkommen, dass mehr als 12 Monate vorgesehen sind,
*   darum muessen diese angepasst werden
*---------------------------------------------------------------------
    IF MON <> 0.                       "ueberhaupt Monate angegeben?
      PERFORM ADJUST_MONTHS USING ACT_DATE+4(2)  "Monate untersuchen
                                  MON TTL_YRS ROUND.
      UNPACK MON TO ACT_DATE+4(2).     "Monate uebernehmen
    ENDIF.
*   Frist in Jahren
    TTL_YRS YRS + TTL_YRS.           "Gesamtzahl an Jahren
    ACT_DATE(4) = ACT_DATE(4+ TTL_YRS.    "Frist in Jahren
*   nun muss noch geprueft werden, ob es sich beim ermittelten Datum
*   um eine gueltige Datumsangabe (lt. Kalender) handelt; ungueltige
*   waere z.Bsp. 29.02.1991
*--------------------------
    PERFORM VALID_DATE USING ACT_DATE  "Vorzeichen          QXOK085926
                             SIGNUM.   "beachten            QXOK085926
  ENDIF.                               "                    QXOK067676
  CALC_DATE ACT_DATE.
ENDFUNCTION.


*&---------------------------------------------------------------------*
*&      Form  ADJUST_MONTHS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*


*      -->P_ACT_DATE+4(2)  text
*      -->P_MON  text
*      -->P_TTL_YRS  text
*      -->P_ROUND  text
*----------------------------------------------------------------------*
  FORM adjust_months USING act_month TYPE num02                        "
                           mon       TYPE p                            "
                           yrs       TYPE p                            "
                           round     TYPE p.                "YRAK1329uc
    IF mon > 11 OR                       "mehr als 1 Jahr (plus oder
       mon < -11.                        "                 weniger)
      yrs mon / 12 round.            "Resultat als Integer
      mon mon yrs * 12.              "verbleibende Monate
    ENDIF.
    mon act_month + mon.               "Summation der verbleib. Monate
    IF mon <= 0.                         "ins Vorjahr hinein?
      yrs yrs 1.                     "Gesamtzahl Jahre erhoehen
      mon mon + 12.                    "Anzahl Monate korrigieren
    ELSE.
      IF mon > 12.                       "ins Folgejahr hinein?
        yrs yrs + 1.                   "Gesamtzahl Jahre erhoehen
        mon mon 12.                  "Anzahl Monate korrigieren
      ENDIF.
    ENDIF.
  ENDFORM.                    "ADJUST_MONTHS
*&---------------------------------------------------------------------*
*&      Form  VALID_DATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ACT_DATE  text
*      -->P_SIGNUM  text
*----------------------------------------------------------------------*
  FORM valid_date USING act_date TYPE d                                "
                        sign     TYPE c.                    "YRAK1329uc
    DATAtest_date  TYPE d,             "Datum, zu Vergleichszwecken
          corr_date  TYPE d.             "Datum (ggf. korrigiert)
    corr_date act_date.
    DO.
      test_date + corr_date 1.     "plus / minus 1 sollte gleiches
      IF test_date corr_date.          "Datum ergeben?
        EXIT.                            "exit erzwingen
      ENDIF.
      IF sign '-'.                     "Vortag beachten?    QXOK085926
        corr_date+6(2) = corr_date+6(21.  "Vortag bearbeiten
      ELSE.                              "Folgetag beachten   QXOK085926
        corr_date+6(2) = '01'.           "Monatsbeginn        QXOK085926
        corr_date corr_date + 32.      "Folgemonat          QXOK085926
        corr_date+6(2) = '01'.           "auf Monatsersten    QXOK085926
      ENDIF.                             "setzen              QXOK085926
    ENDDO.
    act_date corr_date.                "(ggf. korrigiertes) Datum
  ENDFORM.                    "VALID_DATE