(오전 시간)
Function Modual
Program 입장에서는 ID와 NAME 을 TEST_FUNCTION 으로 EXPORTING 하는 것이고...
Function 입장에서는 Program에서 전달해준 ID와 NAME 라는 데이터를 IM_ID와 IM_NAME이라는 이름으로
IMPORTING 하게 된다.
* import Parameters , Export Parameters : 대입 연산자가 아니라는군요.
저번시간: SESSION 에는 두가지가 있는데 머머가 있지요?
Internal Session(프로그램이 프로그램을 여는 경우)
External Session(하나입니다.)
그림 넣을 자리.
Backup 하는 방법 (잠깐 알려 주셨네요...)
SE38 → display or change Mode → menu → utility → more utilities → upload & download
Executable Program 은 UPLOAD 와 DOWNLOAD가 모두 가능하다.
MODULE POOL 은 DOWNLOAD 만 가능하다. (UPLOAD방법이 있지만 좀 복잡하다.)
Function을 관리하는 T-CODE는 ? (Function의 형태를 확인하는 방법을 익힌다.)
1. SE37 로 접속합니다.
2. POPUP_TO_CONFIRM_LOSS_OF_DATA 입력.
FUNCTION을 모아놓은 곳은 어디일까요? - FUNCTION GROUP
3. ATTRIBUTES 텝으로 들어가면 FUNCTION GROUP인 SP01을 확인 할 수 있다.
4. MAIN PROGRAM 버튼을 누른다.
DEBUG
버튼을 눌러준다.
IMPORT에서 OPTIONAL 에 기본 DEFAULT 값이 찍혀 있는 것을 볼 수 있다.
PASS VALUE CHECK일 경우 값을 변경할 수 있다.
이에 해당하는 값을 입력창에 넣어준 후 DEBUG버튼을 누른다.
POPUP이 뜨는걸 확인 할 수 있다.
" 이 POPUP은 데이터가 삭제될 수도 있을 경우에 실제 실행을 하겠느냐는 것을
FUNCTION으로 제공합니다.
Y , N 버튼을 눌러볼 수 있는데 ...
Y 를 누르면 EXPORT PARAMETERS 인 ANSWER에 J가 돌아오고
N 을 누르면 N 이 돌아오게 된다.
- SAP는 너무도 많은 FUNCTION이 만들어져 있으므로 잘 찾아서 사용해야 한다.
더블클릭의 효과:
FORWARD NAVIGATION . 이라고 불리는데 ... (없으면 만들고 있으면 이동.)
Function group - Function Module이 모여있는 집합체
INCLUDE 프로그램 : 프로그램이지만 자체적으로 실행을 할 수는 없다.
메인 프로그램에 붙어서만 사용 할 수 있다.
공통되는 프로그램을 모아놓는 영역 SUBROUTINE ( LOCAL 영역)
명명 규칙상 끝의 3자리가 TOP으로 끝나거나 UXX로 끝나는 INCLUDE Program의 의미
① INClUDE LSPO1
TOP . "명명 규칙 중
마지막 3자리 가 TOP로 끝남.
GLOBAL한 영역은 INCLUDE LSPO1TOP. " Global Data 과 같이 TOP으로 지정했더라.
② INCLUDE LSPO1
UXX . "3자리가 'UXX'로 끝남.
FUNCTION Module 들을 모아서 INCLUDE 하여 관리한다.
Function Module 설명
SE37에서나오는 Function Builder 에 대해서 확인해보도록 하자.
POPUP_TO_CONFIRM_LOSS_OF_DATA 를 기준으로 각 TAB을 이해하자면
Attribute TAB :
SP01 이라는 Function module 에 속한다는 것을 알 수 있다.
Import TAB : 6개의 Parameter를 사용 한다는 것을 알 수 있다.
Export TAB : Function Module이 실행 후
ANSER 이라는 1개의 결과를 내보내게 될 것이다.
CHANGING TAB : Reference 를 받아서 처리하야할 Parameter가 없다.
Tables TAB : InternalTable을 사용하지 않는다.
EXCEPTIONS 없슴
- 그림 없음.
SE38 에서는 APPLICATION TOOL BAR 에서 PATTERN버튼을 눌러서
Function 명을
POPUP_TO_CONFIRM_LOSS_OF_DATA 로 입력 한 후 Enter를 치게 되면 Editor창에 다음 코드를 자동으로
만들어 준다.
CALL FUNCTION 'POPUP_TO_CONFIRM_LOSS_OF_DATA'
EXPORTING
textline1 =
* TEXTLINE2 = ' '
titel =
* START_COLUMN = 25 * START_ROW = 6 * DEFAULTOPTION = 'N' * IMPORTING * ANSWER =
.
이 Templete 를 이용하여 알맞게 정의하게 되면 다음과 같은 코드가 만들어 진다.
DATA: re_answer. "결과를 받아야 하기 때문에 변수를 선언하고
CALL FUNCTION 'POPUP_TO_CONFIRM_LOSS_OF_DATA'
EXPORTING
textline1 = 'All entries will be lost'
textline2 = 'Do you want to cancel'
titel = 'Cancel'
start_column = 25
start_row = 6
defaultoption = 'N'
IMPORTING
answer = re_answer.
CASE re_answer.
WHEN 'J' .
WRITE: / 'Cancel...' .
WHEN OTHERS .
WRITE :/ 'No...' .
ENDCASE .
Debug모드시에...
OPEN SQL 과 WORK AREA ,INTERNAL TABLE의 사용 .
STRUCTURE 라는 것은 TEMPARY하게 사용 되게 된다.
WORK AREA는 하나의 구조화된 데이터만 가지므로 다중의 구조화된 데이터를 가져 올 때에는
INTERNAL TABLE 을 사용하게 된다.
다음은
WORK AREA 와
INTERNAL TABLE 을 이용해서 데이터를 담는 예제이다.
DATA : wa1 TYPE scarr,
it1 TYPE TABLE OF scarr.
SELECT SINGLE *
INTO wa1
FROM scarr
WHERE carrid = 'AA' .
APPEND wa1 TO it1.
SELECT SINGLE *
INTO wa1
FROM scarr
WHERE carrid = 'LH' .
APPEND wa1 TO it1.
SELECT SINGLE *
INTO wa1
FROM scarr
WHERE carrid = 'UA' .
APPEND wa1 TO it1.
LOOP AT it1 INTO wa1.
WRITE : / wa1-carrid,wa1-carrname.
CLEAR : wa1.
ENDLOOP .
WRITE : / wa1-carrid, wa1-carrname.
~ Work Area와 Internal Table 을 따로 작성하여 프로그래밍 하는 것을 '
명시적 ' 이라고 한다.
장점
1. CLASS를 사용할 때 변경 없이 적용할 수 있다.
2. 속도가 빠르다.
3. 웹딘 PRO를 사용하려면 이 방법을 사용해야 한다.
명시적인 이 방법을 권장사항 이라고 한다.
질문 : ':'가 들어간것도 있고 안 들어간것도 있는데 이는 어떤 차이인가요?
답변
':' 는 CHAND STATEMENT 라고 하여 여러번의 선언을 한 번에 할 수 있도록 해주는 효과가 있다.
':' 를 구문에 넣는 행동은 좋은 버릇이다. -> 나중에 변경에 용이하다.
* WORK AREA는 활용을 다 하고 난 후에는 꼭 CLEAR하자.
DEBUG MODE - 첫 번째 프로그램
1. ABAP EDITOR 에서 버니어켈리퍼스 버튼을 눌러서 실행한다.
2. 1번 프로그램에서는 WORK AREA와 INTERNAL TABLE이 불리되어있는 것을 확인 할 수 있다..
3. INTERNAL TABLE 인 IT1을 더블클릭 해보면 모자가 없다는 것이 확인된다.
4. WA1에 값이 들어간 후 INTERNAL TABLE IT1에 값이 들어가는 것을 볼 수 있다.
고로 WA1 을 임시기억 장소로 사용하고 INTERNAL TABLE에 값을 관리함을 알 수 있다.
두번째 예제 : INTERNAL TABLE 의 HEADER LINE을 이용함
DATA : itab TYPE TABLE OF scarr WITH HEADER LINE .
SELECT SINGLE *
INTO itab
FROM scarr
WHERE carrid = 'AA'.
APPEND itab.
SELECT SINGLE *
INTO itab
FROM scarr
WHERE carrid = 'LH'.
APPEND itab.
SELECT SINGLE *
INTO itab
FROM scarr
WHERE carrid = 'UA'.
APPEND itab.
LOOP AT itab.
WRITE : / itab-carrid,itab-carrname.
CLEAR : itab.
ENDLOOP .
WORK AREA 와
INTANAL TABLE 명이 같다.
INTERNAL TABLE 에
HEADER LINE 을 선언 한 것이다.
바꾸어 말하면
INTERNAL TABLE 에는 2종류가 있으며
하나는
HEADER 가
있는 INTERNAL TABLE
또 하나는
HEADER 가
없는 INTERNAL TABLE 이다
이로 인해 선언문에서의 작성이 간결해 질 수 있다.
DEBUG MODE - 두 번째 프로그램
TAB중에 FIELD 옆에 TABLE TAB 을 선택하면 현재 DEBUG를 선택한 INTERNAL TABLE에
모자 모양이 있는 것을 확인 할 수 있다.
이 모자모양의 HEADER를 이용하여 임시 저장을 해놓고 인터널 테이블로 값을 옮기는 것을
확인 할 수 있다.
장점 : 간결한 구문과 손쉬운 사용을 들수 있겠다.
사용자가 만든 FUNCTION을 호출하는 예제 프로그램
1. FUNCTION Group 만들기 .
2. FUNCTION Module 만들기
3. FUNCTION을 호출하는 PROGRAM 만들기
Function Group 만들기
1.
SE80 으로 접속한다.
2. SELECT BOX의 Function Group을 선택한다.
3. 아래에 생성하고 싶은 Function Group명을 입력한다. 'Z08_KDN_2 '
4. Enter 를 치면 Create Object POPUP창이 열린다.
5. Create Function Group 창에서 Short text를 입력하고 Save버튼을 누른다.
6. Create Object Directory Entry 라는 창이 나오는데 Package를 입력하라고 한다.
여기서는 Local Object를 선택 합니다.
7. Z08_KDN_2이 만들어 진 것을 볼 수 있습니다.
Function Module 만들기
1.
SE37 로 접속한다.
2. Function Module명을
Z08FM_KDN_2 으로 만들어 보겠습니다. 입력!
3. Create Function Module 창이 나옵니다. Function group 과 short text를 입력 하라고 합니다.
Function group에는 바로 전에 만들었던
Z08_KDN_2 를 입력하고 Short text에는 보기 좋은 이름을 입력하고
하단의 Save버튼을 눌러 줍니다.
4. Function module name이 만들어 졌다는 메시지가 나옵니다.
Function Builder 로 이동이 되어있습니다.
5. Import에는 'Z08FM_KDN_3' Function Module에서 받아서 사용하게 되는 Parameter를 선언합니다.
다음과 같이 입력합니다.
( Parameter Name :
IM_CARRID , Type :
TYPE , Associated Type :
SPFLI-CARRID )
6. INTERNAL TABLE에 결과를 돌려 받을 것이라 Tables Tab에서 지정 하게 됩니다.
( Parameter Name :
ITAB1 , Type :
TYPE , Associated Type :
SPFLI-CARRID )
7. Source code 를 입력해 줍니다.
FUNCTION z08fm_kdn_1.
*"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(IM_CARRID) *" TABLES *" ITAB1 STRUCTURE SPFLI OPTIONAL *" ITAB2 TYPE Z08_T_KDN_SPFLI OPTIONAL *"----------------------------------------------------------------------
SELECT *
FROM spfli
INTO TABL E itab1
WHERE carrid = im_carrid.
itab2[] = itab1[]. "BODY DATA를 넘기는 ...
ENDFUNCTION .
Program 에서 만들어 놓은 function 호출하기.
방법 1.
1.
SE38 에서 수정 모드로 Z08KDN_20090923_1를 열어 놓는다.
2.
pattern버튼 을 누르고 '
Z08FM_KDN_2' 를 입력하여 준다.
3. Editor에
Call Function Code 가 나오면 다음과 같이 작성하여 줍니다.
DATA : itab TYPE TABLE OF spfli WITH HEADER LINE .
PARAMETERS : pa_carr TYPE spfli-carrid. "user가 1000화면으로 부터 입력을 받게 하겠다.
CALL FUNCTION 'Z08FM_KDN_2'
EXPORTING
im_carrid = pa_carr
TABLES
itab1 = itab.
* itab2 =
방법 2.
1.
SE80 에서 Z08KDN_20090923_1(작업을 원하는 프로그램) 를 수정 모드로 열어 놓는다.
2. 왼쪽 창에 Function group 을 선택하고
Z08_KDN_2 그룹을 선택한다.
3. 왼쪽 밑의 창에
Z08FM_KDN_2 를 끌어다가 Editor 에 옮겨 놓으면 pattern 버튼과 똑같은 효과가 나온다.
Standard를 이용하여 SAP ABAP LIST View 사용해 보기
ex>
REUSE_ALV_LIST_DISPLAY ,
REUSE_ALV_GRID_DISPLAY
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_structure_name = 'SPFLI'
TABLES
t_outtab = itab.
Program 을 작성하여 확인해 본다.
DATA : itab TYPE TABLE OF spfli WITH HEADER LINE .
PARAMETERS : pa_carr TYPE spfli-carrid. "user가 1000화면으로 부터 입력을 받게 하겠다 .
CALL FUNCTION 'Z08FM_KDN_1'
EXPORTING
im_carrid = pa_carr
TABLES
itab1 = itab.
* itab2 =
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_structure_name = 'SPFLI'
TABLES
t_outtab = itab.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF .
더보기 접기
Standard 를 이용하면 Mail 을 보내거나 Excel 로 다운을 받는 등의 기본적인 기능들을
이용할 수 있다.
접기
ABAP Dictionary :
TRANSPARENT(투명하다.?) . TABLE
DATABASE 영역과 DICTIONARY 영역과 데이터가 일치한다.
DATABASE에 릴레이션이 없다.
APPLICATION 에 릴레이션이 걸려 있으며 (
CTRL +
SHIFT +
F11 ) 버튼을 눌러 릴레이션을 확인 할 수 있다.
STRUTCTURE 와 TRANSP. TABLE 의 차이
STRUTCTURE 에는 MANDT 컬럼이 없다는 것을 알 수 있다.
Strutcture 만들기.
se11창을 2개 띄웁니다.
z08_s_kdn_1 이라는 Structure에 복사해 보도록 한다.
복사하는 방법 설명:
각 테이블 들에서 필요한 Feild를
ctrl + 마우스 오른쪽 버튼 으로 선택 후
복사
sbook :
CARRID, CONNID, FLDATE , BOOKID
sflight : CARRID, CONNID, FLDATE /
SEATSMAX , SEATSOCC
spfli : CARRID, CONNID /
CTIYFROM,CITYTO
scarr : CARRID,
CARRNAME
완료가 되었으면 활성화 버튼을 눌러준다.
Copying Structure Copy
* Strutcture 끼리 값을 복사 한다.
DATA : wa1 TYPE spfli,
wa2 TYPE z08_s_kdn_1.
SELECT SINGLE *
FROM spfli
INTO wa1.
MOVE-CORRESPONDING wa1 TO wa2.
WRITE : / wa2-carrid, wa2-connid, wa2-cityfrom, wa2-cityto.
CORRESPONDING ㅋㅋㅋ 보충 하기...
TABLE TYPE != TABLE
Internal Table 은 다음과 같고
LINE TYPE = STRUTCTURE TYPE = ROW TYPE
DB TABLE 처럼 키도 줄 수 있다.
김샘 말씀.
INTERNAL TABLE 에서의 Index(인덱스)는...
몇번째 라인이냐? 하는 것을 의미한다.
Internal Table 에 3가지 종류
Standard , Sorted , Hashed
(메모리의 영역이다.)
DB Table 의 3가지 종류
Transparent Table , Pool(ed) Table , Cluster Table
(물리 적인 영역이다.)
INTERNAL TABLE 에 TYPE과 특성
Attributes and Use of the Table Types
이제부터 나오는 내용은 굉장히 중요하다고 합니다.
Index Table Hashed Table T(standard) S(sorted) H(Hashed) 주로 Index사용 주로 Key사용 Key만 사용 중복만 허락 중복O | 중복X 중복X DB로 부터 DATA를 가져올 때 자동 SORT를 함.(KEY별로)그런데 만약 EDITOR 상에서 SORT라는 KEYWORD를 쓰면 Syntax Error를 일으킵니다. 자체가 sort가 되기 때문에 강제로 SORT를 할수 없다.
Key와 상관관계가 아주 높습니다. Index 는 아님
질문 : T(Standard Table) 에서 중복을 허용 하는 것이 안전 할까요... 허용하지 않는 것이 안전 할까요?
Data 무결성을 생각하고 중복이 허용되지 않는다고 말하였다면 ...
현재 이야기 하고 있는 것은 INTERNAL TABLE 이기 때문에 MEMORY에서 사용하는 것이기 때문에 데이터의 무결성을 확인 할 필요는 없다 용도에 맞게 화면에 뿌려주고 ... 등등등.. 이 가능하다.
그림 1-4
* 툴을 이용하여 Table의 Type과 Key설정들을 변경할 수 있다.
Initialization and Access TAB을 이용하여 Access Type을 변경 할 수 있다.
Key TAB을 이용하면 unique, non-unique 등등의 설정을 할 수 있다.
질문 : global type 3가지 무엇이 있죠?
data element , strutcture type , table type
* 아마도 자주 질문을 던지는건 중요한 듯 싶어서 그냥 적어봄.
*
코딩을 이용하여 standard , sorted , hashed 테이블을 만드는 방법
DATA : it1 TYPE TABLE OF spfli.
DATA : it2 TYPE STANDARD TABLE OF spfli
WITH NON-UNIQUE KEY carrid connid.
DATA : it3 TYPE SORTED TABLE OF spfli
WITH UNIQUE KEY carrid connid.
DATA : it4 TYPE SORTED TABLE OF spfli
WITH NON-UNIQUE KEY carrid connid.
DATA : it5 TYPE HASHED TABLE OF spfli
WITH UNIQUE KEY carrid connid.
BREAK-POINT .
질문 : 원칙상 Hashed Table은 sorting을 해야 할까요 하지 말아야 할까요?
-> 해야한다.(성능상 영향이 있다고 함.)
* Index를 기준으로 조회하는 방식.
READ TABLE it1 INTO wa1 INDEX 5.
결과 : index기준으로 it1의 데이터를 1~5까지 담는다.
*
Key를 기준으로 조회하는 방식 .
①
READ TABLE it1 INTO wa1
WITH TABLE KEY
mandt = sy-mandt
carrid = 'LH'
connid = '0400'.
②
READ TABLE it1 INTO wa1
WITH KEY
carrid = 'LH'
connid = '0400'.
① table key로 작성하면 Dictionary상의 해당
TABLE에 정의되어있는 key 를 정확히 기입 하여야 한다.
② 정의되어있는 키 형식과는 다른 방식으로 사용 하고 싶을 때는 WITH TABLE KEY -> WITH KEY로 변경하면 된다.
Data Browser 설정하기
현재 보여지는 sorting 은 프로그램이 해준 것입니다.
menu -> setting -> format_list-> choose field 선택
menu -> setting -> user parameter ->
Output list 에서는 ALV Grid , ALV 를 선택 할 수 있다.
Keyword 에서는 db Field Name 대신에 field Label을 선택하여 의미있는 정보를 파악할 수 있다.
시험문제: Hashed Table은 Sorted Table 처럼 이미 Sorting이 되어있기 때문에 Sorting할 필요가 없다!
-> false
Sorting 관련하여 생략하면
Default 로
ASCENDING 이 적용된다..
초기화 명령
REFLESH 와
FREE 명령은 INTERNAL TABLE 을 초기화 시켜주는 기능이 있다.
CLEAR : ITAB. HEADER 만 초기화 됨 CLEAR : ITAB[] . BODY가 초기화 됨 REFRESH : ITAB. BODY가 초기화 됨 FREE ITAB . MEMORY 에 있는 것들을 초기화함
Tip .! HASHED TABLE 은 INSERT가 APPEND 역할을 합니다.