이제 아밥을 알기시작해 도움을 요청합니다.
standard 테이블 값을 비교하여 생성한 table 에 추가해야 합니다.
WHEN 'UPDT'.
SELECT vbeln ernam aedat zzwar_stdate_end zzwar_lasdlv_end zzewa_month waerk netwr
FROM vbak INTO CORRESPONDING FIELDS OF TABLE lt_vbak.
LOOP AT lt_vbak INTO ls_vbak.
MOVE-CORRESPONDING ls_vbak TO ls_zzwarrobp.
APPEND ls_zzwarrobp TO lt_zzwarrobp.
CLEAR : ls_vbak, ls_zzwarrobp.
ENDLOOP.
IF lt_zzwarrobp IS NOT INITIAL.
INSERT zzwarrobp FROM TABLE lt_zzwarrobp ACCEPTING DUPLICATE KEYS.
IF sy-subrc EQ 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
위의 소스는 vbak 테이블의 특정 필드들을 모아 zzwarrobp 테이블에 insert 합니다.
vbak-vbeln 이 zzwarrobp-vbeln 이 존재하지 않으면
zzwarrobp table 에 append 해야 합니다.
또는,
vbak-vbeln 이 zzwarrobp-vbeln 이 존재한다면
vbak-vbeln = zzwarrobp-vbeln 이 같고
vbak-aedat <> zzwarrobp-aedat (zzwarrobp 에 존재하지 않으면)
zzwarrobp table 에 append 해야 합니다.
zzwarrobp는 계속 증가하게 되겠죠..
조건을 어떤식으로 어디에 주어야 할지 모르겠습니다.
조언부탁드립니다.
댓글 6
-
초보아밥퍼
2010.12.15 05:11
-
초보아밥퍼
2010.12.15 05:13
그리고 아래처럼 사용하시는게 정확하실거예요.
IF lt_zzwarrobp IS NOT INITIAL.
-> IF lt_zzwarrobp[] IS NOT INITIAL.
-
imgood
2010.12.15 21:35
초보아밥퍼님 처럼 이론적으론 이해하겠는데요.. CBO 테이블이라함은 생성한 테이블을 말하는거죠?
데이터 존재 유무 체크를 어떻게 하는지 다시한 번 설명을 부탁드릴께요.
-
초보아밥퍼
2010.12.15 22:02
흠... 결국 로직이 구현이 되버리겠네요.
tables zzwarrobp.
select single *
from zzwarrobp
where vbeln = ls_zzwarrobp-vbeln
and aedat = ls_zzwarrobp-aedat.
if sy-subrc = 0.
else
append ls_zzwarrobp to lt_zzwarrobp.
endif.
이런식이 되겠지요.
-
초보생
2010.12.16 07:18
DB 테이블 ZZWARROBP 에 VBELN, AEDAT 필드가 KEY 라는 전제하에 로직입니다.
DB SELECT 를 여러번 계속하게 되면 퍼포먼스가 많이 떨어집니다. GT_ZZWARROBP 인터널테이블을 생성해서 ZZWARROBP DB 데이타를 모두 가져온 다음 LOOPPING 하여 최종적으로 저장할 데이타는 GT_ZZWARROBP2 테이블에 저장하여 ZZWARROBP 테이블에 INSERT 하는것이 퍼포먼스 향상을 가져옵니다.
DATA: BEGIN OF GT_ZZWARROBP.
INCLUDE STRUCTURE ZZWARROBP.
DATA: END OF GT_ZZWARROBP.
DATA: GS_ZZWARROBP LIKE GT_ZZWARROBP.
DATA: GT_ZZWARROBP2 LIKE TABLE OF GT_ZZWARROBP.
DATA: GS_ZZWARROBP2 LIKE GT_ZZWARROBP.
CLEAR: GS_ZZWARROBP, GS_ZZWARROBP2, GT_ZZWARROBP, GT_ZZWARROBP2.
REFRESH: GT_ZZWARROBP, GT_ZZWARROBP2.
SELECT * FROM ZZWARROBP INTO TABLE GT_ZZWARROBP.
SORT LT_VBAK BY VBELN AEDAT.
SORT GT_ZZWARROBP BY VBELN AEDAT.
LOOP AT LT_VBAK INTO LS_VBAK.
READ TABLE GT_ZZWARROBP INTO GS_ZZWARROBP WITH KEY VBELN = LS_VBAK-VBELN
AEDAT = LS_VBAK-AEDAT
BINARY SEARCH.
IF SY-SUBRC = 0.
ELSE.
MOVE-CORRESPONDING LS_VBAK TO GS_ZZWARROBP2.
APPEND GS_ZZWARROBP2 TO GT_ZZWARROBP2.
ENDIF.
CLEAR: GS_ZZWARROBP2, GS_ZZWARROBP, LS_VBAK.
ENDLOOP.
IF NOT GT_ZZWARROBP2[] IS INITIAL.
INSERT ZZWARROBP FROM TABLE GT_ZZWARROBP2 ACCEPTING DUPLICATE KEYS.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF. -
imgood
2010.12.18 00:21
초보생님, vbeln, aedat 필드가 key 가 아닐 경우는 READ TABLE 문을 사용할 수 없는 건가요?
데이터 가공하는 부분에서 해당 CBO 테이블의 데이터가 존재하는지를 CHECK 하시고
만약 데이터가 존재한다면 lt_zzwarrobp 인터널 테이블에 APPEND를 안시키시기만 하시면 되겠네요.
LOOP AT lt_vbak INTO ls_vbak.
MOVE-CORRESPONDING ls_vbak TO ls_zzwarrobp.
------------------------------------------------------
SELECT SINGLE 이용
SY-SUBRC 로서 APPEND 여부 분기
------------------------------------------------------
ENDLOOP.