|
2009년 9월 22일(오전 시간)
*&---------------------------------------------------------------------*
*& Report Z08KDN_20090922_1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08kdn_20090922_1.
WRITE: /,/'hahahahahahahahahahahahahahaha.',
/'hahahahahahahahahahahahahahaha.',
/'hahahahahahahahahahahahahahaha.',
/'hahahahahahahahahahahahahahaha.'.
*NEW-LINE.
SKIP 8.
WRITE 'This is second word...'.
여기서 WRITE 명령 안의 '/'은 줄을 새로운 줄을 표시하며
NEW-LINE의 명령과 동일한 효과를 낸다.
SKIP 명령어를 이용해서 여러 줄의 공백을 표시할 수 있다.
| 단축키 |
설명 |
| shift + F1 |
pretty Printer |
| ctrl + F2 |
check 검증 |
| ctrl + F3 |
active 활성화 |
Transaction Code 만들기
A. 방법
1. /nSE80 으로 접근
2. selectbox를 'program'으로 변경 입력 창에 'Z08_KDN_20090922_1'를 입력
3. 하단의 object Name 에서 마우스 오른쪽 버튼을 누르고 Create -> Transaction
4. 원하는 Transaction code,short text, (report transaction 선택) 를 입력 한다.
5. program 명을 입력하고 Standard Tool Bar의 저장 버튼을 누른다.
6. 이제 Command Field 에 Transaction code를 입력하여 Page에 접근할 수 있다.
B. 방법
1. /nSE93 으로 접근
2. 원하는 Transaction Code , Short text, (Program명을 입력)
3. 이제 Command Field 에 Transaction code를 입력하여 Page에 접근할 수 있다.
ABAP 의 Data Type은?
D - date
T - time
i - integer, length
F - Floating ,length
C - Character
N - Numerical Character
P - Packed Number
Report. 선언부 (Data) Data: xxx Type Global ~ (1.Data Element 2. Structure Type 3. Table Type)
추출부 (Select)
가공부 (More)
출력부 (Write)
선언부에서 Data를 선언하는 부분에는...
Data: ① xxx Type ② D.E (Data Element = Field Type ->[10%] Component Type).
Data - 한 개만 선언
Data: - 여러개를 선언
① 변수명, Data Object 명
② 타입 타입에는 Data Element(File Type) 이나 Component Type , Structure Type , Table Type이 적용 되어진다.
Type에는 데이터를 넣을 수가 없다. (Type은 틀일 뿐..이라고 합니다..)
Type : 그릇 만드는 기계
Data Object : 그릇
T-CODE
SE11 - ABAP DICTIONARY
SE16 - 데이터 브라우저
SE93 - TRANSACTION CODE 만들기
SE84 - DISPLAY DATA ELEMENT. - (데이터 엘리먼트의 타입과 길이 등을 가지고 검색할수 있다.)
SE80 - 오브젝트 네비게이터
SE38 - ABAP 편집기
SE37 - FUNCTION 작성기
T-CODE SE11를 이용하여 데이터의 형태를 본다 , application tool bar의 contents 버튼을 이용해서
executable program을 실행시키면 내용도 확인 할 수 있다.
data browser를 이용하여 볼때 - 파란색이 키필드이다. 노란색은 일반 필드.
실제 예제를 작성해 볼텐데 이를 위하여 TABLE의 정보를 살펴 보기로 합니다.
T-CODE : SE11을 이용하여 SCARR, SPFLI, SFLIGHT, SBOOK 의 4개의 테이블을 조회하여
KEY FIELD 및 사용할 FIELD명을 알아 놓도록 합니다.
Tables - 우리가 실습시 사용해볼 테이블에서 필요한 Field명을 뽑아보았다.
scarr : CARRID, CARRNAME
spfli : CARRID, CONNID / CTIYFROM,CITYTO
sflight : CARRID, CONNID, FLDATE / SEATSMAX , SEATSOCC
sbook : CARRID, CONNID, FLDATE , BOOKID
설명잠깐 :
많이 강조 하셨던 부분이다. TABLE의 선언 만으로는 DATA를 가져 올 수 없는 거라고....
선언부의 Table-element는 Data는 없고 Type만 정의 한다하여 Structure 라고 이야기 한다.
기본 정의 형태의 Type보다는 Structure 의 Type을 가져다 사용 하는 이유는 ERP이기 때문이라고 한다.
기준이 되는 Type을 여러 연관되는 여러 곳에서 사용하고 이와 관련된 정보가 변경되면 모두 변경이 되는게
옳다는 설명이었다.
설명잠깐2:
데이터 베이스에서 키값이나 사용할 field 에 대한 정보는 꼭 숙지해 놓아야 프로그램을 작성할 때
좀 더 쉽게 ABAP CODE에 접근이 가능하다.
P.S
일반 적인 Type의 사용은 10%정도로 나머지 90%는 실제 사용중인 Structure Type을 사용하여 작업하게 된다.
더해서 Standard Table에는 변화가 거의 일어나지 않는다고 함.
결국 테이블을 얼마나 잘 알고 있느냐가 중요한 것이다.
Data xxx Type (Structure Type = Work Area)
│
└->Data Object
* Table 명이 나와도 Structure Type이 된다. ~~~(Type 다음에는..)
(오후 시간)
TYPE VS LIKE
DATA : wa1 TYPE spfli.
DATA : wa2 TYPE wa1.
* 이렇게 선언을 하게 되면 ERROR 가 나게 된다.
* 이유는 wa1 이 Data Element , Table Type , Structure Type 이 아닌 Data Object 이기 때문이다.
DATA : wa1 TYPE spfli.
DATA : wa2 LIKE wa1.
* Data Object를 이용하기 위해서는 LIKE , (STRUCTURE, TYPE ...)등을 이용하기 위해서는 TYPE를 이용한다.
Work Area의 선언
1. TABLES : spfli.
2. DATA : spfli TYPE spfli.
위의 2개 명령은 같은 명령어 이다.
이렇게 선언을 해주면 spfli는 Work Area가 된다.
DATA: BEGIN OF wa1_spfli ,
carrid TYPE spfli-carrid ,
connid TYPE spfli-connid ,
cityfrom TYPE spfli-cityfrom ,
cityto TYPE spfli-cityto ,
END OF wa1. "wa1이라는 WORK AREA를 선언한다.
wa1-carrid = 'AA'.
wa1-connid = '0017'.
wa1-cityfrom = 'seoul'.
wa1-cityto = 'busan'.
* wa1에 값을 정의한다.
WRITE : wa1-carrid ,
wa1-connid ,
wa1-cityfrom ,
wa1-cityto .
* wa1에 값을 출력한다..
위는 begin of 를 이용하여 Work Area를 선언하는 방법입니다.
Internal Table 의 선언
1. DATA : it1 TYPE TABLE OF spfli.
2. DATA : it2 LIKE TABLE OF wa1.
3. DATA : it3 LIKE it1.
으로 선언 되어질수 있다.
TABLES : sflight.
WRITE: sflight-carrid ,
sflight-connid ,
sflight-fldate ,
sflight-seatsmax ,
sflight-seatsocc.
1. TYPES kim1 TYPE c.
2. DATA kim2 TYPE c.
3. DATA kim3 LIKE kim1.
4. DATA kim3 TYPE kim1.
이중 Error 가 나는 부분을 확인해보기.
: 3번은 kim1 은 TYPE으로 선언이 되어 있지만 LIKE로 kim3에 적용 하려 하고 있는 것을 볼 수 있다.
LIKE는 Data Object일 경우에 사용 할 수 있다.
STRUTCTURE 선언 - (TABLE TYPE)
1. SE11 로 접근.
2. DATA TYPE 의 RADIO 버튼 선택 후 "Z08_T_KDN_SPFLI" 입력
3. CREATE 버튼을 눌러준다.
4. TABLE TYPE 의 RADIO 버튼을 선택한다.
5. SHORT TEXT 를 넣어준다.
6. LINE TYPE 에 SPFLI 를 입력해 준다.
7. APPLICATION TOOL BAR에 활성화 버튼을 눌러준다.
8. STANDARD TOOL BAR 의 저장 버튼을 눌러준다.
이제 Z08_T_KDN_SPFLI 라는 TABLE TYPE이 생겼으므로...
DATA: it2 TYPE TABLE OF z08_t_kdn_spfli.
라고 선언해서 작업할 수 있다.
Literals 관련 (page Number 201)
Text Simbol 만들기
WRITE: 'H'(aaa).
* aaa를 더블 클릭해서 들어가는 부분에서 H라는 text에 대해 변경을 할 수 있다.
WRITE: / text-aaa.
* 이렇게 한 번 선언된 aaa는 text-aaa라는 표기로 계속 불러내서 사용할 수 있다.
DATA: carrid1 TYPE scarr-carrid,
carrid2 TYPE scarr-carrid.
carrid1 = 'AA'.
MOVE 'AA' TO carrid1.
MOVE carrid1 TO carrid2.
* MOVE명령을 이용하면 Data 값을 옮길 수 있다.
제어문 배워보기
if 는 논리적 표현이 있어야 한다.
case는 data Object가 있어야 한다.
DATA: carrid1 TYPE scarr-carrid VALUE 'AA'.
CASE carrid1.
WHEN 'AA'.
WRITE:/ carrid1.
WHEN OTHERS.
WRITE:/ 'WRONG...'.
ENDCASE.
IF carrid1 EQ 'AA'.
WRITE: / carrid1.
ELSE.
WRITE: /'WRONG....'.
ENDIF.
반복문
DATA: int1 TYPE i.
DO 10 TIMES.
ADD 1 TO int1.
WRITE : / int1.
ENDDO.
DO 10 TIMES.
WRITE: / sy-index.
ENDDO.
select 에서는
sy-dbcnt 을 사용한다.
System Fields
se11 -> data type (radio button) -> syst 입력 -> 조회
sy-subrc (server return code) 성공 0: success ,
그외 실패 ~: fail
= exception
*Dialog message
message 는 000은 000~ 999 까지의 글을 넣을수 있다.
MESSAGE i000(z08_kdn). " ->이렇게 적어준 뒤에 z08_kdn을 더블클릭 해주면 해당 메시지를 추가 수정할수 있는 창이 나온다.
WRITE: / sy-uname.
-> 경고창이 발생합니다.
MESSAGE s000(z08_kdn).
WRITE: / sy-uname.
-> 하단에 초록색 표시와 함께 표시 됩니다.
MESSAGE w000(z08_kdn).
WRITE: / sy-uname.
-> 하단에 빨간색 표시와 함께 표시 됩니다. 엔터를 치면 넘어갑니다.
MESSAGE e000(z08_kdn).
WRITE: / sy-uname.
-> 하단에 빨간색 표시와 함께 표시 됩니다.
MESSAGE a000(z08_kdn).
WRITE: / sy-uname.
-> X박스가 떠있는 경고창이 발생합니다. -> 프로그램이 끝남
MESSAGE x000(z08_kdn).
WRITE: / sy-uname.
-> Runtime Error 가 발생합니다. -> 역씨 프로그램이 끝남
자 프로그램을 만들어 봅시다.
* 일반 Data Type을 적용한 예제
PARAMETERS: pa_carr(3) TYPE c.
WRITE: / pa_carr, pa_conn.
*ERP parameter 를 사용하기
PARAMETERS: pa_carr TYPE sflight-carrid,
pa_conn TYPE sflight-connid.
WRITE:/ pa_carr, pa_conn.
무엇이 틀린가요?
ERP는 이미 형태가 만들어져 있습니다.
Parameter의 TYPE을 Structure 인 sflight-carrid 로 정의 하였을 때 이에 대한 특성을 모두 물려 받게 됩니다.
이로 인해 carrid가 조회 조건으로서 개발자가 따로 작성하지 않아도 Helper창이 나오게 됩니다.
*ERP 경고창을 추가하여 작업합니다.
PARAMETERS: pa_carr TYPE sflight-carrid,
pa_conn TYPE sflight-connid.
AT SELECTION-SCREEN. "eventCode~
IF pa_carr = 'AA'.
MESSAGE w001(z00_kdn) WITH pa_carr.
ENDIF.
*이벤트를 넣어서 다음 페이지로 넘어갈 수 없게 작업
START-OF-SELECTION. "eventCode
WRITE:/ pa_carr, pa_conn.
AT SELECTION-SCREEN 에서 성공하지 못하면 이벤트상 START-OF-SELECTION 의 코드가 실행
되지 않는다.
*디버그
application tool bar의 두개의 디버깅 버튼 중 왼쪽의 디버깅을 눌러서 작업하면
자기 자신에게만 유효한 버깅이 된다.
break point. 를 적어주게 되면...
프로그램을 사용하는 모든 사용자에게 나타난다.
program 실행 중에 command field에 /h를 입력하고 F8을 누르면 debug모드로 변경된다
| Mode |
Function Key |
Description |
| Single step |
F5 |
개별 문장 처리 statement by statement |
| Execute |
F6 |
줄 단위 처리 line by line |
| Return |
F7 |
현재 실행중인 하위 구조에서 상위로 빠져 나가기 (본문으로 복귀) return to the main program |
| Run(to cursor) |
F8 |
전부 실행해 버리기(프로그램의 끝까지 수행) run to the end of program |
Modularization
- 간단한 식들을 모아놓은 것.
Local Program Modularization
- 현재의 프로그램에서만 사용이 가능 함을 뜻합니다.
Separation Data
- 각 데이터의 영역이 다르기 때문에 서로 프로그램간의 데이터 공유는 되지 않는다.
중복 되는 계산식등 프로그램 자체에서 사용하게 될 공식이나 중복 구문이 있다면 이를 perform - form 을
이용해서 작업 할수 있다.
자 이제 중복되는 부분의 식을 form을 활용하여 만들어 보자.
CONSTANTS: pi TYPE p DECIMALS 4 VALUE '3.121592'.
DATA: r1 TYPE i.
DATA: result TYPE p DECIMALS 6.
r1 = 10.
PERFORM circumference.
WRITE : result.
*&---------------------------------------------------------------------*
*& Form circumference
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM circumference .
result = 2 * pi * r1.
ENDFORM. " circumference
perform 을 만들고 더블클릭 하면 main에 form을 자동으로 선언해준다.
DATA: a(2) , b(2) , c(2).
a = b = c = 'AA'.
PERFORM value_result USING a CHANGING b c.
WRITE :/ a, b, c.
*&---------------------------------------------------------------------*
*& Form value_result
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_A text
* <--P_B text
* <--P_C text
*----------------------------------------------------------------------*
FORM value_result USING p_a
CHANGING p_b
p_c.
p_a = p_b = p_c = 'BB'.
ENDFORM. " value_result
Actual Parameter : a b c
| | |
Formal Parameter : p_a p_b p_c
p_c 를 변경하면 c는 자동으로 변경되게 된다..
p_c를 변경하게 된다면 c는 동시에 변경이 될 것이다.
★ Call By Referance
FORM value_result USING p_a
CHANGING p_b
p_c.
p_a = p_b = p_c = 'BB'.
ENDFORM. " value_result
p_b, p_c 는 call by referance이기 때문에 b와 c는 바로 변경된다.
p_a 는 using 이기 때문에 넣을 수 없다는 Error가 뜨든데?
★ Call by Value
FORM value_result USING value(p_a)
CHANGING p_b
p_c.
p_a = p_b = p_c = 'BB'.
ENDFORM. " value_result
p_a 를 value(p_a)로 변경하면 value만을 넘기게 되기 때문에
p_a와 관련 없게 되게 된다.
★ Call by Value & Result
FORM value_result USING value(p_a)
CHANGING value(p_b)
p_c.
p_a = p_b = p_c = 'BB'.
ENDFORM. " value_result
changing 부분에 p_b 를 value(p_b)로 변경하면
call by value & result 라고 칭하며 b가 변경되는 시점은
return이 되는 시점이 된다.
using과 changing 의 차이
using 에 적용하는 Data Object는 변경이 아닌 단지 사용 하기 위함이고.
changing 은 변경 하려는 것이다
internal table 을 이용하는 시점이면 form에서 using call by reference를
사용한다면 Pointing 을 하기 때문에 프로그램이 좀 더 가볍다.
Typing the interface parameters
- parameter에 구체적인 type을 명시해 준다.
Visibility of Global and Local Data Objects
Using 과 changing 를 통하고 변경하지 않는다.
|