Abap Basic

Preview:

Citation preview

SAP BC400

테크윈 IS 팀서기준

목 차1. System Architecture, Syntax ……………………… 32. 화면 설명 …………………………………………………………………………

103. 소스 설명 …………………………………………………………………………

144. Full Source Code ………………………………………………… 485. Subroutine ………………………………………………………………… 516. TABLE JOIN ………………………………………………………………… 57

1. System Architecture, Syntax

System Architecture

• 3 Tier 구조 Presentation Layer Application Layer DB Layer

• MS Dispatcher 작업 분배

• Dispatcher 작업을 WP 에 분배

• Work Process 실제 작업

ABAP Program

2.F8( 실행 )

4. DB 관련 명령어

5.Itab 에 저장

1. 조회화면

3.WP 에서 프로그램 실행

6.Write 문

Interaction Between Server Layers

Load-of-program. Initialization.

Select, Insert 등SQL 문Write 문 등

출력문

START-OF-SELECTION.END-OF-SELECTION.

• Saved Program Saved 후 Activate하지 않으면 마지막으로 Save 된 것이 아니라 마지막으로 Activate 된 것이 Execute 된다 . 실행 전 Activate 필수

• Activate Save Check Activate

• Activate 를 자주하라 .

Activate

• Data 선언• SELECT ~ ENDSELECT

– DB 에서 조건에 맞는 DATA 를 WA_SCARR 에 가져옴 .

• NEW-LINE. ( 줄바꿈 )• wa_scarr-carrid 외 2 개 화면 출력 .• . ( 마침표 )

General ABAP Syntax I

Line 처음 ‘ *’ line 주석문

‘ “ ’ 더블 쿼테이션 다음에 주석문

‘ : ’, ‘ , ’ 콜론 다음에 콤마가 나오면 앞에 나왔던 명령 계속 실행 .( 계속 WRITE)

General ABAP Syntax II

2. 화면 설명

조회 화면

실행 화면

Double Click

3. 소스 설명– Data 선언 , 15– Local & Global Data Type 16– Dictionary 17– Structure, Work area & Internal Table 19– Assignments 24– Event 순서 26 > 조회 화면 > LOAD-OF-PROGRAM. 28 > INITIALIZATION. 28 > AT SELECTION-SCREEN. 29 > 처리 로직 > START-OF-SELECTION. 30 > DB ACCESS 31 > SYSTEM 변수 38 > 화면 출력 > END-OF-SELECTION. 39 > 더블 클릭 > AT SELECTION-SCREEN. 41

> 제어문 , 반복문 42 > DETAIL LIST 44

> HIDE AREA 46 Source 코드 설명

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_scarr2 : Local Data Type * 프로그램 내에서 선언하면 Local Data TypeDATA : BEGIN OF wa_scarr2, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, END OF wa_scarr2.

* scarr : Global Data Type * ABAP Dictionary 에 정의되어 있으면 Global Data typeDATA wa_scarr TYPE scarr.DATA it_scarr LIKE TABLE OF wa_scarr.

• Data type 선언 Dictionary 이용 DATA name TYPE dictionary. field : 하나의 값 Work area : 여러 개의 값을 Set 으로 저장 . Internal Table : Work area 의 set

Using Dictionary Elements to Define Data Objects Within the

Program

DATA it_spfli TYPE spfli_tabTable Type

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 areaDATA it_scarr LIKE TABLE OF wa_scarr. “Itab

DATA it_scarr TYPE TABLE OF scarr. “ItabDATA wa_scarr LIKE LINE OF it_scarr. “Work area DATA wa_scarr TYPE s_carr_id. “Data Element,W.A.DATA it_scarr TYPE TABLE OF scarr. “Itab

DATA it_scarr TYPE scarr_tab. “Table Type,ItabDATA wa_scarr LIKE LINE OF it_scarr. “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_scarr2 TYPE TABLE OF scarr WITH HEADER LINE.

Internal Table with Header line

1. LOOP AT itab. itab-carrid = itab-carrname. MODIFY itab. CLEAR itab. ENDLOOP.

2. LOOP AT itab INTO itab. itab-carrid = itab-carrname. MODIFY itab. CLEAR itab. ENDLOOP.

3. LOOP AT itab INTO wa. wa-carrid = wa-carrname. MODIFY wa. CLEAR wa. ENDLOOP.

* 참고•일반적으로 1 번 사용•SAP 에서 3 번 권장 .

•1 번 = 2 번 = 3 번•1 번의 LOOP At itab 다음에 “ INTO itab.” 생략

Internal Tables with and Without Header Lines

•헤더라인 없는 Internal Table 사용 권장Why? Class 에서 헤더라인 있는 Internal Table을 사용할 수 없다 . 그래서 헤더라인 없는 Internal Table + Work Area 를 사용 권장

