오랫만에 글을 남깁니다.
구현하고 싶은 것이 한 Internal table에 있는 하나의 필드를 읽어서
읽은 필드를 제외한 나머지를 확인해서 동일한 데이터가 있는지 확인하고
동일한 데이터가 있으면 '중복 데이터'라는 문구를 다른 필드에 modify를 하려고 합니다.
a1 a2
================
1 중복데이터
2 중복데이터
3
1 중복데이터
4
2 중복데이터
5
아래처럼 작성하니까 읽은 값을 포함하여 전체를 비교하니까 '중복데이터'라는 문구가
모든 필드에 붙어버리더군요.
LOOP AT IT_03.
READ TABLE IT_03 WITH KEY MATNR_C = IT_03-MATNR_C.
IF SY-SUBRC EQ '0'.
IT_03-TTEXT = '중복된 데이터'.
MODIFY IT_03.
ENDIF.
ENDLOOP.
자신을 제외시키고 한 필드 내의 데이터를 비교할 수 있는 좋은 방법이 없을까요?
댓글 8
-
심마니
2008.05.22 20:37
-
bd
2008.05.22 22:35
심마니님에 소스 가지고 테스트 해보니...
질문 내용과 동일하게 에러 처리가 되는데;;;;
제가 잘못한걸까요??
-
아밥맨
2008.05.22 23:03
DATA : BEGIN OF LT_TAB OCCURS 0,
MATNR(5),
TEXT(10),
END OF LT_TAB.
DATA : LT_TAB2 LIKE LT_TAB OCCURS 0 WITH HEADER LINE.
DATA : L_TABIX LIKE SY-TABIX,
L_CNT TYPE I.
LT_TAB-MATNR = '1'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '2'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '3'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '1'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '4'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '2'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB-MATNR = '5'. APPEND LT_TAB. CLEAR LT_TAB.
LT_TAB2[] = LT_TAB[].
SORT LT_TAB2 BY MATNR.
*DELETE ADJACENT DUPLICATES FROM tp_itab COMPARING matnr.
LOOP AT LT_TAB.
L_TABIX = SY-TABIX.
CLEAR: L_CNT.
LOOP AT LT_TAB2 WHERE MATNR = LT_TAB-MATNR.
L_CNT = L_CNT + 1.
ENDLOOP.
IF L_CNT > 1.
LT_TAB-TEXT = '중복데이터'.
MODIFY LT_TAB INDEX L_TABIX TRANSPORTING TEXT.
ENDIF.
ENDLOOP.
LOOP AT LT_TAB.
WRITE:/ LT_TAB-MATNR, LT_TAB-TEXT.
ENDLOOP.
이렇게 하심 될듯 하네요.
-
행복을 파는 외계인
2008.05.22 23:20
bd님 저도 '중복데이터'라는 문구가 필드마다 다 들어가네요... Transporting의 정확한 기능을 물어보려고 들어왔는데 ^^;;
아밥맨님이 작성해 주신 소스로 다시 테스트 해보고 결과 보고 드릴께요~
-
나도될까
2008.05.23 19:34
SELECT SINGLE * FROM zmw_perstell "디비와의 중복체크입니다 키값으로 내가 입력한 키값과 같은게 있으면 중복
WHERE perid = itab-perid.
IF sy-subrc = 0.
READ TABLE itab1 WITH KEY perid = itab-perid.
IF sy-subrc <> 0.
MESSAGE i007(zmess).
DELETE itab INDEX tc_1-current_line.
ENDIF.
ENDIF.
CLEAR num.
LOOP AT itab INTO wa WHERE perid = itab-perid.
num = num + 1.
ENDLOOP.
IF num > 1.
MESSAGE i007(zmess).
DELETE itab INDEX tc_1-current_line.
ENDIF.
예를들어 테이블에 데이터가 100건일경우 처음에 내가 입력한 키값이 있는지 없는지 셀렉트를 해와서 0이면 중복이구 없으면 중복이 아닌거구요 그다음구문은 셀렉트를 해왔는데 50건을 해왔습니다 itab 으로요 그걸 itab1으로 옮겨놓고 비교를 한겁니다.
심마니님의 tp_itab[] = it_itab[]. 이구문하고같은뜻이죠
제가 50건을 가지고 왔는데 거기서 입력한 값이 있느냐 없느냐를 체크한겁니다. 처음에 디비랑 중복이 떨어졌으니 100건안에 중복이 있는거구요 그중에서 다시 내가 셀렉트를 해온 50건중에 없으면 이건 확실한 중복이란 뜻이구요
다음 구문에서 넘이란 변수안에 제가 룹을 돌면서 입력한 값이 있으면 넘에+1이 됩니다. 2건이상이면 중복이란 메세지가 떨어집니다.
중복일경우 지우란 구문이구요 저두 중복때문에 많이 고생했었구요 이렇게 하시면 될꺼에요
그리고 님이 처음에 쓰신 리드구문은 중복체크를 할떄 별로 좋지않은구문이라고 합니다 저두 선배한테 들은건데
님께서 처음에 셀렉트를 아마도 itab에 해오셨을경우 그것이 디비와 건수가 똑같다면 상관이 없지만 만약 틀릴경우 디비의 중복이 제대로 되지 않습니다 참고하세요 이건 그럼 수고하십시요
-
심마니
2008.05.23 23:14
제가 질문하신 내용을 잘못이해했네요.
전 중복된 데이타에 전부 '중복'이라는 말을 넣는다고 생각했네요.
DATA: l_tabix LIKE sy-tabix,
l_loopc LIKE sy-loopc.
DATA: tp_itab LIKE TABLE OF it_itab WITH HEADER LINE.
tp_itab[] = it_itab[].
SORT tp_itab BY matnr.
DELETE ADJACENT DUPLICATES FROM tp_itab COMPARING matnr.
LOOP AT tp_itab.
CLEAR: l_tabix, l_loopc.
LOOP AT it_itab TRANSPORTING NO FIELDS WHERE matnr = tp_itab-matnr.
l_tabix = l_tabix + 1.
ENDLOOP.
IF l_tabix > 1.
READ TABLE it_itab WITH KEY matnr = tp_itab-matnr.
l_loopc = sy-tabix + 1.
LOOP AT it_itab FROM l_loopc WHERE matnr = tp_itab-matnr.
it_itab-text = '중복'.
MODIFY it_itab.
ENDLOOP.
ENDIF.
ENDLOOP.
LOOP AT it_itab.
WRITE:/ it_itab-matnr, it_itab-text.
ENDLOOP.
이렇게 하시면 첫번째는 제외하고 그 다음에 나오는 것만 '중복'이라는 말이 들어갈겁니다.
그리고 transporting은 필드단위로 제어하기 때문에 리소스나 퍼포먼스에서 좋습니다.
-
루자빗
2008.05.26 17:18
data : lv_old(18), lv_new(18).
*& 비교하고자 하는 키값으로 정렬.
sort it_03 by matnr.
loop at it_03.
if sy-tabix eq 1.
lv_old = it_03-matnr.
else.
lv_new = it_03-matnr.
if lv_old eq lv_new.
IT_03-TTEXT = '중복된 데이터'.
lv_old = lv_new.
else.
lv_old = lv_new.
endif.
endif.
modify it_03.
endloop.
이 정도면 체크가 될 것 같은데요?
건건이 읽은 다음 다음 row 와 비교를 수행하게 되겠지요....
비교해야 할 필드가 여러개라면 concatenate 구문을 사용하시면 됩니다. -
행복을 파는 외계인
2008.06.20 19:25
심마니, bd, 아밥맨, 나도될까, 루자빗님 답변 감사합니다.
아밥맨님 알려주신 방법으로 코딩을 하니까 잘되더라구요 ^^
LOOP AT IT2_04.
CLEAR : COUNT.
LOOP AT IT_04 WHERE MATNR_C = IT2_04-MATNR_C.
IF IT_04-MATNR_H = 'KH'.
COUNT = COUNT + 1.
ENDIF.
ENDLOOP.
IF COUNT > 1.
IT2_04-MATNR = IT_04-MATNR_C.
IT2_04-TTEXT = 'Repetition sub-material is included.'.
MODIFY IT2_04.
ENDIF.
ENDLOOP.
tp_itab[] = it_itab[].
SORT tp_itab BY matnr.
DELETE ADJACENT DUPLICATES FROM tp_itab COMPARING matnr.
LOOP AT tp_itab.
CLEAR: l_tabix.
LOOP AT it_itab TRANSPORTING NO FIELDS WHERE matnr = tp_itab-matnr.
l_tabix = l_tabix + 1.
ENDLOOP.
IF l_tabix > 1.
it_itab-text = '중복'.
MODIFY it_itab TRANSPORTING text WHERE matnr = tp_itab-matnr.
ENDIF.
ENDLOOP.
LOOP AT it_itab.
WRITE:/ it_itab-matnr, it_itab-text.
ENDLOOP.