SY-datum 이 현재 날짜를 불러오는 것인데,
제가 하고자 하는 것은,
예를 들어, 오늘이 3월 12일이면
2007년 12월 01일과 2008년 2월 29일까지의 데이터를 찾기위해
20071201 20080229
20080301 20080330
20080401 20080430
20080501 20080531
20080601 20080630
SELECTION-SCREEN 에서 별도의 날짜 조건 입력없이
현재날짜를 기준으로 과거 2개월 데이터 그리고 앞으로 한달치의 수량을 측정하기위해
위와 같은 날짜 변수를 구해야 하는데, 월(month)을 구하는 시스템변수나 쉬운 방법이 없을까요?
저 위의 날짜들은 SELECT 문에 where 조건에 넣을 날짜들입니다.
========================================================
밑에 로직은 제가 짠건데, 현재가 3월 12일이라면 3개월전인 20071201 ~ 20080601
이걸 구하는 로직입니다.
위의 조건날짜를 다 찾으려면 너무 복잡할 것 같아서
그러는데, 고수님들 조언좀 부탁드려요!!
참고로 현재달을 찾는 시스템변수가 있어서 -1나 -2 를 했을때,
(예를 들어 0803 이라는 현재달까지 계산되는 시스템변수에서 -2를 했을때 0801 이런식으로
되면 얼마나 좋을까요? 이렇게 하려면 INT 로해서 형변환후 해야되나?@.@
아밥은 형변환 하는 것도 잘 모르겠네여@.@)
이전달을 나타낼 수 있게 하면 좋을텐데,
그게 안되는 거 같아요!!
경험 많으신 님들...Tip 좀 부탁드릴께요~
DATA : month TYPE i, "월을 저장하기 위한 변수.
year TYPE i, "윤달을 계산하기 위해 년도를 저장하는 변수
remain TYPE i, "윤달을 계산하기 위해 나머지 값을 저장하는 변수
date_low TYPE sy-datum, "현날짜로부터 3개월 과거를 계산
date_high LIKE sy-datum, "현날짜로부터 3개월 미래를 계산
date LIKE sy-datum. "현날짜
* 해당년도를 4로 나누었을 때, 나머지가 0이면 윤달이므로 2월이 29일까지 존재.
year = sy-datum+0(4).
remain = year MOD 4.
CONCATENATE sy-datum+0(6) '01' INTO date.
date_low = date - 70. "3개월전이므로 어림잡아 70을 넣음.
CONCATENATE date_low+0(6) '01' INTO date_low.
date_high = date + 100. "3개월 이후므로 어림잡아 100을 넣음.
month = date_high+4(2).
IF month = 1 OR month = 3 OR month = 5 OR month = 7
OR month = 8 OR month = 10 OR month = 12.
CONCATENATE date_high+0(6) '31' INTO date_high.
ELSEIF month = 4 OR month = 6 OR month = 9 OR month = 11.
CONCATENATE date_high+0(6) '30' INTO date_high.
* 윤달계산
ELSEIF month = 2.
IF remain = 0.
CONCATENATE date_high+0(6) '29' INTO date_high.
ELSE.
CONCATENATE date_high+0(6) '28' INTO date_high.
ENDIF.
ENDIF.
댓글 5
-
가오만땅
2008.03.13 19:06
-
대지꿀꾸링
2008.03.13 19:55
와~~~ 이런게 있었군요?@.@
네 ..제가 구하고자하는 해당달의 처음일자와 마지막일자
를 구하는 것이었는데~
이런 함수들이 있었네요@.@
제가 함수는 한번도 안써봐서~>_<
위에 정성껏 적어주셔서
감사합니다...^^
-
바바..
2008.03.13 20:26
지금 해당일이 만약 3월 13일일경우 12월 01일을 불러오는 펑션은
DATA : P_PERD-DATE LIKE SY-DATUM.
CONCATENATE P_PERD+0(6) '01' INTO P_PERD-DATE.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = P_PERD-DATE
DAYS = '00'
MONTHS = '03'
SIGNUM = '-'
YEARS = '00'
IMPORTING
CALC_DATE = P_PERD-DATE.
이렇게 하면 2007년 12월01일 구할수있습니다
DATA : P_PERD-DATE LIKE SY-DATUM.
CONCATENATE P_PERD+0(6) '01' INTO P_PERD-DATE.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = P_PERD-DATE
DAYS = '00'
MONTHS = '01'
SIGNUM = '-'
YEARS = '00'
IMPORTING
CALC_DATE = P_PERD-DATE.
**마지막날 구하는 펑션*******
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
DAY_IN = P_PERD-DATE
IMPORTING
LAST_DAY_OF_MONTH = P_PERD-DATE
EXCEPTIONS
DAY_IN_NO_DATE = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
이렇게 하면 2008년 2월29일을 구할수 있습니다.
-
ㄸㅡㄹㅏㄱ
2008.03.13 21:40
아래 펑션은 제가 얼마전 필요해서 만들었던 펑션인데 비슷한거 같네요.
fkdat는 select-options에서 입력 받는 값입니다.
DATA : BEGIN OF iperiod OCCURS 0,
from LIKE sy-datum,
to LIKE sy-datum,
END OF iperiod.
FORM get_period.
DATA: cnt(2) TYPE n,
pre_mon TYPE sy-datum,
from TYPE sy-datum,
to TYPE sy-datum.
CLEAR: iperiod, iperiod[], cnt.
cnt = fkdat-high+4(2) - fkdat-low+4(2) + 1.
DO cnt TIMES.
CLEAR: iperiod, from, to.
IF sy-index = 1.
from = fkdat-low.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = fkdat-low
IMPORTING
last_day_of_month = to.
pre_mon = to.
ELSEIF sy-index = cnt.
CONCATENATE fkdat-high(6) '01' INTO from.
to = fkdat-high.
pre_mon = to.
ELSE.
from = pre_mon + 1.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = from
IMPORTING
last_day_of_month = to.
pre_mon = to.
ENDIF.
iperiod-from = from.
iperiod-to = to.
APPEND iperiod.
ENDDO.
ENDFORM. " GET_PERIOD
-
대지꿀꾸링
2008.03.14 18:38
네 정말 도움이 많이 되었습니다. 감사합니다^^
http://tripboy.cafe24.com/tc/105
E-ABAP 에서 찾은 자료입니다..
여기 자료실에 자료 많으니 조금만 검색해보시면 ^^
날짜관련 펑션이 많이 있으니.. 찾아쓰시면 간단하게 해결되겠네요..