달력을 한번 만들어 봤는데요 ^^;; 밑에 보시다시피 너무 노가다 성인데요..
특히 각 달의 1일의 위치를 잡아 주는 부분이 많이 노가다 성이 되던데...
그부분을 좀더 간소화할 방법이 있나요...?
REPORT zljs_test8 LINE-SIZE 92.
PARAMETERS: g_yea(4),
g_mon(2) TYPE n.
DATA: g_day(2) TYPE n,
g_2mon TYPE i. "윤달 구분 값.
DATA: g_ymf TYPE scal-date. "function에 넣을 값.
DATA: g_result TYPE scal-indicator. "function에서 받을 값.
DATA: day TYPE i. "지정 달의 일수를 받는 부분
DATA: g_space(10). "1일 날짜 앞에 빈칸 만들기용
data: 1_day(10) VALUE '일요일', 2_day(10) VALUE '월요일', 3_day(10) VALUE '화요일',
4_day(10) VALUE '수요일', 5_day(10) VALUE '목요일', 6_day(10) VALUE '금요일',
7_day(10) VALUE '토요일'.
write: sy-uline,
/ sy-vline, 1_day, sy-vline, 2_day, sy-vline, 3_day, sy-vline, 4_day,
sy-vline, 5_day, sy-vline, 6_day, sy-vline, 7_day, sy-vline,
/ sy-uline.
IF g_mon = 1 or g_mon = 3 or g_mon = 5 or g_mon = 7 or g_mon = 8 or g_mon = 10 or g_mon = 12.
day = 31.
ELSEIF g_mon = 4 or g_mon = 6 or g_mon = 9 or g_mon = 11.
day = 30.
ELSEIF g_mon = 2. "2월 윤달 구분
g_2mon = g_yea MOD 4.
IF g_2mon = 0.
day = 29.
ELSE.
day = 28.
ENDIF.
ENDIF.
DO day TIMES.
g_day = sy-index.
CONCATENATE g_yea g_mon INTO g_ymf.
CONCATENATE g_ymf g_day INTO g_ymf. "펑션에 넣어줄 형태로 만들어주기.
CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
date = g_ymf
IMPORTING
day = g_result.
IF g_result = 6.
WRITE: (10)g_day , sy-vline,
/ sy-uline, sy-vline.
ELSEIF g_result <> 6.
IF g_day = 1. "매월 1일 위치 잡는 부분...
CASE g_result.
WHEN '1'.
WRITE : sy-vline, g_space, sy-vline, (10)g_day, sy-vline.
WHEN '2'.
WRITE : sy-vline, g_space, sy-vline, g_space, sy-vline,
(10)g_day, sy-vline.
WHEN '3'.
WRITE : sy-vline, g_space, sy-vline, g_space, sy-vline,
g_space, sy-vline, (10)g_day, sy-vline.
WHEN '4'.
WRITE : sy-vline, g_space, sy-vline, g_space, sy-vline,
g_space, sy-vline, g_space, sy-vline, (10)g_day,
sy-vline.
WHEN '5'.
WRITE : sy-vline, g_space, sy-vline, g_space, sy-vline,
g_space, sy-vline, g_space, sy-vline, g_space,
sy-vline, (10)g_day, sy-vline.
WHEN '6'.
WRITE : sy-vline, g_space, sy-vline, g_space, sy-vline,
g_space, sy-vline, g_space, sy-vline, g_space,
sy-vline, g_space, sy-vline, (10)g_day, sy-vline.
WHEN '7'.
WRITE : sy-vline, (10)g_day, sy-vline.
ENDCASE.
ELSE.
WRITE: (10)g_day, sy-vline.
ENDIF.
ENDIF.
ENDDO.
WRITE: / sy-uline.
TOP-OF-PAGE.
FORMAT COLOR 3.
WRITE: g_yea, '년', g_mon, '월'. "TOP OF PAGE 지정.
댓글 5
-
남군
2011.02.21 22:55
-
그림장이
2011.02.22 01:16
아 정말 감사 합니다 ^^ 이런방법이 있는데 정말 생각지도 못했네요 ^^ 이제 머리를 좀
더 많이 굴려야겠네요 ㅎㅎ
아 이거 수정하다가 ^^;;; 토요일이 1일인 경우 스패이스 안먹던 오류를 발견 수정 완료하게 되었습니다
추가로 월에 12월 이상 값이 들어가면 잘못된값이라는 메세지 뿌리고 프로그램 종료하게 수정하였습니다.
다시한번 재검토가 중요함을 알게되었습니다 ^^ 남군님 감사요~~~
-
양키
2011.02.22 18:51
공부 재밌게 하시네요 ^^ 화이팅입니다. -
ABAPCHOJJA
2011.02.22 18:56
ㅎㅎ 공부하신다니 저두 따라쟁이 해 봅니다. ^^
PARAMETERS: G_YEA(4) DEFAULT SY-DATUM(4),
G_MON(2) TYPE N DEFAULT SY-DATUM+4(2).
DATA START_DATE TYPE D.
DATA LAST_DATE TYPE D.
DATA DATE TYPE D.
DATA WEEKDAY TYPE TABLE OF T246 WITH HEADER LINE.
DATA MOD TYPE I.
DATA DAY TYPE CIND.
DATA POS TYPE I.
* start-date
START_DATE(4) = G_YEA.
START_DATE+4(2) = G_MON.
START_DATE+6(2) = '01'.
* last-date
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
DAY_IN = START_DATE
IMPORTING
LAST_DAY_OF_MONTH = LAST_DATE.
* Weekday
CALL FUNCTION 'WEEKDAY_GET'
EXPORTING
LANGUAGE = SY-LANGU
TABLES
WEEKDAY = WEEKDAY.
* start-weekday.
CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
DATE = START_DATE
IMPORTING
DAY = DAY.
* 순서 : 일, 월, 화,...
LOOP AT WEEKDAY.
WEEKDAY-WOTNR = WEEKDAY-WOTNR MOD 7.
MODIFY WEEKDAY.
ENDLOOP.
SORT WEEKDAY BY WOTNR.
* Header
WRITE : SY-ULINE(78).
SKIP.
LOOP AT WEEKDAY.
WRITE (10) WEEKDAY-LANGT CENTERED COLOR COL_HEADING.
ENDLOOP.
WRITE / SY-ULINE(78).
DATE = START_DATE.
WRITE /.
WHILE DATE <= LAST_DATE.
DAY = DAY MOD 7.
IF DAY = '0'.
WRITE /.
ENDIF.
POS = DAY * 10 + DAY + 1.
WRITE AT POS(10) DATE+6(2) CENTERED.
ADD 1 TO : DAY, DATE.
ENDWHILE.
WRITE / SY-ULINE(78).
TOP-OF-PAGE.
FORMAT COLOR 3.
WRITE: G_YEA, '년', G_MON, '월'. "TOP OF PAGE 지정. -
그림장이
2011.02.23 18:01
핡 ^^ 깔끔하다...먼가 정리된 느낌 ^^ 이렇게 해보도록 노력해봐야겠네요 ㅎㅎ
안녕하세요~
하기 1일 위치 잡는 부분을 이렇게 바꿔 봤습니다.
IF g_day = 1. "매월 1일 위치 잡는 부분...
CASE g_result.
WHEN '7'.
WRITE : SY-VLINE, (10)G_DAY, SY-VLINE.
WHEN OTHERS.
WRITE : SY-VLINE .
DO G_RESULT TIMES.
WRITE : G_SPACE, SY-VLINE.
ENDDO.
WRITE : (10)G_DAY, SY-VLINE.
ENDCASE.
ENDIF.