1 System Architecture Syntax System Architecture 3 Tier




























































- Slides: 60
1. System Architecture, Syntax
System Architecture • 3 Tier 구조 ü Presentation Layer ü Application Layer ü DB Layer • MS ü Dispatcher 작업 분배 • Dispatcher ü 작업을 WP에 분배 • Work Process ü 실제 작업
Interaction Between Server Layers Load-of-program. Initialization. START-OF-SELECTION. END-OF-SELECTION. Write문 등 출력문 Select, Insert 등 SQL문
Activate • Saved Program ü Saved 후 Activate하 지 않으면 마지막으로 Save 된 것이 아니라 마지막으로 Activate 된 것이 Execute된다. ü 실행 전 Activate 필수 • Activate ü Save ü Check ü Activate • Activate를 자주 하라.
General ABAP Syntax I • Data선언 • SELECT ~ ENDSELECT – DB에서 조건에 맞는 DATA를 WA_SCARR에 가져옴. • NEW-LINE. (줄바꿈) • wa_scarr-carrid 외 2개 화면 출력. • . (마침표)
Double Click
3. 소스 설명 – – – Data 선언, Local & Global Data Type Dictionary Structure, Work area & Internal Table Assignments Event 순서 > 조회 화면 > LOAD-OF-PROGRAM. > INITIALIZATION. > AT SELECTION-SCREEN. > 처리 로직 > START-OF-SELECTION. > DB ACCESS > SYSTEM 변수 > 화면 출력 > END-OF-SELECTION. > 더블 클릭 > AT SELECTION-SCREEN. > 제어문, 반복문 > DETAIL LIST > HIDE AREA Source 코드 설명 15 16 17 19 24 26 28 28 29 30 31 38 39 41 42 44 46
Data 선언 DATA : gv_char(10) TYPE c, “Character length 10 gv_numc(4) TYPE n, “Numerical Char length 4 gv_pack(5) TYPE p DECIMALS 2, “ Length 는 5바이트 소수점 2자리(length 5 아님) gv_date TYPE d, “Date (ex)2006. 08. 27 gv_time TYPE t, “Time (ex)12: 30: 26 gv_int TYPE i. “정수형 등이 있다.
Local & Global Data Type * wa_scarr 2 : Local Data Type * 프로그램 내에서 선언하면 Local Data Type DATA : BEGIN OF wa_scarr 2, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, END OF wa_scarr 2. * scarr : Global Data Type * ABAP Dictionary에 정의되어 있으면 Global Data type DATA wa_scarr TYPE scarr. DATA it_scarr LIKE TABLE OF wa_scarr.
Using Dictionary Elements to Define Data Objects Within the Program • Data type 선언 DATA it_spfli TYPE spfli_tab Table Type ü Dictionary 이용 ü DATA name TYPE dictionary. ü field : 하나의 값 ü Work area : 여러 개의 값을 Set으로 저장. ü Internal Table : Work area의 set
Access to Structure Components Work Area – Fieldname 하나의 Data처럼 사용 가능
Work Area, Internal Table 선언 * TYPE : ABAP Dictionary에 있는 것 사용. * Like : Program내에서 선언 된 것을 재사용. * Dictionary를 TYPE으로 가능하지만 권장 안함. DATA wa_scarr TYPE scarr. “Work area DATA it_scarr LIKE TABLE OF wa_scarr. “Itab DATA it_scarr TYPE TABLE OF scarr. DATA wa_scarr LIKE LINE OF it_scarr. “Itab “Work area DATA wa_scarr TYPE s_carr_id. DATA it_scarr TYPE TABLE OF scarr. “Data Element, W. A. “Itab DATA it_scarr TYPE scarr_tab. DATA wa_scarr LIKE LINE OF it_scarr. “Table Type, Itab “Work area
Internal Table with Header line • DATA : BEGIN OF it_scarr OCCURS 0, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, currcode TYPE scarr-currcode, url TYPE scarr-url, END OF it_scarr. DATA it_scarr 2 TYPE TABLE OF scarr WITH HEADER LINE.
Internal Table with Header line * 참고 1. LOOP AT itab-carrid = itab-carrname. • 일반적으로 1번 사용 MODIFY itab. • SAP에서 3번 권장. CLEAR itab. ENDLOOP. • 1번 = 2번 = 3번 • 1번의 LOOP At itab 다음 2. LOOP AT itab INTO itab-carrid = itab-carrname. 에 “INTO itab. ” 생략 MODIFY itab. CLEAR itab. ENDLOOP. 3. LOOP AT itab INTO wa. wa-carrid = wa-carrname. MODIFY wa. CLEAR wa. ENDLOOP.
Internal Tables with and Without Header Lines • 헤더라인 없는 Internal Table 사용 권장 Why? Class에서 헤더라 인 있는 Internal Table을 사용할 수 없다. 그래서 헤더라인 없는 Internal Table + Work Area를 사용 권장
Value Assignments carrid 1 = c_qf Counter 1증가 Field를 Initial Value로 Clear
Copying Structure Components with the Same Name Corresponding은 같은 Field name을 찾아 자동으로 Data의 값을 넣어 줌.
Event 순서 • LOAD-OF-PROGRAM. & INITIALIZATION. Selection Screen 전 PARAMETERS & SELECTOPTIONS의 초기 값을 넣 어 준다. • AT SELECTION-SCREEN Selection Screen 값 또는 권한 체크 • START-OF-SELECTION. Select 등의 구문 • END-OF-SELECTION. 일반적으로 출력문. • AT SELECTION-SCREEN 더블 클릭 이벤트만 빼고 나머지는 위에서 아래의 순서로
조회 화면 PARAMETERS : pa_scarr TYPE s_carr_id. SELECT-OPTIONS : so_scarr FOR wa_scarr-carrid. Select-options에서 선언 한 so_scarr은 sign, option, low, high 값을 가지는 헤더라인을 가지는Internal table.
조회화면 실행 전 LOAD-OF-PROGRAM. so_scarr-sign = 'I'. so_scarr-option = 'BT'. so_scarr-low = 'AA'. so_scarr-high = 'AZ'. APPEND so_scarr. INITIALIZATION. pa_scarr = 'AB'. • 프로그램 Execute 시키면 조회화면 나오기 전 실행.
조회 조건 체크 • AT SELECTION-SCREEN. IF pa_scarr = 'AA'. MESSAGE 'Another value input' TYPE 'E'. ENDIF. • 위의 값이 ‘AA’이여서 ERROR Message
프로그램 처리 부분 START-OF-SELECTION. SELECT * FROM scarr INTO CORRESPONDING FIELDS OF TABLE it_scarr WHERE carrid IN so_scarr. IF sy-subrc <> '0'. STOP. ENDIF. • Scarr table에서 where 조건을 만족하는 데이터를 select하 여 it_scarr에 넣는다. • 조건을 만족하는 Data가 있으면 sy-subrc =‘ 0’ 없으면 sy-subrc = ‘ 4’
Database Access (Architecture) • Open SQL ü DB interface를 통해 Native SQL로 변경 ü 검색 결과 Table buffer에 저장 ü SELECT … • Native SQL ü DB에 직접 Access DBMS에 Dependent ü EXEC. ~ ENDEXEC.
Database Read Access
Suitable Target Structure for the Field List • SELECT SINGLE… ü SELECT SINGLE 필드 1, 필드 2, 필드 3, 필드 4, 필드 5 … ü 필드 1, 필드 2, 필드 3, 필드 4, 필드 5 … 순으로 Work Area에 들어간다.
Fields in the Target Structure that have the Same Names as those in the Field List • SELECT SINGLE… INTO CORRESPONDING FIELDS OF … ü 필드 name이 같은 것을 자동으로 찾아 Work area 에 들어간다.
Reading Several Rows Using an Array Fetch • SELECT … INTO TABLE ITAB … ü DB Interface에서 Table 전체를 가져오기 때 문에 속도가 빠르다. ü … Into corresponding fields of table itab … 을 하면 fields name을 자동 으로 찾아서 입력해 주기 때문에 에러 제거에 좋다.
System 변수 • sy-subrc –Select문 Data 있으면 0, 없으면 4 –그 외 true = 0, false <> 0 • sy-index – loop counter – DO. ~ ENDDO. DO n TIMES. ~ ENDDO. WHILE. ~ ENDWHILE. • sy-tabix – loop counter, LOOP AT itab. ENDLOOP. • sy-lsind – 화면의 깊이. BACK 가능한 화면. • sy-ucomm – SCREEN 화면에서 사용자 입력한 이벤트 명령어 • sy-langu – 사용 언어 • sy-datum – 현재 시간
화면 출력 • END-OF-SELECTION. LOOP AT it_scarr INTO wa_scarr. WRITE : / wa_scarr-carrid, wa_scarr-carrname, wa_scarr-currcode. HIDE : wa_scarr-carrid, wa_scarr-carrname. CLEAR wa_scarr. ENDLOOP. • START-OF-SELECTION에서 가져온 값을 화면에 출력. it_scarr은 internal table이라서 data가 여러건 있다. it_scarr 순차적으로 wa_scarr에 넣어서 화면에 출력한다. HIDE는 더블 클릭하여 AT LINE-SELECTION. 으로 값을 넘기기 위해 사용된다.
더블 클릭 Event • AT LINE-SELECTION. IF sy-lsind = '1'. SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE it_sflight WHERE carrid = wa_scarr-carrid. IF sy-subrc = '0'. WRITE: / 'New Page Start'. ELSE. WRITE: / 'No Data in Database'. ENDIF. LOOP AT it_sflight INTO wa_sflight. WRITE : / wa_sflight-carrid, wa_sflight-connid, wa_sflight-fldate, wa_sflight-price. CLEAR wa_sflight. ENDLOOP. ENDIF.
Conditional Branches(제어문)
Loops(반복문) • Loop Counter – sy-index ü DO. ~ ENDDO. ü DO n TIMS. ~ ENDDO. ü WHILE. ~ ENDWHILE. – sy-tabix ü LOOP AT <ITAB>. ~ ENDLOOP.
Generating a Details List • AT LINESELECTION. ü Double click Event
Buffering Row-Specific Data in the Hide Area • Hide Area ü Hide 를 하면 Data Area에 Line과 Field name과 Value를 저장하 고 있다.
Data Flow for the Row Selection • Hide Area ü Double Click하여 At line-selection. 으로 이 동하면 Hide 값을 가지고 와서 사용할 수 있다.
4. Full Source Code
Full Source 1/2 • REPORT zabap 19_11. * Data type DATA : gv_char(10) gv_numc(4) gv_pack(5) gv_date gv_time gv_int TYPE TYPE c, "Character Length 10 n, "Numerical character Length 4 p DECIMALS 2, "Packed Number XXX. XX d, "Date 2006. 08. 27 t, "Time 12: 16: 30 i. "Integer * Local Data Type DATA : BEGIN OF wa_scarr 2, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, END OF wa_scarr 2. * scarr, sflight : Global Data Type DATA wa_scarr TYPE scarr. DATA it_scarr LIKE TABLE OF wa_scarr. DATA wa_sflight TYPE sflight. DATA it_sflight LIKE TABLE OF wa_sflight. PARAMETERS : pa_scarr TYPE s_carr_id. SELECT-OPTIONS : so_scarr FOR wa_scarr-carrid. LOAD-OF-PROGRAM. so_scarr-sign = 'I'. so_scarr-option = 'BT'. so_scarr-low = 'AA'. so_scarr-high = 'AZ'. APPEND so_scarr.
Full Source 2/2 • INITIALIZATION. pa_scarr = 'AB'. AT SELECTION-SCREEN. IF pa_scarr = 'AA'. MESSAGE 'Another value input' TYPE 'E'. ENDIF. START-OF-SELECTION. SELECT * FROM scarr INTO CORRESPONDING FIELDS OF TABLE it_scarr WHERE carrid IN so_scarr. IF sy-subrc <> '0'. STOP. ENDIF. END-OF-SELECTION. LOOP AT it_scarr INTO wa_scarr. WRITE : / wa_scarr-carrid, wa_scarr-carrname, wa_scarr-currcode. HIDE : wa_scarr-carrid, wa_scarr-carrname. CLEAR wa_scarr. ENDLOOP. AT LINE-SELECTION. IF sy-lsind = '1'. SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE it_sflight WHERE carrid = wa_scarr-carrid. IF sy-subrc = '0'. WRITE: / 'New Page Start'. ELSE. WRITE: / 'No Data in Database'. ENDIF. LOOP AT it_sflight INTO wa_sflight. WRITE : / wa_sflight-carrid, wa_sflight-connid, wa_sflight-fldate, wa_sflight-price. CLEAR wa_sflight. ENDLOOP. ENDIF.
5. Subroutine
Actual & Formal parameters
Call by value, Call by value result, Call by reference • Call by value 값을 복사해서 사용하고 지운다. • Call by value and result 값을 복사해서 사용하고 Subroutine이 끝나면 값 을 리턴한다. • Call by reference Actual parameter를 그 대로 사용한다.
Call by value, Call by value result, Call by reference • Call by value 값을 복사해서 사용하고 Subroutine이 끝나면 지 운다. • Call by value and result 값을 복사해서 사용하고 Subroutine이 끝나면 값 을 리턴한다. • Call by reference Actual parameter를 그 대로 사용한다.
Call by value 외 2개 소스 1/2 REPORT zabap 19_13. DATA: pv_a(3) TYPE n, pv_b(3) TYPE n, pv_sum(3) TYPE n. WRITE : /'Initial value : ', 50 'a = ', pv_a, 'b = ', pv_b, 'sum = ', pv_sum. pv_a = 1. pv_b = 2. PERFORM call_by_value USING pv_a pv_b pv_sum. WRITE : /'Main : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' sum = ', pv_sum COLOR 3. WRITE : / 'Change call by value but main is not change. '. PERFORM call_by_value_result CHANGING pv_a pv_b pv_sum. WRITE : /'Main : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' WRITE : / 'Change after function' COLOR 5. sum = ', pv_sum COLOR 1. PERFORM call_by_reference USING pv_a pv_b pv_sum. WRITE : /'Main : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' WRITE : / 'Actual parameter = Formal parameter' COLOR 5. sum = ', pv_sum COLOR 4. FORM call_by_value USING value(p_pv_a) value(p_pv_b) value(p_pv_sum). WRITE: / '====== start function ======'. WRITE: / 'Call by value Start'. p_pv_sum = p_pv_a + p_pv_b. WRITE : /'Call by value : ', 50 'p_a = ', p_pv_a, 'p_b = ', p_pv_b, 'p_sum = ', p_pv_sum COLOR 3. WRITE : /'Call by value : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' sum = ', pv_sum COLOR 3. WRITE: / '====== end function ======'. ENDFORM. " call_by_value
Call by value 외 2개 소스 2/2 FORM call_by_value_result CHANGING value(p_pv_a) value(p_pv_b) value(p_pv_sum). p_pv_a = 10. p_pv_b = 20. WRITE: / '====== start function ======'. WRITE: / 'Call by value and result Start'. p_pv_sum = p_pv_a + p_pv_b. WRITE : /'Call by value result pv_a pv_b pv_sum : ', 50 'p_a = ', p_pv_a, 'p_b = ', p_pv_b, 'p_sum = ', p_pv_sum. WRITE : /'Call by value result : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' sum = ', pv_sum COLOR 1. WRITE: / '====== end function ======'. ENDFORM. " call_by_value_result FORM call_by_reference USING p_pv_a p_pv_b p_pv_sum. p_pv_a = 100. p_pv_b = 200. WRITE: / '====== start function ======'. WRITE: / 'Call by reference Start'. p_pv_sum = p_pv_a + p_pv_b. WRITE : /'Call by reference pv_a pv_b pv_sum : ', 50 'p_a = ', p_pv_a, 'p_b = ', p_pv_b, 'p_sum = ', p_pv_sum COLOR 4. WRITE : /'Call by reference : ', 50 ' a = ', pv_a, ' b = ', pv_b, ' WRITE: / '====== end function ======'. ENDFORM. " call_by_reference sum = ', pv_sum COLOR 4.
5. TABLE JOIN
Implementation Options for Table Joins 사용 예 SELECT a~sabun a~name a~parts b~parts_area FROM emp AS a INNER JOIN dep AS b ON a~parts = b~parts INTO CORRESPONDING FIELDS OF TABLE it_people. emp INNER JOIN dep emp 와 dep table을 inner join ON a~parts = b~parts 테이블 두개의 연결 키