SAP CRM
날짜 계산 함수
마징가07
2015. 2. 16. 11:57
날짜 더하는 FUNCTION이다 | |
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 |
*"---------------------------------------------------------------------- |
DATA: ACT_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 |
DATA: test_date TYPE d, "Datum, zu Vergleichszwecken |
corr_date TYPE d. "Datum (ggf. korrigiert) |
corr_date = act_date. |
DO. |
test_date = 1 + 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(2) - 1. "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 |