아아 제가 궁금했던건 Modify 가 아니라 그 문법 이었습니다..
위에 적어주신 내용은 인터널테일블의 모든 레코드들이 한꺼번에 DB 테이블로 데이터 변경 처리가 되는거고요
전 레코드 한개 즉 인터널 테이블의 레코드 하나를 DB 테이블로 보내는 방법이 궁금한거 였거든요^^
제 질문 자체에 논란의 여지가 있었네요 죄송하고요 하단의 제가 짜고 싶은 소스를 적습니다.
SORT itab BY ID NO SER
LOOP AT itab.
READ TABLE DBtab WITH KEY
ID = itab-ID
NO = itab-NO
SER = itab-SER
BINARY SEARCH.
IF SY-SUBRC EQ 0.
CASE itab-MODE
WHEN 'I' or 'U'
modify ~~~ <--요기 문법을 모르겠어요
WHEN 'D'
delete ~~~ <--요기 문법을 모르겠어요
ENDCASE.
ELSE.
CASE itab-MODE
WHEN 'I' or 'U'
modify ~~~ <--요기 문법을 모르겠어요
ENDCASE.
ENDIF.
ENDLOOP.
COMMIT WORK.
댓글 5
-
다급
2008.10.15 04:51
-
mean
2008.10.15 17:45
modify db from itab.하면 전부 modify하게 되는데요.
질문하신건 한행의 한필드만 modify하시려는 건가요?
한필드만 modify 하고싶으시면 MODIFY itab INDEX idx FROM db TRANSPORTING a b.
사용하시면 됩니다.
F1을 누르면 예시가 나오는데요, 예시소스가.
READ TABLE scarr_tab
WITH TABLE KEY carrid = p_carrid
TRANSPORTING NO FIELDS.
idx = sy-tabix.
scarr_wa-currcode = 'EUR'.
MODIFY scarr_tab INDEX idx FROM scarr_wa
TRANSPORTING currcode.
=> scarr_tab의 currcode필드를 scarr_wa로부터 modify시키는 것입니다.
modify시킬 필드의 행은 idx행이구요.
-
아밥맨
2008.10.15 18:36
인터널테이블의 특정레코드 한개로 디비테이블을 모디파이하는방법은 없지않나싶습니다.
CASE 'I' OR 'U'. 하지말고
CASE 'I'.
INSERT ~
CASE 'U'.
UPDATE ~
이런식으로 사용하던지 아니면..
CASE 'I' OR 'U'.
MOVE-CORRESPONDING ITAB TO ITAB_M. APPEND ITAB_M.
CASE 'D'.
MOVE-CORRESPONDING ITAB TO ITAB_D. APPEND ITAB_D.
이런식으로 모디파이/삭제할 데이터를 따로 담아두신후.
LOOP ITAB문이 끝난후
한꺼번에 모아서 처리하는게 좋을듯합니다.
MODIFY dbtab FROM TABLE ITAB_M.
DELETE dbtab FROM TABLE ITAB_D.
이런식으로요.
루프돌때마다 DB에 엑세스하는거보단 또다른 ITAB에 담아둔후 한꺼번에 처리하는게
퍼포먼스면에서도 좋을거라 생각되네요. 개인적으론 이방법 추천합니다.
그리고 DELETE의 경우엔 아래와같은방법으로 건건히 디비테이블 삭제가능합니다.
DELETE FROM dbtab WHERE XXX1 = ITAB-XXX1
XXX2 = ITAB-XXX2.
-
보나
2008.10.15 19:59
저도 처리방법에 대해서는 아밥맨님의 의견과 같다는;;;
경험상으로 ^^;;;
삭제할 데이터들을 먼저 it_del 등에 담아서 한번에 삭제하시고,
생성/수정할 데이터들을 그 후에 한번에 modify 처리하시는 방법이 좋지 않을까 싶습니다;;;
퍼포먼스 측면이나 이후 성공/오류 (commit 이나 rollback 될 시) 처리 부분에서도요..
-
mean
2008.10.15 23:01
엇. 제가 작성한 문법은 db테이블을 modify하는게 아니라 internal table을 modify 하는 문법입니다.
제가 잘못 이해했네욤.;
MODIFY DB FROM ITAB.
요때는 ITAB이랑 DB가 구조가 같아야 해요.
DELETE는 F1에 예제로..
PARAMETERS p_carrid TYPE sflight-carrid.
DELETE FROM sflight
WHERE carrid = p_carrid AND
fldate = sy-datum AND
seatsocc = 0.