|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/14 15:18
|
|
2009년 10월 14일
role 은
t-code : pfcg 로 접근하여 설정한다.
Table enhancements
append struture 적용시 주의해야 할 3가지.
1. POOL(ED) / CLUSTER TABLE 에 APPEND 할 수 없다. 2. YY*/ZZ* 의 필드명으로 시작해야 한다.
3. LCHR/LRAW 의 필드는 제일 마지막에 위치해야할 필드이므로,
이들의 DATA TYPE 을 포함한 Structure 에는 APPEND 할 수 없다.
za(zappend struture ), zy 로 자동으로 붙는다.
Append structure
se11 -> spfli -> append struture 버튼 클릭 후 적용하면 됨
(두 번 이상 할 수 있음.)
* table 입장에서는 Append structure 를 여러개 가질수 있고 append structure 는 한개의 Table 에만 적용 될 수 있다.
DATA: wa1 TYPE spfli,
wa1 TYPE
se11 -> pa0001 ->맨 아래 있고 더블클릭 하면 열린다. component 에 z* 으로 시작하는 component 명을 줄 수 있다.''
Text Enhancements : 문제에 안 나온다.
help 창 (도움말) :. Data Element 가 document 를 가지고 있다.
data Element F1 : Doc
Label(field)
built-in-type -> predefined Type (7.0)
직접 DATA TYPE , DATA LENGTH , DECIMAL PLACES
Search Help 할 수 있다.
Domain 실질적인 ~ 을 가지고 있다.
Fixed value.
Value Talbe (check table) 처리 -> Relationship
T-Code CMOD (CUSTOMER ), SMOD (SAP MODIFY)
실습 예제를 합니다.
SAPBC425_FLIGHT08
/n bc425_##
로 접근하면 자기 T-Code가 있을꺼예요
요청사항 : 예매를 하는데 미래의 날짜로 입력을 받아야 합니다. 그리하여
과거의 날짜를 선택하면 경고 Message 가 나오도록 변경하고 싶습니다.
menu 의 Sytem -> status 로 접속하여... -> program명을 확인 한 후
Double Click 하면 SAPBC425_FLIGHT##로 접속하여...
고치려고 하면
Access key 를 이용해야 접속할 수 있다 고 나온다.
CMOD -> Z08_kdn-> 저장~!
/nse84 로 접속 : repository infomation System 으로 접속 하는데
Enhancements -> Customer Exits -> Enhancements -> 상단의 + 버튼을 열고 ->
additional selections block 에 Component name 에 *SAPBC425_FLIGHT08* 라고 입력
-> F8 (실행)
*SAPBC425_FLIGHT08* 을 기준으로 3개가 나오는데
SBC08E01 은 Function Module Exit
SBC08E02 은 Menu Exit
SBC08E03 은 Screen Exit
이다 .
Exit Name 을 카피해 놓는다. ( SBC08E01)
첫 번째 : Function Exits
CMOD 창에서 Enhancements Assignment 선택 !
function module 이름을 double clkck 하여 EXIT_SAPBC425_FLIGHT08_001 로 들어간다.
Include 안으로 다시 Double clkck 하여 들어가서
IF flight-fldate < sy-datum.
MESSAGE w011(bc425) WITH sy-datum.
ENDIF.
라고 코딩을 넣어준다.
* 자기 테이블을 참조한 flight 에 대한녀석이 들어있는 것을 확인한다.
활성화 해준다.(불을 붙여요) 이러면 적용이 된거랍니다.
불을 끄고 BC425_08 에 접근하여 적용과 비적용에 대해서 확인을 하면 된다.
2번째 ... Menu Exit
1. components 선택
2. change 로 접근
3. function exit 의 명칭을 더블클릭 하고 bookings 라고 입력해 준후
Local 로 저장한다.
4. include ZXBC425G08U02 를 double click 하여 다음과 같이 코딩하여 준다.
*&---------------------------------------------------------------------*
*& Include ZXBC425G08U02
*&---------------------------------------------------------------------*
SUBMIT sapbc425_booking_08
WITH so_car = flight-carrid
WITH so_con = flight-connid
WITH so_fld = flight-fldate AND RETURN.
5. 활성화 버튼을 누르고...
6. /nbc425_08 로 접근한다.
7. 조회 조건을 넣고 F7 (Display)
8. Menu의 Goto -> Display Bookings 를 누르면...
9. 방금 만든 프로그램을 확인 할 수 있다.
3번째 Screen Exit
1. project 를 z08_kdn 으로 만든다.
2. enhancements Assignment 를 선택 하여 create 버튼 를 눌러준다.
3. SBC08E03 를 입력하고 저장 한다.
4. F3(뒤로)으로 CMOD 화면으로 돌아온 후... component 를 선택 후 change 버튼 를 눌러준다.
5. screen exit 에 있는 SAPBC425_FLIGHT08 을 더블 클릭 한다.
6. lay out 을 눌러서 만들기 시작..~
7. F6 (Dictionary / Program field Window) 를 클릭 한다.
8. SFLIGHT 를 TABLE 명으로 입력 해준 후 ENTER
9. 아무 필드나 불러서 이름을 변경한다.
10. logic으로 돌아가서 F3 을 누른후~
11. function module 에 접근(double click)하여 아래와 같이 코딩한다.
*&---------------------------------------------------------------------*
*& Include ZXBC425G08U03
*&---------------------------------------------------------------------* seatsfree = flight-seatsmax - flight-seatsocc.
12. seatsfree 을 double click 하여 include top 으로 접근한다.
-> 다르게 접근 할 수 있는 방법이 있지만 쉬운 네비게이션으로 되어있지 않다.
13. ZXBC425G08TOP 으로 들어가게 되면 seatsfree 를 아래와 같이 선언하여 준다.
*----------------------------------------------------------------------*
***INCLUDE ZXBC425G08TOP .
*----------------------------------------------------------------------*
DATA seatsfree TYPE sflight08-seatsocc.
14. F3으로 뒤로 돌아간 후 활성화 시킨다.
15. /nbc425_08 화면에서 조회를 하면 Free Seats이 생성된 것을 확인 할 수 있다.
academy0 - 으로 미리 다 만들어져 있어서 실습 불가 =_=;;
김셈 정리 내용**************************************************
standard program 실행
menu*status)
program명 copy
SE84
Enhancements
* Program명 paste *
실행
Exit name(copy)
CMOD
project 명 작성
Assignment 시 (Exit Name ) 넣어주기.
Function Module 적용
활성화... 적용!
*********************************************** 김셈 정리 내용
Unit 4 : Business Add-Ins
책에는 빠진 내용이 있으므로 ... 프린트를 나누어 드리겠습니다.(오후)
FI 용으로 개발 된거랍니다
BTEs (Business Transaction Event service)- enhancements 임
Module = FI
2 가지 (InterFace) - P/S Interface : SAP ----> Add-on (Multiole)
Process I/F :SAP ----> Add-on (single)
BTE 는 client 에 종속 적이다.
BAdl 에 대해서 ...
최신의 기술...
OOP의 적용.. 및 .. 등등등..
잘 해 놓으면 Web Den Pro 도 사용하기 어렵지 않다.
이제부터 생성도 해보고 ... 적용도 해보자.
왼쪽이 basic 오른쪽이 customer 가운데가 partner
안 보여드린거 같은데
*****************************************************
/nsqvi : ㅋㅋㅋ
quickView : Initial Screen
(z00_test_1)
*****************************************************
이런 것도 있다.
interface 로 잠자는 메소드를 사용하는데 이때 Menu Exit 을 쓸꺼냐.. function module
exit Name 을 파악하는 과정
************************************************************
find/replace
find 에 call customer 으로 검색한다. - ba
***************************************************************
1. 프로그램 안에 : cl_exithandler 를 검색하여 찾으면 된다. - page 89
2. reference Double Click.
3. if_ex_ 를 제외한 나머지 이름이 -> BAdI 명(찾을 수 있다.)
4. (자 이제 인터페이스를 찾아주기만 하면 됩니다.~) 'badi_book08'를 복사하여 SE18 로 이동한다.
5. BAdI Name을 선택 후 badi_book08 을 붙여 넣기 하시고 display 버튼을 눌러 준다.
6. implimentation (SE19)로 접근 하면 된다 ... 여기서는 menu의 implement -> create 를 눌러서 접근한다.
7. Implementation Name 에 zim_08_kdn 를 눌러주고 Enter
8. Implementation Short Text에 Implementation Short Text 를 넣어주고...
9. output 으로 double click 하여 method 로 접속 한다.
10 . 다음과 같이 코딩을 한다.
METHOD if_ex_badi_book08~output.
DATA: name TYPE s_custname.
SELECT SINGLE name
FROM scustom
INTO name
WHERE id EQ i_booking-customid.
WRITE: / name.
ENDMETHOD.
11. SE38 에서 SAPBC425_BOOKING_08로 접속 하여 확인을 한다.
12 . 사용자 명이 출력 되지만 라인이 늘어나야 되는 것을 확인 할 수 있다.
13. 다시 SE18 화면에서 menu의 implement 의 create 혹은 change 로 접속 한 화면 (SE19)에서
14 . interface TAB에 if_ex_badi_book08~change_vline 를 double clkck 하여 접속 한 뒤
아래와 같이 코딩한다.
METHOD if_ex_badi_book08~change_vline.
c_pos = c_pos + 25.
ENDMETHOD.
15. 불을 붙여 준다.-> SE38 의 SAPBC425_BOOKING_08 로 접속 하여 다시 확인한다
.
브라보.... 이히~
SE38로 접속 하여...
sapbc425_booking_08 을 입력..
실행하면..
이렇게 사용자 정의9 그림 처럼 나온다.
사용자가 이때 "이름"을 더 출력할 수 있게 요청하였다.
1-1 Standard 에서는 안 된다. 라고 끊는다.
1-2 Enhancements를 고려하라.
1-1-1 : edit -> find/ replace -> call customer ->d없네?
1-1-2 edit -> find / replace-> cl_exit
instance 의 type 이 any 인 것을 확인한다.
알고보니 exit_book 은 referance 이다.
if_ex_badi_book08 <- 이름을 보면 interface임을 알 수 있다.
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/131
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/13 16:44
|
10월 13일..
1. SINGLETON
보통 Singleton pattern 시스템에 객체를 오직 1개만 사용하기 위하여 만든다.
SE24 -> CL_SINGLETON
사용 이유 One Instance possible
Singleton의 대표적인 부분은 자바에서의 Servlet 객체일듯 하다. 1개만 ... 해서 모두 빌려쓰는...
2. Friend - FriendShip의 관계......
Private 인 객체나 메소드에도 Friend 관계가 정의되면 접근 할 수 있게 된다.
Visual basic 에 Friend 라는 접근자가 있는걸 본적이 있다 사용해 본적은 없지만...
그 언어에서도 사용을 지양하라고 봤던 것 같다.
A 운전자는 자기 자동차를 운전할 수 있다.
다른 사람들은 A운전자의 자동차를 운전할 수 없다.
근데 정비기사님 께서는 A운전자의 자동사를 시운전 할 수 있다는.. 그런 이야기를 봤었다.
하지만 실제 객체들의 관계를 정의할때 모호해 질 위험이 아주 커 보인다....
3. 예외 try ~ endtry
exception class 는
zcx 로 시작하게 만들수 있다.
예외가 나도록 실행하면 error 화면에 exception class 가 표시 되므로 이를 이용해서 사용 하는 방법도 있다.
사실 OOP로 프로그램을 작성한다면 .. Error로 인한 Exception 이 발생하기 전에 미리 처리를 해 두는 것이
옳은 판단일 것 같다. ->아마도 Exception에 관련된 예제들을 따로 찾아봐야 할 것 같다.(잊지 말고 정리하기)
4. shared objects
우리가 이미 배웠던 내용이라고 한다.
프로그램에서 아주 빈번히 발생하는 공동사용 구간에 대한 접근 및 사용이다.
다수의 유저가 공유해야하고.. 다수의 유저는 변경된 사항에 대해서 알아챌 수 있어야 하므로...
한 메모리 영역을 모두가 참조하게 되면.. 그 다수의 유저중 누군가가 정보를 바꾸어도 다수의 유저들이 모두
공유 할 수 있을 것이다.
보통 System 의 properties 정보 등을 공통 영역의 Properties 파일로 만들어 WAS가 구동될 때 Singleton으로
올려놓았던 것이 생각난다.
다시 ABAP으로...
T-code
shma - memory 에 area를 만들수 있다.
shmm - memory 를 모니터링 할 수 있습니다.
shma 에서 만들어보자..
/nshma 로 접근.
1.'zcl08_kdn_area ' 라는 이름을 사용 description 도 채워준 후 create 버튼을 눌러준다.
2. Basic Properties에 Root Class 에 "ZCL08_KDN_ROOT " 라고 적어준다.
3. Client-Specific Area를 클릭해준다.
4. SE24의 "ZCL08_KDN_ROOT" 로 이동이 되었다.
5. Properties 에 General Data 에 "Shared Memory-Enabled" 를 클릭해준다.
6. Attribute 에 r_cat 를 associated type : ZCL08_KDN_CATALOGUE 인 instance 로 지정해준다.
7. ZCL08_KDN_CATALOGUE 를 DOUBLE CLICK 하여 SE24의 ZCL08_KDN_CATALOGUE 지정 화면으로 이동한다.
8. Properties 에 General Data 에 "Shared Memory-Enabled" 를 클릭해준다.
9. attribute 에 IT_SPFLI , instance , private , SPFLI_TAB 으로 지정해준다.
10. methods 에 set_data 와 get_data를 지정해 준다.
11. set_data ~
METHOD set_data.
SELECT * FROM spfli INTO TABLE it_spfli .
ENDMETHOD.
12. get_data
METHOD get_data.
DATA: wa_spfli TYPE spfli.
LOOP AT it_spfli INTO wa_spfli WHERE carrid = im_carrid.
WRITE: / wa_spfli-carrid, wa_spfli-connid,
wa_spfli-cityfrom, wa_spfli-cityto .
ENDLOOP.
ENDMETHOD.
13. parameter 지정 : IM_CARRID , importing , SPFLI-CARRID
14. zcl08_kdn_catalogue - 활성화 후 F3 -> zcl08_kdn_root - 활성화 후 F3 -> shma 화면에서 저장 버튼을 누른 후 F3 을 누른다.
15. ctrl+ F3 (genarate area class) 를 눌러준다.
16. SE38의 프로그램으로 접근...
*&---------------------------------------------------------------------*
*& Report Z08_KDN_OOP15
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08_kdn_oop15.
DATA: r_handle TYPE REF TO zcl08_kdn_area.
DATA: r_root TYPE REF TO zcl08_kdn_root,
r_catalogue TYPE REF TO zcl08_kdn_catalogue.
*TRY.
CALL METHOD zcl08_kdn_area=>attach_for_write
* EXPORTING
* CLIENT =
* INST_NAME = CL_SHM_AREA=>DEFAULT_INSTANCE
* ATTACH_MODE = CL_SHM_AREA=>ATTACH_MODE_DEFAULT
* WAIT_TIME = 0
RECEIVING
handle = r_handle.
CREATE OBJECT r_root AREA HANDLE r_handle.
CREATE OBJECT r_catalogue AREA HANDLE r_handle.
r_root->r_cat = r_catalogue.
r_handle->set_root( r_root ).
r_handle->root->r_cat->set_data( ).
r_handle->detach_commit( ).
* CATCH CX_SHM_EXCLUSIVE_LOCK_ACTIVE .
* CATCH CX_SHM_VERSION_LIMIT_EXCEEDED .
* CATCH CX_SHM_CHANGE_LOCK_ACTIVE .
* CATCH CX_SHM_PARAMETER_ERROR .
* CATCH CX_SHM_PENDING_LOCK_REMOVED .
*ENDTRY.
이렇게 만들어 주고 활성화.
17. t-code "SHMM " 로 접근하여 자신이 작성한 Area 가 올라가 있는지 확인하기.
(오후) page 323
프로그램을 만들어 봅니다.
SE38 에 접속 후 'Z08_KDN_OOP_WRITE' CREATE해줍니다.
오전에는 attach 를 해보았습니다.
이제 읽어볼텐데...
Z08_KDN_OOP_read
DATA : r_handle TYPE REF TO zcl08_kdn_area.
PARAMETERS: pa_carr TYPE spfli-carrid.
*TRY.
CALL METHOD zcl08_kdn_area=>attach_for_read
* EXPORTING
* CLIENT =
* INST_NAME = CL_SHM_AREA=>DEFAULT_INSTANCE
RECEIVING
handle = r_handle.
r_handle->root->r_cat->get_data( pa_carr ).
r_handle->detach( ).
* CATCH CX_SHM_INCONSISTENT .
* CATCH CX_SHM_NO_ACTIVE_VERSION .
* CATCH CX_SHM_READ_LOCK_ACTIVE .
* CATCH CX_SHM_EXCLUSIVE_LOCK_ACTIVE .
* CATCH CX_SHM_PARAMETER_ERROR .
* CATCH CX_SHM_CHANGE_LOCK_ACTIVE .
*ENDTRY.
fiend Symbols. - 대리자 역할을 한다.
REPORT z08_kdn_oop16.
DATA: int1 TYPE i VALUE 17.
FIELD-SYMBOLS: <int1> TYPE i.
ASSIGN int1 TO <int1>.
<int1> = <int1> + 1.
WRITE: / int1, <int1>.
CASTING SYMBOLS
예제 2
REPORT z08_kdn_oop16.
TYPES: BEGIN OF st_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF st_date.
FIELD-SYMBOLS : <fs> TYPE st_date.
<fs> = sy-datum.
WRITE : / <fs>.
sy-datum 은 field 이고 <fs> 는 구조체(Struture) 이기 때문에 ERROR 가 남...
REPORT z08_kdn_oop16.
TYPES: BEGIN OF st_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF st_date.
FIELD-SYMBOLS : <fs> TYPE st_date.
ASSIGN SY-DATUM TO <FS>.
"앞은 날짜 이고 뒤는 구조체이다. 이렇게 하면 에러가 나고
ASSIGN SY-DATUM TO <FS> CASTING.
"이렇게 하면 eRROR 이 나지 않는다.
WRITE : / <fs>.
예2 > 실제 코딩에선 이처럼 많이 쓰인다.
TYPES: BEGIN OF st_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF st_date.
FIELD-SYMBOLS : <fs>, <fs_comp>.
ASSIGN sy-datum TO <fs> CASTING TYPE st_date.
"앞은 날짜 이고 뒤는 구조체이다ㅣ.
ASSIGN COMPONENT 1 OF STRUCTURE <fs> TO <fs_comp>.
WRITE : / <fs_comp>.
예3 번째 - 원래는 이렇게 사용 하면 안된다.
DATA: int1 TYPE i VALUE 17.
DATA: ref1 TYPE REF TO i.
GET REFERENCE OF int1 INTO ref1.
" INT1= DATAOBJECT REF1 = REFRANCE
ref1->* = ref1->* + 1.
WRITE: / int1, ref1->*.
예4 원래는 ref 를 바로 사용 하시는게 아니라 Symbols 를 넘겨서 사용 해야한다.
DATA: int1 TYPE i VALUE 17.
DATA: ref1 TYPE REF TO i.
FIELD-SYMBOLS: <fs> TYPE i.
GET REFERENCE OF int1 INTO ref1.
" INT1= DATAOBJECT REF1 = REFRANCE
GET REFERENCE OF int1 INTO ref1.
ASSIGN ref1->* TO <fs>.
<fs> = <fs> + 1.
WRITE: / int1, <fs>.
이건 예제이기 때문에 이렇게 사용 합니다.
Assigned 인지 Bound 인지...
IF <fs> IS ASSIGNED.
WRITE: / 'Yes'.
ELSE.
WRITE: / 'No...'.
ENDIF.
IF ref1 IS BOUND.
WRITE: / 'Yes'.
ELSE.
WRITE: / 'No...'.
ENDIF.
자기 자신을 참조할 수도 있다.
DATA: ref1 TYPE REF TO i.
CREATE DATA ref1.
ref1->* = 17.
WRITE: / ref1->*.
그럼 Symbol 은 안되느냐?
->이건 못 적었네요@_@;;
그럼 형 변환은 어찌 될가요?
DATA: ref1 TYPE REF TO data.
create DATA ref1 type spfli.
"이런 식으로 해볼수 있고~
create DATA ref1 type i.
"이런 식으로 요런식으로도 해볼 수 있습니다.
아마도 Abap에서의 data형은 Java에서의 Object 형 처럼 최상위 객체인가 봅니다.
이제는 조금 더 바꿔보자.
형변환을 하게 되는 예제.
DATA: ref1 TYPE REF TO data.
PARAMETERS : my_type(10).
CREATE DATA ref1 TYPE (my_type). " ( ) 안에 감싸면 value 를 넘겨주게 된다.
BREAK-POINT.
이렇게 상위 객체로 선언하고 하위의 객체로 적용하는 방식을 사용하면 추후 유지보수에 엄청나게 영향을 주겠죠...
직접 참조와 간접 참조...
동적 프로그래밍 예제
REPORT z08_kdn_oop17.
DATA: ref_itab TYPE REF TO data,
ref_wa TYPE REF TO data.
" refrence 의 특징이 주소만 가지고 있기 때문에 하나하나 쪼개져 있는
"필드 에 대한 접근이 불가능 하다 그래서 필드 심볼을 써라.
FIELD-SYMBOLS: <fs_itab> TYPE ANY TABLE, "기억하세요 ANY TABLE
<fs_wa> TYPE ANY,
<fs_comp> TYPE ANY.
PARAMETERS pa_tab TYPE dd02l-tabname DEFAULT 'SPFLI'.
START-OF-SELECTION.
CREATE DATA ref_itab TYPE STANDARD TABLE OF (pa_tab)
WITH NON-UNIQUE DEFAULT KEY.
ASSIGN ref_itab->* TO <fs_itab>." field Symbol 은 Self-Instantiate X
SELECT *
FROM (pa_tab)
INTO TABLE <fs_itab>
UP TO 100 ROWS.
CREATE DATA ref_wa LIKE LINE OF <fs_itab>.
ASSIGN ref_wa->* TO <fs_wa>.
LOOP AT <fs_itab> INTO <fs_wa>.
"assigning <fs_wa> 로 바꿔 주고 Create data ref_wa 를 삭제해도 됨
DO .
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_wa> TO <fs_comp>.
IF sy-subrc NE 0.
NEW-LINE.
EXIT.
ENDIF.
WRITE <fs_comp>.
ENDDO.
ENDLOOP.
*SE16처럼 동적으로 프로그램을 만드는 예제입니다.
*&---------------------------------------------------------------------*
*& Report Z08_KDN_OOP18
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08_kdn_oop18.
DATA: int TYPE i VALUE 15,
date TYPE d VALUE '20040101'.
DATA : ref_int TYPE REF TO i,
ref_date TYPE REF TO d,
ref_gen TYPE REF TO data.
GET REFERENCE OF int INTO ref_int.
ref_gen = ref_int.
WRITE: / ref_int->*.
ref_int ?= ref_gen.
WRITE: / ref_int->*.
GET REFERENCE OF date INTO ref_date.
ref_gen = ref_date.
TRY .
ref_int ?= ref_gen.
CATCH cx_sy_move_cast_error.
MESSAGE i002(z08_kdn) WITH 'ref_gen' .
ENDTRY.
WRITE: / ref_int->*.
**
TRY 부분에서 EXCEPTION 이 발생하게 되는데...
ref_gen. 은 DATE 타입이 되어버려서 ref_int 의 INTEGER 형으로 변환이 안 되기 때문입니다.
*&---------------------------------------------------------------------*
*& Report Z08_KDN_OOP18
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08_kdn_oop18.
DATA: int TYPE i VALUE 15,
date TYPE d VALUE '20040101'.
DATA : ref_int TYPE REF TO i,
ref_date TYPE REF TO d,
ref_gen TYPE REF TO data.
GET REFERENCE OF int INTO ref_int.
ref_gen = ref_int.
WRITE: / ref_int->*.
ref_int ?= ref_gen.
WRITE: / ref_int->*.
GET REFERENCE OF date INTO ref_date.
ref_gen = ref_date.
TRY .
ref_int ?= ref_gen.
CATCH cx_sy_move_cast_error.
MESSAGE i002(z08_kdn) WITH 'ref_gen' .
ENDTRY.
WRITE: / ref_int->*.
Runtime type services
RTTS Inheritance
SE80 으로 가서
DATA: gs TYPE spfli,
go_descr TYPE REF TO cl_abap_structdescr,
gs_comp TYPE abap_compdescr.
go_descr ?= cl_abap_typedescr=>describe_by_data( gs ).
LOOP AT go_descr->components INTO gs_comp.
WRITE: / gs_comp-name, gs_comp-type_kind,
gs_comp-length.
ENDLOOP.
RUNTIME 중에 CLASS 의 NAME 을 알아 내어 보아요.
REPORT z08_kdn_oop20.
DATA: go_vehicle TYPE REF TO zcl08_kdn_vehicle,
go_truck TYPE REF TO zcl08_kdn_truck,
go_descr TYPE REF TO cl_abap_classdescr.
DATA: find_name TYPE string.
CREATE OBJECT go_vehicle.
CREATE OBJECT go_truck.
go_descr ?= cl_abap_typedescr=>describe_by_object_ref( go_vehicle ).
find_name = go_descr->get_relative_name( ).
WRITE: / find_name.
* GENERATING AN INTERNAL TABLE WITH A DYNAMICALLY CREATE TYPE.
정말 쓰지 않는 방식이다.
4주차 2강..
적용 방식중에
MODIFICATION 은 사용하지 말기~!
enhancement = 추천 추천의 ( ADD ON ) 방식이다.
enhancement [inhǽnsmənt, en-] [-hɑ́ːns-]
1. U,C (가격·매력·가치 등의) 상승, 등귀;향상, 증대
8문제정도 나올듯 ㅋㅋㅋ
2PAGE
*enhancement
1. ABAP Dictionary ┌ TABLE ENHANSMENT ┌ APPEND STRUCTURE
| CI(CUSTOMER INCLUDE)
└ DATA ELEMENT
2. program exit ┌ 1. FUNCTION MODULE EXIT ~ 1 , 2, 3은 모두 FUNCTION MOEULE 이 BASE가 된다.
(customer exit) | 2. MENU EXIT
└ 3. SCREEN EXIT
3. Business Transaction Events (BTE)
4. Business Add-Ins
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/130
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/12 16:41
|
20091012 - 짠
VEHICLE
△
┌-----┼-----┐
| | |
car bus truck
저번주에 상속을 배웠으니...
예제 car를 가지고 설명중...
* redefinition = JAVA : Override ( polymophim)
* 상속받은 부모의 method를 가공할 수 있다.
인자들을 못 바꾸고. Logic만 수정하는 개념.
* Supper Class의 Method를 꼭 호출하지 않아도 됨.
METHOD get_average_fuel.
re_fuel = super->get_average_fuel( im_distance = im_distance
im_fuel = im_fuel ) + 2.
*CALL METHOD SUPER->GET_AVERAGE_FUEL
* EXPORTING
* IM_DISTANCE = IM_distance
* IM_FUEL = im_fuel
* RECEIVING
* RE_FUEL = re_fuel
* .
ENDMETHOD.
* Overloading.
- 인자수를 변경할 수 있다.
- logic을 수정할 수 있다.
- SuperClass Construct를 꼭 호출 해야 한다.
constructor 버튼을 눌러서 창이 나오면
parameter를 누른다음 im_color 을 정의한다.
그 후 color = im_color 로 만든다.
METHOD constructor.
CALL METHOD super->constructor
EXPORTING
im_make = im_make.
color = im_color.
ENDMETHOD.
Static Components and Inheritance
1. A class that defines a public or protected static attribute shares this attribute with all its subclasses
2. Static method cannot be redefined
106page
Up-Cast = Narrowing Casting...
부모 클래스에 자식 클래스의 주소를 넘기면...
부모는 상속 해준 Attribute 와 method 에 대해서만
Pointing 하게 된다.
redefinition 한 method 에 대해서는... 자식의 로직을
실행하게 된다.
예제
DATA: r_veh TYPE REF TO zcl08_kdn_vehicle,
r_car TYPE REF TO zcl08_kdn_car,
r_bus TYPE REF TO zcl08_kdn_bus,
r_truck TYPE REF TO zcl08_kdn_truck,
r_tab TYPE TABLE OF REF TO zcl08_kdn_vehicle.
DATA: car_avg_fuel TYPE i,
bus_avg_fuel TYPE i,
truck_avg_fuel TYPE i,
veh_avg_fuel TYPE i."s_consum.
CREATE OBJECT: r_car , r_bus , r_truck.
r_veh = r_car.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'car:',veh_avg_fuel.
r_veh = r_bus.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'bus:',veh_avg_fuel.
r_veh = r_truck.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : 'truck:',veh_avg_fuel.
r_veh = r_car.
APPEND r_veh TO r_tab.
r_veh = r_bus.
APPEND r_veh TO r_tab.
r_veh = r_truck.
APPEND r_veh TO r_tab.
LOOP AT r_tab INTO r_veh.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
사용은 같은 internal Table 은 배열 같아서 같은 형식의 여러개의 데이터가 입력 되는 형식이다.
ㅋㅋㅋ 조금뒤에 더...
Polymorphism 의 조건. (method기준)
1. Inheritance
2. Redefinition.
3. Up-Cast(Narrowing Cast).
LOOP AT r_tab INTO r_veh.
IF sy-tabix = 1.
r_car ?= r_veh.
r_car->get_color( ).
ENDIF.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
down Cast (widening Cast)
A ?= B. 라는 형식으로 ...
LOOP AT r_tab INTO r_veh.
TRY .
CASE sy-tabix.
WHEN 1.
r_car ?= r_veh.
r_car->get_color( ).
WHEN 3.
r_truck ?= r_veh.
r_truck->get_cargo( ).
WHEN 4.
r_truck ?= r_veh.
r_truck->get_cargo( ).
WHEN OTHERS.
ENDCASE.
CATCH cx_sy_move_cast_error.
MESSAGE i004(z08_kdn) WITH 'itab' sy-tabix.
ENDTRY.
veh_avg_fuel = r_veh->get_average_fuel( im_distance = 500 im_fuel = 50 ).
WRITE : / veh_avg_fuel.
ENDLOOP.
interface 시작..
Interface 안에는 .. Implementation 을 할 수 없다.
상속 (uses) class 안에서 해당 I/F 의 mothod를 implemention 한다.
compound Interface.~
interface 에서 interface 를 부르는 것을 두고 하는 말....
Z08_KDN_TT 이녀석을 이용해서 테스트 함 해보자.
DATA: r_car TYPE REF TO zcl08_kdn_car.
DATA: r_bus TYPE REF TO zcl08_kdn_bus.
DATA: r_truck TYPE REF TO zcl08_kdn_truck.
DATA: r_rental TYPE REF TO zcl08_kdn_rental.
START-OF-SELECTION.
CREATE OBJECT : r_car , r_bus, r_truck.
CREATE OBJECT : r_rental.
r_rental->add_vehicle( r_car ).
r_rental->add_vehicle( r_truck ).
r_rental->add_vehicle( r_bus ).
r_rental->get_vehicle( ).
METHOD add_vehicle.
APPEND im_vehicle TO vehicle_list.
ENDMETHOD.
짜잔...
zcl_vehicle - trigger
1. EVENT : VEHICLE_CREATED 라는 이벤트를 생성할 것이다.
2. Rase - Constructor(car/bus/truck 영향)
3. add_vehicle 이 실행..됨
constructor 에
setHandler add_vehicle for acc Instances
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/129
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/12 16:41
|
20091009
SE24 로 이동.
Class 를 만드는 방법 소개.
SE38 program을 이용하여
Class 가져다 쓰기.(저번시간에 한 내용은 Local Class 였지만... 이번에는 공용 Class이다.)
Method 를 부르는 방법에는 2 종류가 있다.
CALL METHOD r_veh 방식과... r_veh->method() . 방식이다.
SE24 접속 이름 주고.~
Attribute Tab에서 이름 적어주고
벌써 오후( 졸려요...)
Functional Method 에 대해서...
importing 과 returning 만으로 이루어져 있다.
exporting은 할 수 없음.
예제 z08_kdn_oop8
constructor (생성자의 이해)
Static Constructor .
클래스를 건들기만 하면...
Class Constructor 작동되는데 only once 딱 한번만 발생.
Class Constructor 는 언제 실행되나요? 라는 질문이 나올수 있겠습니다.
1. Create object
2. 클래스명 =>static Attribute 사용할때 .
3. 클래스명=>Static Method( ) . 호출할 때.
inherit(상속)
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/128
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/12 16:40
|
10월8일 - 4주차 -1번
function 도 Encapsulation 이 된다.
Program 1개가 1의 Internal Table 을 사용한다.
Function Group 영역의
Global Data 는
Function Group 안의 Function Module이 호출되었을때 공유하게 된다.
~ 호출이 되는 순간에 Function Group 의 Data가 메모리에 올라오게 된다.
function 은 안되는데 .. Class 는 되더라..
바로 메모리에 올라가게 된다.
Example of a Function Group
FG
G : Speed.
FM1 : Inc-Speed.
FM2 : Des-Speed.
FM3 : get-Speed.
Instantiate.
The Object-Oriented Programming Model of ABAP Object.
작명 규칙
Super Class (부모)/ A: Class zcl*(se24) 나중에
| lcl* (se38) 현재
┌-------┼ -------┐
Sub Class (자식) / A'Class A"Class A^Class '
polymorphism:
상속을 받은 Class들에 똑같은 행위를 요청하여도 그들이 하는 행위의 형태는 다르다.
OOP의 SPEC 에 관하여... 그리고 설계 하는 방법.!
UML 사용...
Unified Modeling Language
Class 에서
Define 은 Method & Attribute
Implement 는 Method 로 만들어 진다 하네요.
composition : 부분이 값으로 전체를 구성하거나 전체에 포함되면 composition.
aggregation : 부분이 참조로 전체를 구성하거나 전체에 포함되면 aggregation.
association [əsòusiéi∫ən, -∫i-]
1. 협회 (society) , 조합, 단체, 사단 (社團) , 회사, 결사 (結士)
2. U 연합, 합동, 공동;관련 《with》 ; 《완곡》 기업 연합, 담합 《with》
3. U 교제, 제휴, 연락 《with》 ; 《완곡》 혼외 정사, 불륜 《with》
4. U,C 【심리】 연상, 관념 연합;함축, 암시적 의미; 【수학】 조합; 【화학】 (분자의) 회합
5. =ASSOCIATION FOOTBALL
6. 【생태】 (생물) 군집
aggregation [æ̀grigéi∫ən]
1. U 집합, 집성 (集成) , 집적 (集積)
2. 집합체, 집단; 【야구】 팀~·al a.
composition [kɑ̀mpəzí∫ən] [kɔm-]
1. U 구성, 조립, 합성, 혼성
2. U,C 【인쇄】 식자, 조판
3. 구성물;합성물, 혼합물;모조품 《흔히 생략해서 compo라 함》 ; (합성) 성분
4. 한 편의 작문, 문장;악곡
5. U,C 배합, 배치 (arrangement) ; 【미술】 구도
6. U 작문 (법) , 작시 (법) ;문체; 【음악】 작곡 (법)
7. U (물질의) 구조, 조성 《of》
8. U 기질, 성질, 자질
9. 【법】 조정, 타협, 화해 《with》 ;화해금
10. U 【문법】 (단어의) 복합 (법) , 합성
recursive [rikəˊːrsiv]
1. 【수학】 순환의
2. 되풀이되는, 재귀하는
3. 【컴퓨터】 순환적인, 반복적인, 회귀적인~·ly ad. ~·ness n.
포인팅 하는 법.
REPORT z08_kdn_oop_1.
INCLUDE z08_kdn_oop_1top.
DATA: r_veh TYPE REF TO lcl_vehicle.
DATA: r_tab TYPE TABLE OF REF TO lcl_vehicle.
START-OF-SELECTION.
DO 3 TIMES.
CREATE OBJECT r_veh.
IF sy-index EQ 3.
r_veh->carrid = 'AA'.
ENDIF.
APPEND r_veh TO r_tab.
ENDDO.
LOOP AT r_tab INTO r_veh.
WRITE: / r_veh->carrid.
ENDLOOP.
이게 자바로는 이쯤 될 것 같은데.~ 5.0 이상 버젼으로...
class lcl_vehicle{
public scarr-carrid carrid = "LH";
}
import lcl_vehicle
class z08_kdn_oop_1{
lcl_vehicle r_veh;
ArrayList<lcl_vehicle> r_tab = new ArrayList<lcl_vehicle>;
public static void main(){
for(i=0;i<3;i++){
r_veh = new lcl_vehicle();
if(i == 3){
r_veh.carrid = "AA";
}
}
}
}
* 금기시 되는 선언 ...
1. Header Line 을 가진 Internal Table
2. Tables 도 안됨
3. Data 선언을 할 때 like Spfli 는 안 됨.
* 자 그럼 하나 해보자!( 예제..)
*&---------------------------------------------------------------------*
*& Report Z08_KDN_OOP_1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08_kdn_oop_1.
INCLUDE z08_kdn_oop_1top.
DATA: r_tab TYPE TABLE OF REF TO lcl_vehicle.
DATA: r_veh TYPE REF TO lcl_vehicle.
START-OF-SELECTION.
PERFORM select_vehicle USING 'AA'.
PERFORM select_vehicle USING 'LH'.
LOOP AT r_tab INTO r_veh.
LOOP AT r_veh->it1 INTO r_veh->wa1.
WRITE: / r_veh->wa1-carrid , r_veh->wa1-connid,
r_veh->wa1-cityfrom , r_veh->wa1-cityto.
ENDLOOP.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form select_spfli
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0080 text
* -->P_R_TAB text
*----------------------------------------------------------------------*
FORM select_vehicle USING f_carr TYPE spfli-carrid.
CREATE OBJECT r_veh.
SELECT *
FROM spfli
INTO TABLE r_veh->it1
WHERE carrid EQ f_carr.
APPEND r_veh TO r_tab.
ENDFORM. " select_vehicle
36 Page
* readonly는 변경할 수 없지만 ... method 가 실행되면 값을 변경하는게 가능하다.
Attribute(Data) 나 Method(Function) 을 참조하는 방식
1. ClassName => xxx
2. instanceName->xxx
이렇게 가능하다.
method 에 대해서 배워보자.
REPORT z08_kdn_oop_3.
INCLUDE z08_kdn_oop_top3.
DATA: r_veh TYPE REF TO lcl_vehicle.
START-OF-SELECTION.
CREATE OBJECT r_veh.
r_veh->get_count( ).
CALL METHOD r_veh->get_count.
*&---------------------------------------------------------------------*
*& Include Z08_KDN_OOP_TOP3
*&---------------------------------------------------------------------*
CLASS lcl_vehicle DEFINITION.
PUBLIC SECTION.
METHODS: get_count.
PRIVATE SECTION.
CONSTANTS: count TYPE i VALUE 10.
ENDCLASS. "lcl_vehicle DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_vehicle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_vehicle IMPLEMENTATION.
METHOD get_count.
WRITE: / count.
ENDMETHOD. "get_count
ENDCLASS. "lcl_vehicle IMPLEMENTATION
** static method 는 class 명 => sm( )
Instance명 -> sm( )
** Static Attribute는?
Static 은 memory 상의 한 영역에만 존재한다.
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/127
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/08 16:44
|
10월8일 - 4주차 -1번
Function 도 Encapsulation 이 된다.
Program 1개가 1의 Internal Table 을 사용한다.
Function Group 영역의 Global Data 는
Function Group 안의 Function Module이 호출되었을때 공유하게 된다.
~ 호출이 되는 순간에 Function Group 의 Data가 메모리에 올라오게 된다.
바로 메모리에 올라가게 된다.
Example of a Function Group : FG
G : Speed.
FM1 : Inc-Speed.
FM2 : Des-Speed.
FM3 : get-Speed.
Instantiate.
The Object-Oriented Programming Model of ABAP Object.
작명 규칙
Super Class (부모)/ A: Class zcl*(se24) 나중에
△ lcl* (se38) 현재
┌-------┼ -------┐
Sub Class (자식) / A'Class A"Class A^Class '
polymorphism:
상속을 받은 Class들에 똑같은 행위를 요청하여도 그들이 하는 행위의 형태는 다르다.
OOP의 SPEC 에 관하여... 그리고 설계 하는 방법.!
UML 사용...
Unified Modeling Language
Class 에서
Define 은 Method & Attribute
Implement 는 Method 로 만들어 진다 하네요.
국내의 대부분의 프로젝트는 CBD개발 방법론으로 만들어 지고 있는 듯 하다.
하지만 처음 설계되로 만들어 지는 곳은 본적도 들은 적도.. 별로 없는 듯 하다.
아밥에서 객체에 대한 이야기를 듣는것도 참으로 아이러니 한 일이지만 아무튼...
잘 만들어진 UML은 시스템을 이해하는데 아주 많은 도움을 주기도 했다. 개발이 끝날때까지의 변경에 대한 적용을
문서에 잘 해 나갔으면 말이다.
composition : 부분이 값으로 전체를 구성하거나 전체에 포함되면 composition.
aggregation : 부분이 참조로 전체를 구성하거나 전체에 포함되면 aggregation.
혹시 해서 단어 사전의 뜻을..
association [əsòusiéi∫ən, -∫i-]
1. 협회 (society) , 조합, 단체, 사단 (社團) , 회사, 결사 (結士)
2. U 연합, 합동, 공동;관련 《with》 ; 《완곡》 기업 연합, 담합 《with》
3. U 교제, 제휴, 연락 《with》 ; 《완곡》 혼외 정사, 불륜 《with》
4. U,C 【심리】 연상, 관념 연합;함축, 암시적 의미; 【수학】 조합; 【화학】 (분자의) 회합
5. =ASSOCIATION FOOTBALL
6. 【생태】 (생물) 군집
aggregation [æ̀grigéi∫ən]
1. U 집합, 집성 (集成) , 집적 (集積)
2. 집합체, 집단; 【야구】 팀~·al a.
composition [kɑ̀mpəzí∫ən] [kɔm-]
1. U 구성, 조립, 합성, 혼성
2. U,C 【인쇄】 식자, 조판
3. 구성물;합성물, 혼합물;모조품 《흔히 생략해서 compo라 함》 ; (합성) 성분
4. 한 편의 작문, 문장;악곡
5. U,C 배합, 배치 (arrangement) ; 【미술】 구도
6. U 작문 (법) , 작시 (법) ;문체; 【음악】 작곡 (법)
7. U (물질의) 구조, 조성 《of》
8. U 기질, 성질, 자질
9. 【법】 조정, 타협, 화해 《with》 ;화해금
10. U 【문법】 (단어의) 복합 (법) , 합성
recursive [rikəˊːrsiv]
1. 【수학】 순환의
2. 되풀이되는, 재귀하는
3. 【컴퓨터】 순환적인, 반복적인, 회귀적인~·ly ad. ~·ness n.
포인팅 하는 법.
REPORT z08_kdn_oop_1.
INCLUDE z08_kdn_oop_1top.
DATA: r_veh TYPE REF TO lcl_vehicle.
DATA: r_tab TYPE TABLE OF REF TO lcl_vehicle.
START-OF-SELECTION.
DO 3 TIMES.
CREATE OBJECT r_veh.
IF sy-index EQ 3.
r_veh->carrid = 'AA'.
ENDIF.
APPEND r_veh TO r_tab.
ENDDO.
LOOP AT r_tab INTO r_veh.
WRITE: / r_veh->carrid.
ENDLOOP.
이게 자바로는 이쯤 되려나?
class lcl_vehicle{
public scarr-carrid carrid = "LH";
}
import lcl_vehicle
class z08_kdn_oop_1{
lcl_vehicle r_veh;
ArrayList<lcl_vehicle> r_tab = new ArrayList<lcl_vehicle>;
public static void main(){
for(i=0;i<3;i++){
r_veh = new lcl_vehicle();
if(i == 3){
r_veh.carrid = "AA";
}
r_tab.append(r_veh);
}
foreach(lcl_vehicle lv:r_tab ){
System.out.println(lv.carrid);
}
}
}
* 금기시 되는 선언 ...
1. Header Line 을 가진 Internal Table
2. Tables 도 안됨
3. Data 선언을 할 때 like Spfli 는 안 됨.
* 자 그럼 하나 해보자!
*&---------------------------------------------------------------------*
*& Report Z08_KDN_OOP_1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT z08_kdn_oop_1.
INCLUDE z08_kdn_oop_1top.
DATA: r_tab TYPE TABLE OF REF TO lcl_vehicle.
DATA: r_veh TYPE REF TO lcl_vehicle.
START-OF-SELECTION.
PERFORM select_vehicle USING 'AA'.
PERFORM select_vehicle USING 'LH'.
LOOP AT r_tab INTO r_veh.
LOOP AT r_veh->it1 INTO r_veh->wa1.
WRITE: / r_veh->wa1-carrid , r_veh->wa1-connid,
r_veh->wa1-cityfrom , r_veh->wa1-cityto.
ENDLOOP.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form select_spfli
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0080 text
* -->P_R_TAB text
*----------------------------------------------------------------------*
FORM select_vehicle USING f_carr TYPE spfli-carrid.
CREATE OBJECT r_veh.
SELECT *
FROM spfli
INTO TABLE r_veh->it1
WHERE carrid EQ f_carr.
APPEND r_veh TO r_tab.
ENDFORM. " select_vehicle
36 Page
* readonly는 변경할 수 없지만 ... method 가 실행되면 값을 변경하는게 가능하다.
Attribute(Data) 나 Method(Function) 을 참조하는 방식
1. ClassName => xxx
2. instanceName->xxx
이렇게 가능하다.
method 에 대해서 배워보자.
REPORT z08_kdn_oop_3.
INCLUDE z08_kdn_oop_top3.
DATA: r_veh TYPE REF TO lcl_vehicle.
START-OF-SELECTION.
CREATE OBJECT r_veh.
r_veh->get_count( ).
CALL METHOD r_veh->get_count.
*&---------------------------------------------------------------------*
*& Include Z08_KDN_OOP_TOP3
*&---------------------------------------------------------------------*
CLASS lcl_vehicle DEFINITION.
PUBLIC SECTION.
METHODS: get_count.
PRIVATE SECTION.
CONSTANTS: count TYPE i VALUE 10.
ENDCLASS. "lcl_vehicle DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_vehicle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_vehicle IMPLEMENTATION.
METHOD get_count.
WRITE: / count.
ENDMETHOD. "get_count
ENDCLASS. "lcl_vehicle IMPLEMENTATION
** static method 는 class 명 => sm( )
Instance명 -> sm( )
** Static Attribute는?
Static 은 memory 상의 한 영역에만 존재한다.
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/124
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/07 21:54
|
menu - program - code Inspector
st21: bug log
sm21 : system log
sci : code inspector
OBJECT SELECTION 에서 CTS넘버 별로 검증
REQUEST/TASK
se30 : Runtime 시의 performance를 측정할 수 있다.
tips and trick
* Module pool 프로그램 생성법
1. SE80상에 SAPMZ~~~ 으로 생성함.
SAPMZ08_KDN_1 입력 -> ENTER -> ENTER -> 어쩌구
-> object Name 을 확인해서 활성화 시켜주기 (마우스 오른쪽 버튼 )
2. INCLUDE ~~~TOP 을 활용함.
3. MODULE POOL PROGRAM 이 생성되고 있음을 확인.
4. MAIN PROGRAM명은 SAPMT~~~ 임을 명심
5. Include ~~~top 내에 program(main program)이 있음을 확인
6.
Include ~~~Top . - Global Data 처리부
Include ~~~O01 . - PBO 처리부
Include ~~~I01 . - PAI 처리부
Include ~~~F01 . - subrutine 처리부
Include ~~~E01 . - Event 처리부
7. 기본적 Screen 생성 (Ex: 100번)
8. T-Code 를 생성함 (Dialogue Transaction) 위 7번의 screen으로
(별표) Module pool 프로그램 작업하는 곳과 Test 하는 곳의 Session 은 따로 따로관리할 것.
* Screen 처리법
Screen Type 3가지 : Nomal (Full) : 100번 단위
Subscreen : 10번 단위
Modal Dialog : 1번 단위
ok_code는 Main 화면 (Nomal ,Full)에 꼭 넣어주어야 함.
Bar - Code ex: back button 의 코드
-> function Code 라고 함.
너무 중요해요...
* Screen 상에 define 한 field등의 component들은 abap상에서도 정의 하여야 한다.
design element include xxxxTop
* 4개의 BAR
1. Title Bar
문형(set titlebar '대문자' with &1~&9)
2. PF-STATUS BAR
문형( SET PF-STATUS '대문자' EXCLUDING
menu bar , Standard bar , application tool bar
Title 넣기!
1. SET TITLEBAR 'TITLE_NNNN' WITH sy-dynnr.
소스를 입력 하세요.
2. 'TITLE_NNNN'를 더블 클릭
3. title 에 Screen (&1)... 를 입력
4. all Title 을 클릭
5. 활성화 버튼
6. 완료
PF-STATUS 넣기 (MENU)
(그림 넣을 자리)
CASE ok_code.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
PAI 에 값을 입력 합니다.
화면 조작 하기
1. LAYOUT 버튼을 누르면 Visual Basic 에서 component 를 넣는 식의 화면이 나온다.
2. 왼쪽 메뉴에서 TEXT FIELD 를 고르시고... 이름과 값을 입력해 줍니다.
3. TEXT1 과 TEXT2 라는 이름을 만들어 줬을때.
4. SCREEN 에서 MODULE 인 MODIFY_SCREEN 을 골라서 수정해줍니다.
LOOP AT SCREEN.
IF screen-name = 'TEXT1'.
screen-invisible = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
이렇게 되면... 원래 페이지에는 나와야 하는 헿헿헿
SET SCREEN NNNNN
LEAVE SCREEN
합치면 -> LEAVE TO SCREEN 주절 주절
스크린에서 아이콘은 잘 사용하지 않아요
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/123
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
+ [Language/ABAP] | 2009/10/07 21:53
|
정리 20091007
Button 이후 ...
참고하고 넘어가기 쭉~~~~~~~
Using Context... - 마우스 오른쪽 버튼을 이용한 이벤트 - 실용성이 없어서 패스...
3-2장 .
SE11 -> SE16으로 볼때...
SPFLI Table 을 이용하여 확인을 하여본다.
파란색은 Key
노란색은 Check Table을 가지고 있음을 뜻한다.
spfli -> zkdn_spfli08 로 복사.
Single insert를 하기 위하여.
z08_kdn_20091007_1 의 Excutable program을 만든다.
REPORT z08_kdn_20091007_1.
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE * FROM spfli INTO wa1.
INSERT into zkdn_spfli08 values wa1.
WRITE: / sy-subrc.
이렇게 하고 SE16 에서 Table 에 데이터가 들어가 있는지 확인해본다.
0 이 나오고 데이터가 삽입 된 것을 볼 수 있다.
자 이제 전체 데이터를 삽입 하는 것을 해보자.
DATA: wa1 TYPE zkdn_spfli08,
it1 TYPE TABLE OF zkdn_spfli08.
SELECT *
FROM spfli
INTO TABLE it1.
INSERT zkdn_spfli08
FROM TABLE it1.
업데이트도 해보자~
DATA: wa1 TYPE zkdn_spfli08,
it1 TYPE TABLE OF zkdn_spfli08.
SELECT *
FROM spfli
INTO TABLE it1
WHERE carrid EQ 'AA'.
UPDATE zkdn_spfli08
SET cityfrom = 'SEOUL'
WHERE carrid EQ 'AA'.
modifying single Record / Several Records 중요합니다.
원래는 modify가 인터널 테이블만 수정하게 되어있거든요
하지만 데이터베이스에도 적용이 됩니다.
있으면 업데이트 없으면 인서트~
MODIFY zkdn_spfli08 FROM TABLE it1.
update는 있는 데이터에 대해서만 적용을 할 수 있지만...
modify 는 없는 데이터도 넣어 줄 수 있다.
oracle 의 merge insert 와 똑같다.
14 page
Rollback 을 일으킬수 있는 방법은 2가지 방법.
☆★☆ ,, causing a database rollback.
1. Sending a termination dialog message (A-Message)
2. Using the ROLLBACK WORK ABAP Statement.
Message A Type 을 이용하는 방법과 Abap Statement 인 Rollback Work 를 이용하는 방법
이 있는데 .. Rollback Work 를 이용하면 DB는 Rollback 되지만 프로그램이 종료되지 않는 문제가 있다.
이 때문에 A-Message 를 사용하는것이 올바르다.
terminates program - program 을 끝낸다.
Page 44
LUW - Logical Unit of Work
Commit WORK
여기서 시험문제가 간혹 나오는데...
각 데이터베이스에 대한 테이블들은 하나인것처럼 움직이게 되고 이것이 바로 LUW이다.
Hint
Due to the abobe-mentioned, implicit DB commits, changes that belong to an
SAP LUW may not be placed in different dialog steps( dialog step = program
processing after a screen). The reson is because these steps would thus not because
within a DB LUW.
Locks Concept
1. Lock 걸고 2. Read 하고 3. Change 하고 4. Lock 풀어라
E-WP(LockTable)
1. Lock Object(se11에서 생성) / (EZ* / EY*)
Lock mode ┌ E : Write Lock - 누적 O
├ S : Shared Lock(Read Lock) - 누적 O
└ X : Exclusive Write Lock - 누적 X --------------------┼-------------------
Lock Parameter - (Lock Argument.)Key Field
Key field 들의 묶음.
예를 들어 SPFLI Table 을 보면
MANDT, CARRID , CONNID 가 Key Field 인데...
MANDT 만 제공 하였을때와 MANDT , CARRID , CONNID 까지 모두를 제공 하였을 때의
범위가 틀리다는 이야기이다.
2. Lock Module.
Lock Object를 Active(불) 될때 Lock Module 이 만들어 진다.
2개 ENQUEUE_EZ* ---------(Function Module) Lock 잡기
DEQUEUE_EZ* ---------(Function Module) Lock 풀기
3. Using Lock ( Monitering : sm12)
(프로그램에서 호출)
| 프로그램 내에서 호출 |
서로다른 user가 호출 |
| E :누적O |
Lock걸 수 O |
Lock 걸 수 X |
| X :누적X |
Lock걸 수 O |
Lock 걸 수 X |
| S :누적O |
Lock걸 수 O |
Lock 걸 수 O |
4. flush_enqueue (Lock Container) : lock Container 의 데이터를 lock Table 다 쏟아 낸다.(하나라도 안 들어가면.. 안 들어간다.)
Lock Container (RESET_ENQUENE) : lock Container 의 데이터를 초기화 시킨다.
POC 방식 ...:
Perform on commit
Page 85 (Setting and Releasing Locks - Timecourse)
1. Setting locks for the data to be processed.
2. If the lock has been successfully set , read the current data from the database.
3. Change the program data (user inputs) and update the changes to the database
4. Release set locks once again.
이 원칙을 잘 정리해 놓으셔야 합니다.
Lock 을 먼져 해야하는 이유는?
Lock 을 걸거나 Lock 이 걸린 것을 확인 하는 작업을 먼져 하지 않고 Read를 해버리면...
다른 사람이 같은 테이블을 건드리거나 할때 변경이 일어난 데이터를 가져와서 작업 할 수도 있고
-- 이는 동기화에 대한 문제이다. --
고로 Lock 을 먼져 걸고 모든 작업을 할 수 있도록 해야한다.
lock object 를 생성합니다.
se11 로 이동후 이름은 EZKDN_SPFLI08 로 준다.
Lock Parameter 에 key Field 를 어떻게 주느냐에 따라서 ... 데이터의 양이 틀리다.
키가 3개인데 3개를 다 적용하게 되면 데이터는 범위가 작아지고 1개만 적용하면 데이터의 범위가 더 많아지게 된다.
Lock Object 를 적용 시킨것은 se37 (function module 이기 때문에) Function Module ENQUEUE_EZKDN_SPFLI08에 접근하여
확인 할 수 있다.
* SM12 를 이용해서 Table 을 확인 할 수 있다.
Program 을 실행 시키고 Table 명을 주면 어떤 계정이 Table 을 작업하고 있는 것을 확인이 가능하다.
SE11을 이용해서 LOCK OBJECT를 만들어 주고...
LOCK MODULE 은 SE38 및 프로그램에서 PATTERN 의 FUNCTION 에서 불러 낸다.
E, X, S 중 어떤 것으로 LOCK 을 실행하는지에 따라 적용이 틀리다.
_COLLECT 를 X 로 지정하면 LOCK 들을 LOCK CONTAINER 에 담아둔다.
FLUSH_ENQUEUE 라는 FUNCTION 을 실행시켜서 작업.
LOCK CONTAINER 를 삭제 하게 하려면...
교재 83 의 RESET ENQUEUE 를 사용한다.
function Module : DEQUEUE_ALL 을 하면 Lock 을 모두 풀 때...
(A, B, C)
(오후)
100 Page 시작
맨 마지막에 지금까지 update해야 할 것들을 묶어서 한방에 update 를 하게 된다.
- last Dialog step
*CHANGE
~모아서 처리.
1. 일반적인 방식(Program 내부: POC 방식) - WITHIN THE APPLICATION PROGRAM
EX) PERFORM xxxx ON COMMIT.
바로 Update 를 하지 않고, Commit work 가 수행될 때 일괄 처리
SIMPLE ... QUICKLY , LIGHT LUW 를 사용해라.
2. 진보적 방식(Function Module)
Attribute (update check)
내부 update 문장들...
rollback 처리 Message A Type .
COMMIT WORK 설명 중 짠 PROGRAM - Z08_KDN_20091007_3
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE *
FROM zkdn_spfli08
INTO wa1
WHERE carrid = 'AA'
AND connid = '0007'.
wa1-cityfrom = 'DAEJEON'.
wa1-cityto = 'KWANGJU'
PERFORM update_zkdn_spfli001 ON COMMIT.
COMMIT WORK.
perform update_zkdn_spfli08.
*&---------------------------------------------------------------------*
*& Form update_zkdn_spfli08
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_zkdn_spfli08 .
MODIFY sairport FROM wa1.
ENDFORM. " update_zkdn_spfli08
Page 109
PROCESS : WRITING REQUESTS
* CALL Function 'XXX' In UPDATE Task
cflcct
Log Table 에 Request 형태로 쌓아지게 된다.
Commit work 을 만날때 수행(일괄처리)
SE37 로 이동.
ZKDN_UPD08_1 로 만들고
attributes tab에
update module 선택 해주기.
FUNCTION 에서 IMPORT 되는 IM_WA 에 대해서
PASS VALUE 를 CHECK 해주기 바람.
SOURCE CODE 에 값을 넣어주기.
MODIFY zkdn_spfli08 FROM im_wa.
IF sy-subrc NE 0.
MESSAGE a002(z08_kdn) WITH 'could not be update'.
ENDIF.
PROGRAM 짜기...
DATA: wa1 TYPE zkdn_spfli08.
SELECT SINGLE *
FROM zkdn_spfli08
INTO wa1
WHERE carrid = 'AA'
AND connid = '0007'.
wa1-cityfrom = 'SEOUL'.
wa1-cityto = 'BUSAN'.
*pattern 을 사용하여... ZKDN_UPD08_1 을 입력하고~ 알맞은 값을 넣어준다.
CALL FUNCTION 'ZKDN_UPD08_1' IN UPDATE TASK
EXPORTING
im_wa = wa1.
COMMIT WORK.
update 에 대한 function module 을 사용하여 작업을 해 보았다.
log table 에 값을 넣어 두었다가 update process 에서 적용을 하더라....
그림 51 밑에 보세요 114 page
Both procedures
delete all previous update flags
delete all previously set locks,
discard all of the updates executed in the current DB LUW,
and discard all of the form routines registered using "PERFORM ON COMMIT".
* Program 까지 함께 죽이려면 Message Type A 를 사용하라.
* ROLLBACK WORK 이나 COMMIT WORK 은 function module에 적지 않는다.
page 117
* update mode 3가지.
1. Asynchronous Update
D - WP U-WP
LUW1
COMMIT WORK -> 바로 이관
LUW2
2. Synchronous Update
D-WP U-WP
LUW1
COMMIT WORK AND WAIT -이관이 될 동안 LUW2 를 실행 안 하고 기다리고 있다.
LUW2
3. Local Update
D-WP
--------------------------
SET UPDATE TASK LOCAL
--------------------------
LUW1
commit work
LUW2
---------------------------
*기다리고 빠르게 느껴진다. (메모리 관리를 한다.)
log Table 에 들어가게 하려면...
CFIUT 를 해야 request 형태로 들어간다.
Function Module 의 내부 : Attribute
V1 ┌ 1번째.
│ Priority 중요성 높음 (Async , sync ,local)
└ 2번째.
V2 ┌ 3번째.
│ Priority 중요성 낮음 (Async , sync )
└ 4번째.
* V1 은 Memory 사용 , V2는 Memory 미사용.
V1 이 성공해야 V2가 실행... 된다....
Lock 메카니즘은 .. V1까지 ... 적용된다.
sm13에서 확인이 가능하다.
update module 에.. V1update 에서
Page 136
submit 은 report program 만 호출이 가능함.
돌아오지 못함.
external Session 이 열려서 function Call.. 예~
패스패스패스
Page 151
Navigation
Starting new Task 'T1'
External Session 을 하나 더 열어서 실행.
Call Function
Submit and Return
Call Transaction
땀돌이 08 풀어보기
An Authority-Check 는 At selection-Screen 에서 사용된다.
|
0
|
|
|
|
|
이 글의 관련글(트랙백) 주소 :: http://hanoori.pe.kr/trackback/122
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|