3-2장 .
SE11 -> SE16으로 볼때...
SPFLI Table 을 이용하여 확인을 하여본다.
파란색은 Key
노란색은 Check Table을 가지고 있음을 뜻한다.
spfli -> zkdn_spfli08 로 복사.
Single insert를 하기 위하여.
z08_kdn_20091007_1 의 Excutable program을 만든다.
REPORT z08_kdn_20091007_1.
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE * FROM spfli INTO wa1.
INSERT into zkdn_spfli08 values wa1.
WRITE: / sy-subrc.
이렇게 하고 SE16 에서 Table 에 데이터가 들어가 있는지 확인해본다.
0 이 나오고 데이터가 삽입 된 것을 볼 수 있다.
자 이제 전체 데이터를 삽입 하는 것을 해보자.
DATA: wa1 TYPE zkdn_spfli08, it1 TYPE TABLE OF zkdn_spfli08.
SELECT * FROM spfli INTO TABLE it1.
INSERT zkdn_spfli08 FROM TABLE it1. 업데이트도 해보자~
DATA: wa1 TYPE zkdn_spfli08, it1 TYPE TABLE OF zkdn_spfli08.
SELECT * FROM spfli INTO TABLE it1 WHERE carrid EQ 'AA'.
UPDATE zkdn_spfli08 SET cityfrom = 'SEOUL' WHERE carrid EQ 'AA'.
modifying single Record / Several Records 중요합니다.
원래는 modify가 인터널 테이블만 수정하게 되어있거든요
하지만 데이터베이스에도 적용이 됩니다.
있으면 업데이트 없으면 인서트~
MODIFY zkdn_spfli08 FROM TABLE it1.
update는 있는 데이터에 대해서만 적용을 할 수 있지만...
modify 는 없는 데이터도 넣어 줄 수 있다.
oracle 의 merge insert 와 똑같다.
14 page
Rollback 을 일으킬수 있는 방법은 2가지 방법.
☆★☆ ,, causing a database rollback.
1. Sending a termination dialog message (A-Message)
2. Using the ROLLBACK WORK ABAP Statement.
Message A Type 을 이용하는 방법과 Abap Statement 인 Rollback Work 를 이용하는 방법
이 있는데 .. Rollback Work 를 이용하면 DB는 Rollback 되지만 프로그램이 종료되지 않는 문제가 있다.
이 때문에 A-Message 를 사용하는것이 올바르다.
terminates program - program 을 끝낸다.
Page 44
LUW - Logical Unit of Work
Commit WORK
여기서 시험문제가 간혹 나오는데...
각 데이터베이스에 대한 테이블들은 하나인것처럼 움직이게 되고 이것이 바로 LUW이다.
Hint
Due to the abobe-mentioned, implicit DB commits, changes that belong to an
SAP LUW may not be placed in different dialog steps( dialog step = program
processing after a screen). The reson is because these steps would thus not because
within a DB LUW.
Locks Concept
1. Lock 걸고 2. Read 하고 3. Change 하고 4. Lock 풀어라
E-WP(LockTable)
1. Lock Object(se11에서 생성) / (EZ* / EY*)
Lock mode ┌ E : Write Lock - 누적 O ├ S : Shared Lock(Read Lock) - 누적 O └ X : Exclusive Write Lock - 누적 X --------------------┼------------------- Lock Parameter - (Lock Argument.)Key Field Key field 들의 묶음.
예를 들어 SPFLI Table 을 보면 MANDT, CARRID , CONNID 가 Key Field 인데... MANDT 만 제공 하였을때와 MANDT , CARRID , CONNID 까지 모두를 제공 하였을 때의 범위가 틀리다는 이야기이다.
2. Lock Module.
Lock Object를 Active(불) 될때 Lock Module 이 만들어 진다. 2개 ENQUEUE_EZ* ---------(Function Module) Lock 잡기 DEQUEUE_EZ* ---------(Function Module) Lock 풀기
3. Using Lock ( Monitering : sm12)
(프로그램에서 호출)
프로그램 내에서 호출 |
서로다른 user가 호출 |
E :누적O |
Lock걸 수 O |
Lock 걸 수 X |
X :누적X |
Lock걸 수 O |
Lock 걸 수 X |
S :누적O |
Lock걸 수 O |
Lock 걸 수 O |
4. flush_enqueue (Lock Container) : lock Container 의 데이터를 lock Table 다 쏟아 낸다.(하나라도 안 들어가면.. 안 들어간다.) Lock Container (RESET_ENQUENE) : lock Container 의 데이터를 초기화 시킨다.
POC 방식 ...: Perform on commit
Page 85 (Setting and Releasing Locks - Timecourse)
1. Setting locks for the data to be processed.
2. If the lock has been successfully set , read the current data from the database.
3. Change the program data (user inputs) and update the changes to the database
4. Release set locks once again.
이 원칙을 잘 정리해 놓으셔야 합니다.
Lock 을 먼져 해야하는 이유는?
Lock 을 걸거나 Lock 이 걸린 것을 확인 하는 작업을 먼져 하지 않고 Read를 해버리면...
다른 사람이 같은 테이블을 건드리거나 할때 변경이 일어난 데이터를 가져와서 작업 할 수도 있고
-- 이는 동기화에 대한 문제이다. --
고로 Lock 을 먼져 걸고 모든 작업을 할 수 있도록 해야한다.
lock object 를 생성합니다.
se11 로 이동후 이름은 EZKDN_SPFLI08 로 준다.
Lock Parameter 에 key Field 를 어떻게 주느냐에 따라서 ... 데이터의 양이 틀리다.
키가 3개인데 3개를 다 적용하게 되면 데이터는 범위가 작아지고 1개만 적용하면 데이터의 범위가 더 많아지게 된다.
Lock Object 를 적용 시킨것은 se37 (function module 이기 때문에) Function Module ENQUEUE_EZKDN_SPFLI08에 접근하여
확인 할 수 있다.
* SM12 를 이용해서 Table 을 확인 할 수 있다.
Program 을 실행 시키고 Table 명을 주면 어떤 계정이 Table 을 작업하고 있는 것을 확인이 가능하다.
SE11을 이용해서 LOCK OBJECT를 만들어 주고...
LOCK MODULE 은 SE38 및 프로그램에서 PATTERN 의 FUNCTION 에서 불러 낸다.
E, X, S 중 어떤 것으로 LOCK 을 실행하는지에 따라 적용이 틀리다.
_COLLECT 를 X 로 지정하면 LOCK 들을 LOCK CONTAINER 에 담아둔다.
FLUSH_ENQUEUE 라는 FUNCTION 을 실행시켜서 작업.
LOCK CONTAINER 를 삭제 하게 하려면...
교재 83 의 RESET ENQUEUE 를 사용한다.
function Module : DEQUEUE_ALL 을 하면 Lock 을 모두 풀 때... (A, B, C)
(오후) 100 Page 시작
맨 마지막에 지금까지 update해야 할 것들을 묶어서 한방에 update 를 하게 된다.
- last Dialog step
*CHANGE
~모아서 처리.
1. 일반적인 방식(Program 내부: POC 방식) - WITHIN THE APPLICATION PROGRAM EX) PERFORM xxxx ON COMMIT. 바로 Update 를 하지 않고, Commit work 가 수행될 때 일괄 처리 SIMPLE ... QUICKLY , LIGHT LUW 를 사용해라.
2. 진보적 방식(Function Module) Attribute (update check) 내부 update 문장들... rollback 처리 Message A Type .
COMMIT WORK 설명 중 짠 PROGRAM - Z08_KDN_20091007_3
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE * FROM zkdn_spfli08 INTO wa1 WHERE carrid = 'AA' AND connid = '0007'.
wa1-cityfrom = 'DAEJEON'. wa1-cityto = 'KWANGJU' PERFORM update_zkdn_spfli001 ON COMMIT. COMMIT WORK. perform update_zkdn_spfli08. *&---------------------------------------------------------------------* *& Form update_zkdn_spfli08 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM update_zkdn_spfli08 . MODIFY sairport FROM wa1. ENDFORM. " update_zkdn_spfli08
Page 109
PROCESS : WRITING REQUESTS
* CALL Function 'XXX' In UPDATE Task cflcct
Log Table 에 Request 형태로 쌓아지게 된다.
Commit work 을 만날때 수행(일괄처리)
SE37 로 이동.
ZKDN_UPD08_1 로 만들고
attributes tab에
update module 선택 해주기.
FUNCTION 에서 IMPORT 되는 IM_WA 에 대해서
PASS VALUE 를 CHECK 해주기 바람.
SOURCE CODE 에 값을 넣어주기.
MODIFY zkdn_spfli08 FROM im_wa.
IF sy-subrc NE 0. MESSAGE a002(z08_kdn) WITH 'could not be update'. ENDIF.
PROGRAM 짜기...
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE * FROM zkdn_spfli08 INTO wa1 WHERE carrid = 'AA' AND connid = '0007'.
wa1-cityfrom = 'SEOUL'. wa1-cityto = 'BUSAN'. *pattern 을 사용하여... ZKDN_UPD08_1 을 입력하고~ 알맞은 값을 넣어준다.
CALL FUNCTION 'ZKDN_UPD08_1' IN UPDATE TASK EXPORTING im_wa = wa1.
COMMIT WORK.
update 에 대한 function module 을 사용하여 작업을 해 보았다.
log table 에 값을 넣어 두었다가 update process 에서 적용을 하더라....
그림 51 밑에 보세요 114 page
Both procedures
delete all previous update flags
delete all previously set locks,
discard all of the updates executed in the current DB LUW,
and discard all of the form routines registered using "PERFORM ON COMMIT".
* Program 까지 함께 죽이려면 Message Type A 를 사용하라.
* ROLLBACK WORK 이나 COMMIT WORK 은 function module에 적지 않는다.
page 117
* update mode 3가지.
1. Asynchronous Update
D - WP U-WP
LUW1
COMMIT WORK -> 바로 이관
LUW2
2. Synchronous Update
D-WP U-WP
LUW1
COMMIT WORK AND WAIT -이관이 될 동안 LUW2 를 실행 안 하고 기다리고 있다.
LUW2
3. Local Update
D-WP -------------------------- SET UPDATE TASK LOCAL -------------------------- LUW1
commit work
LUW2 ---------------------------
*기다리고 빠르게 느껴진다. (메모리 관리를 한다.)
log Table 에 들어가게 하려면...
CFIUT 를 해야 request 형태로 들어간다.
Function Module 의 내부 : Attribute
V1 ┌ 1번째. │ Priority 중요성 높음 (Async , sync ,local) └ 2번째. V2 ┌ 3번째. │ Priority 중요성 낮음 (Async , sync ) └ 4번째.
* V1 은 Memory 사용 , V2는 Memory 미사용.
V1 이 성공해야 V2가 실행... 된다....
Lock 메카니즘은 .. V1까지 ... 적용된다.
sm13에서 확인이 가능하다.
update module 에.. V1update 에서
Page 136
submit 은 report program 만 호출이 가능함.
돌아오지 못함.
external Session 이 열려서 function Call.. 예~
패스패스패스
Page 151
Navigation
Starting new Task 'T1'
External Session 을 하나 더 열어서 실행. Call Function Submit and Return Call Transaction
땀돌이 08 풀어보기
An Authority-Check 는 At selection-Screen 에서 사용된다.
|
스크랩 해갑니다.