************U***r(**********E

Download Report

Transcript ************U***r(**********E

SAP BC400
테크윈 IS팀
서기준
목차
1.
2.
3.
4.
5.
6.
System Architecture, Syntax ………………………
화면 설명 …………………………………………………………………………
소스 설명 …………………………………………………………………………
Full Source Code …………………………………………………
Subroutine …………………………………………………………………
TABLE JOIN …………………………………………………………………
3
10
14
48
51
57
1. System Architecture, Syntax
System Architecture
• 3 Tier 구조
 Presentation Layer
 Application Layer
 DB Layer
• MS
 Dispatcher 작업 분배
• Dispatcher
 작업을 WP에 분배
• Work Process
 실제 작업
ABAP Program
1.조회화면
2.F8(실행)
6.Write문
3.WP에서 프로그램 실행
5.Itab에 저장
4. DB 관련 명령어
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개 화면 출력.
• . (마침표)
General ABAP Syntax II
Line 처음 ‘*’ line 주석문
‘ “ ’ 더블 쿼테이션 다음에
주석문
‘ : ’, ‘ , ’ 콜론 다음에 콤마가
나오면 앞에 나왔던 명령 계
속 실행.(계속 WRITE)
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_scarr2 : Local Data Type
* 프로그램 내에서 선언하면 Local Data Type
DATA : BEGIN OF wa_scarr2,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
END OF wa_scarr2.
* 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_scarr2 TYPE TABLE OF scarr
WITH HEADER LINE.
Internal Table with Header line
* 참고
1. LOOP AT itab.
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.
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를 사용 권장
Internal Table with Header line
1
1. 1번 라인을 헤더라인에
올려 데이터를 수정
2. MODIFY 하면 바디가
2 수정된다.
3. 2번 라인부터 마지막
라인까지 순차적으로 헤더
라인에 올려 수정 후
MODIFY 하면 바디 수정
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 & 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
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’
Database Access (Architecture)
• Open SQL
 DB interface를 통해
Native SQL로 변경
 검색 결과 Table
buffer에 저장
 SELECT …
• Native SQL
 DB에 직접 Access
DBMS에 Dependent
 EXEC. ~ ENDEXEC.
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(제어문)
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
Generating Several Details Lists
• sy-lsind
1: write
7: BACK
2: 더블클릭
4: 더블클릭
3: write
6: BACK
5: write
 1이면 더블 클릭 1번 한
화면
 2이면 위처럼 더블 클
릭 1번한 화면에서 다시
더블클릭
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 type
DATA : gv_char(10)
gv_numc(4)
gv_pack(5)
gv_date
gv_time
gv_int
TYPE
TYPE
TYPE
TYPE
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_scarr2,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
END OF wa_scarr2.
* 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
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, '
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:/.
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, '
WRITE:/ '============ end function ============'.
ENDFORM.
" call_by_reference
sum = ', pv_sum COLOR 4.
5. TABLE JOIN
Example of a Table Join
• inner join
 2개의 Table에서 필
요한 필드만 가져와서
하나의 테이블을 만든다.
2개의 테이블에서 공통
의 필드를 가지고 있어
야 한다.
 여기서는 Mandt,
Carrid가 공통 필드
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
테이블 두개의 연결 키