분류 전체보기 (122)
공지사항 (3)
주저리 주저리 (26)
Ubuntu (3)
개발관련 (37)
개발이야기 (6)
Language (20)
Framework (5)
Pattern (2)
DataBase (4)
Server (4)
Book (9)
스터디 (0)
Eclipse  자바  oracle  ubuntu netbook remix  Head First Software Development  mylyn  db connection  HFSD  STRUTS2  다짐 
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
+ dazzi님 블로그
+ 온 오프 믹스! (모임,세미…
+ kenu blog
+ OKJSP: 사는 얘기
+ 정호님 블로그
+ 존경하는회수형님
+ 자바지기님 블로그
+ 루비나라 출입구
+ 은정이누나 블롯
+ Total :
+ Today :
+ Yesterday :
  

 

 

 

ABAP 3일차
+   [Language/ABAP]   |  2009. 9. 23. 14:28  


(오전 시간)

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  menuutility 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 LSPO1TOP. "명명 규칙 중 마지막 3자리가 TOP로 끝남.

GLOBAL한 영역은 INCLUDE LSPO1TOP. " Global Data 과 같이 TOP으로 지정했더라.

INCLUDE LSPO1UXX .  "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 AREAINTERNAL 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 AREAINTANAL TABLE명이 같다.

INTERNAL TABLEHEADER 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 TABLE 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.




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 이 적용된다..


초기화 명령


REFLESHFREE 명령은  INTERNAL TABLE 을 초기화 시켜주는 기능이 있다.

CLEAR: ITAB. HEADER 만 초기화 됨
CLEAR: ITAB[]. BODY가 초기화 됨
REFRESH: ITAB. BODY가 초기화 됨
FREE ITAB. MEMORY 에 있는 것들을 초기화함

Tip.!    HASHED TABLE 은 INSERT가 APPEND 역할을 합니다.






 
 
        

별책부록's Blog is powered by Daum