Internal Table with Header line

1. 1 번 라인을 헤더라인에 올려 데이터를 수정2. MODIFY 하면 바디가 수정된다 .3. 2 번 라인부터 마지막 라인까지 순차적으로 헤더라인에 올려 수정 후 MODIFY 하면 바디 수정

21

Value Assignments

carrid1 = 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 & SELECT-OPTIONS 의 초기 값을 넣어 준다 .•AT SELECTION-SCREENSelection 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

Dialog Messages( 예 )MESSAGE i001(zm19) WITH es_row e_column.• ZM19 부분을 더블 클릭하면 message_class로 들어갑니다 .

•다음과 같이 입력하면 ‘ &’ 부분에 es_row, e_column 이 순서대로 들어갑니다 . 최대 4개까지 가능합니다 .•‘&&’ 를 입력하면 화면에 ‘&’ 으로 출력됩니다 .

프로그램 처리 부분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’

• Open SQL DB interface 를 통해 Native SQL 로 변경 검색 결과 Table buffer 에 저장 SELECT …

• Native SQL DB 에 직접 Access DBMS 에 Dependent EXEC. ~ ENDEXEC.

Database Access (Architecture)

Database Read Access

Reading Single Records• SELECT SINGLE…

WHERE 조건에 KEY값을 잘 설정해서 DATA 건수가 하나만 나올 수 있도록 해야 함 . DATA 건수가 하나 이상일 경우 제일 처음 만나는 것을 가져옴

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 a loop

• SELECT … ENDSELECT

DB Interface 에서 순차적으로 Data 를 가져오기 때문에 속도가 느리다 . 그렇기 때문에 , 가능하면 사용하지 말자 .

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. 으로 값을 넘기기 위해 사용된다 .

CLEAR, REFRESH, FREE• CLEAR ITAB. 헤더만 지운다 .• CLEAR ITAB[]. REFRESH ITAB. 바디를 지운다 .• FREE ITAB. 할당 된 메모리를 지운다 . 그런데 디버그 모드에서 ITAB 이 사라지지 않는다 .

• CLEAR : 변수 1, 변수 2, 변수 3.

• Sort it_sflight by carrid. carrid 로 it_sflight 정렬

더블 클릭 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(제어문 )

• Loop Counter – sy-index DO. ~ ENDDO. DO n TIMS. ~ ENDDO. WHILE. ~ ENDWHILE.

– sy-tabix LOOP AT <ITAB>. ~ ENDLOOP.

Loops( 반복문 )

Generating a Details List• AT LINE-SELECTION.

Double click Event

Generating Several Details Lists

• sy-lsind 1 이면 더블 클릭 1 번 한 화면 2 이면 위처럼 더블 클릭 1 번한 화면에서 다시 더블클릭

1: write

2: 더블클릭

3: write

4: 더블클릭

5: write

6: BACK

7: BACK

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 zabap19_11.

* Data typeDATA : gv_char(10) TYPE c, "Character Length 10 gv_numc(4) TYPE n, "Numerical character Length 4 gv_pack(5) TYPE p DECIMALS 2, "Packed Number XXX.XX gv_date TYPE d, "Date 2006.08.27 gv_time TYPE t, "Time 12:16:30 gv_int TYPE i. "Integer

* Local Data TypeDATA : BEGIN OF wa_scarr2, carrid TYPE scarr-carrid, carrname TYPE scarr-carrname, END OF wa_scarr2.

* scarr, sflight : Global Data TypeDATA 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 referenceActual parameter 를 그대로 사용한다 .

Call by value, Call by value result, Call by reference

•Call by value값을 복사해서 사용하고 Subroutine 이 끝나면 지운다 .•Call by value and result값을 복사해서 사용하고 Subroutine 이 끝나면 값을 리턴한다 .•Call by referenceActual parameter 를 그대로 사용한다 .

Call by value 외 2 개 소스 1/2

REPORT zabap19_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, ' sum = ', pv_sum COLOR 1.WRITE :/ 'Change after function' COLOR 5.

q

FORM call_by_value USING value(p_pv_a) value(p_pv_b) value(p_pv_sum). WRITE:/. 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:/. 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:/. 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, ' sum = ', pv_sum COLOR 4. WRITE:/ '============ end function ============'.ENDFORM. " call_by_reference

5. TABLE JOIN

• inner join 2 개의 Table 에서 필요한 필드만 가져와서 하나의 테이블을 만든다 . 2 개의 테이블에서 공통의 필드를 가지고 있어야 한다 . 여기서는 Mandt, Carrid 가 공통 필드

Example of a Table Join

사용 예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 depemp 와 dep table 을 inner joinON a~parts = b~parts 테이블 두개의 연결 키

Implementation Options for Table Joins