안녕하세요
이번에도 도움을 받고자 글을 올립니다. 아직 초보이다보니..이런 글을 많이 올리게 되네요..^^
현재 인터널 테이블에 아래와 같이 1년치 Data가 들어있습니다.
IT_ZCBO0001
MONTH MATNR QTY
200812 19222-1 1000
200812 18222-1 300
200812 19252-1 2000
200812 18224-1 300
200812 19226-1 1400
200812 18262-1 330
200901 19222-1 1000
200901 18222-1 300
200901 19252-1 2000
200901 18224-1 300
200901 19226-1 1400
200901 18262-1 330
200902 19222-1 1000
200902 18222-1 300
200902 19252-1 2000
200902 18224-1 300
200902 19226-1 1400
200902 18262-1 330
200903 19222-1 1000
200903 18222-1 300
200903 19252-1 2000
200903 18224-1 300
200903 19226-1 1400
200903 18262-1 330
이런식으로 Data가 들어있는데 이제 month필들 값들을 아래와 같이 바꾸고자 합니다..
200812는 2009091로, 200901은 200902로, 200902는 200903으로 200903은 200904로요....
전 이 것을 바꾸기 위해..
DATA : L_DATER LIKE SY-DATUM,
L_DATER_P LIKE SY-DATUM.
LOOP AT IT_ZCBO0001
CONCATENATE IT_ZCBO0001-month '01' INTO L_DATER.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = L_DATER
DAYS = '00'
MONTHS = '01'
SIGNUM = '+'
YEARS = '00'
IMPORTING
CALC_DATE = L_DATER_P.
IT_ZCBO0001-month
= L_DATER_P+0(6).
MODIFY IT_ZCBO0001. CLEAR L_DATR.
ENDLOOP.
이렇게 코딩하고 돌렸더니...Data가 많아서인지 너무 많은 시간이 걸립니다..
좀더 빠르게 변경할 수 있는 방법이 없을까요....?
조언 좀 부탁드립니다..그럼 수고하세요...
* e-abap님에 의해서 게시물 복사되었습니다 (2010-01-09 13:43)
* e-abap님에 의해서 게시물 이동되었습니다 (2010-01-09 13:57)
댓글 6
-
버미!
2010.01.05 17:08
-
블랙아이즈
2010.01.05 17:57
답변 감사합니다..그런데 internal table의 Month은 항시 어떤 기준을 주냐에 따라서 변하는 값이라서 이렇게 고정하기에는 힘들 것 같습니다. 지금 하고자 하는 것은 어떤 월(月)이 internal table에 들어와도 그 월(月)에+1개월을 해서 변경하는게 주 목적입니다....아무튼 빠른 답변 감사합니다..^^ -
버미!
2010.01.05 18:36
ㅎㅎㅎ 제가 답변한 것은 테스트 하려고 샘플 데이터를 넣은 것이고요
실제 아래 처럼 하면 됩니다...
어차피 Month 필드에는 년월이 들어오므로 값이 변한 들 년월이겠지요..
LOOP AT it_zcbo0001.
if it_zcbo0001-month+4(2) eq 12.
l_year = it_zcbo0001-month(4).
l_year = l_year + 1.
CONCATENATE l_year '01' into it_zcbo0001-month.
else.
it_zcbo0001-month = it_zcbo0001-month + 1.
endif.
WRITE :/ 'Date : ', it_zcbo0001-a.
MODIFY it_zcbo0001.
ENDLOOP.
-
요요
2010.01.05 18:50
나름 튜닝을 해봤는데요.
1년치라는 데에 주목하여 전년도 12월을 포함한 1년치, 총 13개월을 기준으로 변경하는 것이
제일 좋아보여서 아래처럼 해 보았습니다.
LOOP 횟수는 최대 13회로 제한했구요. 해당월이 있는 경우에 대한 데이터만
수정되도록 하였습니다. 월을 더하는 것이라 오름차순으로 정렬할 경우
더한 월의 값과 기존데이터의 월의 값이 중복될 여지가 있어
내림차순으로 최상위에 + 1개월을 하였습니다.
도움이 되시길 바랍니다.
DATA : BEGIN OF gs_data,
month(6),
matnr(7),
qty(10),
END OF gs_data,
gt_data LIKE TABLE OF gs_data.
DATA g_month TYPE char6.
DATA g_num2 TYPE n LENGTH 2.
DATA gt_month TYPE TABLE OF char6.
DATA g_year TYPE gjahr VALUE '2009'.
FIELD-SYMBOLS <lfs_month> TYPE char6.
APPEND: '20081219222-11000' TO gt_data,
'20081218222-1300' TO gt_data,
'20081219252-12000' TO gt_data,
'20081218224-1300' TO gt_data,
'20081219226-11400' TO gt_data,
'20081218262-1330' TO gt_data,
'20090119222-11000' TO gt_data,
'20090118222-1300' TO gt_data,
'20090119252-12000' TO gt_data,
'20090118224-1300' TO gt_data,
'20090119226-11400' TO gt_data,
'20090118262-1330' TO gt_data,
'20090219222-11000' TO gt_data,
'20090218222-1300' TO gt_data,
'20090219252-12000' TO gt_data,
'20090218224-1300' TO gt_data,
'20090219226-11400' TO gt_data,
'20090218262-1330' TO gt_data,
'20090319222-11000' TO gt_data,
'20090318222-1300' TO gt_data,
'20090319252-12000' TO gt_data,
'20090318224-1300' TO gt_data,
'20090319226-11400' TO gt_data,
'20090318262-1330' TO gt_data.
SORT gt_data BY month DESCENDING.
* 전년도 12월을 포함한 1년치 월 데이터
DO 13 TIMES.
g_num2 = sy-index MOD 13.
g_month(4) = g_year.
IF sy-index > 12.
SUBTRACT 1 FROM g_month(4). " 전년도
g_num2 = 12. " 12월
ENDIF.
g_month+4(2) = g_num2.
INSERT g_month INTO TABLE gt_month.
ENDDO.
SORT gt_month DESCENDING. " 중요 : 월을 더하므로 내림차순으로 정렬하여야 중복 안됨.
LOOP AT gt_month ASSIGNING <lfs_month>.
" 해당월이 있을 경우만 변경함.
READ TABLE gt_data TRANSPORTING NO FIELDS
WITH KEY month = <lfs_month>.
CHECK sy-subrc IS INITIAL.
g_month = gs_data-month = <lfs_month>.
IF gs_data-month+4(2) = 12.
ADD 1 TO gs_data-month(4).
gs_data-month+4(2) = '01'.
ELSE.
ADD 1 TO gs_data-month+4(2).
ENDIF.
SHIFT gs_data-month+4(2) RIGHT DELETING TRAILING space.
TRANSLATE gs_data-month+4(2) USING ' 0'.
" 대상월을 일괄적으로 +1개월한 월값으로 변경
MODIFY gt_data FROM gs_data
TRANSPORTING month
WHERE month = <lfs_month>.
ENDLOOP.
-
사니아
2010.01.05 18:52
도움이 될까해서 함 적어 보았습니다. ^^
좋은 하루되십시오.
DATA: lv_year TYPE n LENGTH 4,
lv_month TYPE n LENGTH 2.
DATA: lv_index TYPE sy-tabix.
LOOP AT it_zcbo0001 INTO is_zcbo0001.
lv_index = sy-tabix.
lv_year = is_zcbo0001+0(4).
lv_month = is_zcbo0001+4(2).
lv_month = lv_month + 1.
IF ( lv_month > 12 ).
lv_year = lv_year + 1.
lv_month = '01'.
ENDIF.
CONCATENATE lv_year lv_month INTO is_zcbo0001-month.
MODIFY it_zcbo0001 FROM is_zcbo0001
INDEX lv_index
TRANSPORTING month.
ENDLOOP. -
블랙아이즈
2010.01.06 19:59
감사합니다. 제가 했던 방법보다는 여러가지로 빨라진 것 같습니다.. 많은 도움이 되었습니다..
DATA : l_a TYPE spmon,
l_re TYPE spmon.
DATA : BEGIN OF it_zcbo0001 OCCURS 0,
a TYPE spmon,
END OF it_zcbo0001.
it_zcbo0001-a = '200901'.
APPEND it_zcbo0001.
it_zcbo0001-a = '200903'.
APPEND it_zcbo0001.
it_zcbo0001-a = '200905'.
APPEND it_zcbo0001.
it_zcbo0001-a = '200907'.
APPEND it_zcbo0001.
it_zcbo0001-a = '200909'.
APPEND it_zcbo0001.
it_zcbo0001-a = '200912'.
APPEND it_zcbo0001.
DATA : l_dater LIKE sy-datum,
l_dater_p LIKE sy-datum,
l_month TYPE spmon,
l_year(4).
LOOP AT it_zcbo0001.
if it_zcbo0001-a+4(2) eq 12.
l_year = it_zcbo0001-a(4).
l_year = l_year + 1.
CONCATENATE l_year '01' into it_zcbo0001-a.
else.
it_zcbo0001-a = it_zcbo0001-a + 1.
endif.
WRITE :/ 'Date : ', it_zcbo0001-a.
MODIFY it_zcbo0001.
ENDLOOP.