[PARAMETER 목적]
1명의 End User가 연관성 있는 프로그램을 사용하게 될 경우, A -> B로 또는 B-> A로 데이터를 공유하기 위해서.
[ABAP memory와 SAP memory]
SAP의 Session의 종류는 이렇게 3가지 입니다.
Terminal Session : 1명의 End User는 Login을 통해 1개의 Terminal Session을 갖는다.
External Session : 1개의 Terminal Session은 동시에 실행할수 있는 Window 6개를 갖는다. (이는 세팅값을 통해 조절가능)
Internal Session : 1개의 External Session "Call Transaction" 명령을 통해 20개의 Internal Session을 가질수 있다.
120EA Internal Session = (1 Terminal Session * 6 External Session * 20 Internal Session )
- ABAP memory
▶ external session 내에 위치하며 인터널 메모리에서만 할당되는 메모리
▶ 동일한 Window에서 수행되는 프로그램에서 메모리가 공유됨.
▶ 1개의 프로그램 Window가 "Call Transaction"을 통해 순간적으로 데이타를 넘겨주고 받아야 할경우 사용되는 메모리 영역. ( Export, Import 명령어로 데이터 이동 )
* IMPORT / EXPORT
- Export 구문을 이용하여 object를 Abap memory에 load할 수 있음.
- 일반적으로 call transation, submit, call dialog 를 통해 다른 프로그램을 호출할 때 변수를 넘겨주기 위해 많이 사용함.
Export 명령으로 데이터를 보내고 Call Transaction을 통해 타 프로그램 실행 후 import명령을 통해 테이터를 확인한다.
- SET/GET은 SAP 메모리 영역을 할당하게 되고
IMPORT/EXPORT는 ABAP 메모리 영역을 할당하기 때문에 다른 윈도우창 프로그램에 데이터를 넘겨줄 수 없다.
- IMPORT 한 후 FREE MEMORY ID ___를 이용하여 초기화하자.
그리고 CHECK 구문으로 로직 구현을 하면 조금 더 고도화시킬 수 있다.
* 예시
"EXPORT obj1 ... objn TO MEMORY ID key. ABAP메모리에 데이타를 넘겨준다. [key]명은 임의로 생성. "
EXPORT gt_sflight TO MEMORY ID 'TEST_ID'.
"IMPORT obj1 ... objn FROM MEMORY ID key. ABAP메모리로부터 [key]에 해당하는 값을 받아온다."
IMPORT gt_sflight FROM MEMORY ID 'TEST_ID'. "TEST_ID 라는 ID를 가진 MEMORY를 gt_sflight에 불러온다."
CHECK gt_sflight NE SPACE. " gt_sflight이 SPACE 일 경우 하단 로직을 수행한다."
FREE MEMORY [ID key]. "ABAP메모리로부터 [key]또는 전체를 삭제한다. "
EXPORT obj1 .. objn TO SHARED BUFFER indx(st) ID key. "SAP Memory의 SAP Buffer을 이용하여 광역변수를 줄수있다 "
IMPORT obj1 ... objn FROM SHARED BUFFER indx(ST) ID key. "SAP Memory의 SAP Buffer을 이용 광역변수를 받을수 있다"
"장점 : dobj(ABAP에 정의하는 변수)는 모두 주고 받을 수 있다. "
INITIALIZATION에 Container , alv 생성하고 출력 데이터를 abap 메모리로 내보내어 가져와 출력할 경우
프로그램 제어가 INITIALIZATION 이벤트에 도달하면 모든 메모리가 새로 고쳐지고 전역 데이터가 무료가 됩니다.
결국 모든 것은 INITIALIZATION 이벤트에서 초기화되어야 합니다. 이것이 INITIALIZATION 이벤트의 작업입니다.
따라서 INITIALIZATION 이벤트에 있을 때 ALV 데이터를 다시 가져와야 합니다."
INITIALIZATION.
* object for the report
CREATE OBJECT lo_report.
* generate output
lo_report->generate_output( ).
START-OF-SELECTION.
* Get data
lo_report->get_data( ).
"Method generate_output"
METHOD generate_output.
* Local data
DATA: variant TYPE disvariant.
DATA: repid TYPE sy-repid.
* Import output table from the memory and free afterwards
IMPORT data = me->gt_data FROM MEMORY ID sy-cprog.
FREE MEMORY ID sy-cprog.
*
* Only if there is some data
CHECK me->gt_data IS NOT INITIAL.
* data selection
SELECT * FROM sflight
INTO TABLE me->gt_data
WHERE carrid IN s_carrid.
IF sy-dbcnt IS INITIAL.
MESSAGE s398(00) WITH 'No data selected'.
ENDIF.
*
* Export to memory
EXPORT data = me->gt_data TO MEMORY ID sy-cprog.
ENDMETHOD.
- SAP memory
▶ external session 외부에 위치하며 로그인된 순간부터 종료될때까지 유지되는 메모리 영역.
(SET, GET 명령어로 데이타 이동)
▶ 프로그램 두개가 동시에 실행중이고 SET을 통해 데이터를 기록 후 타 프로그램에서 GET 명령으로 확인한다.
▶ CALL TRANSATION 대신 Submit program으로 타 프로그램을 호출하게 되면 자신이 internal session에서 호출 하는 것임.
▶ SAP Memory 파라미터 생성 방법 및 개념
- T-CODE : SM30 / TABLE : TPARA 실행
* 예시
SET PARAMETER ID <par_name> FIELD <var_name> "메모리 <par_name> = <var_name> 할당"
GET PARAMETER ID <par_name> FIELD <var_name> "메모리 <var_name> = <par_name> 할당 (불러오기)"
PARAMETERS : p_1 TYPE c MEMORY ID 'pid'. " ABAP Memory 'pid'를 화면파라멘타 p_1에 연계시킨다."
" Selection Screen은 안된다."
장점 : SAP Terminal Session에서 Global하게 사용할 수 있다.
단점 : SAP Memory에 저장할수 있는 데이타의 제약이 너무크다. Parameter만가능. (itab , Structure는 저장할 수 없음)
SAP Memory를 사용하기전 Memory ID를 지정해야만 한다. (너무 많이 사용하면 중복이 발생할 수 있다)
[사용자 프로파일의 파라미터에 저장]
▶ 시스템 - 사용자 프로파일 - 사용자 데이터의 매개변수에 파라미터 값 저장.
(대소문자 구분해서 정확히 입력해야함)
사용자 매개변수의 값이 할당되는 것을 확인 할 수 있음.
PARAMETERS : G_BUKRS TYPE C MEMORY ID BUK 와 GET PARAMETERS ID 'BUK' FIELD G_BUKRS 같음.
파라미터 ID를 변경하고자 할 경우에는 SET PARAMETER를 추가해야함.
[프로그램A] 에서 [프로그램B]을 호출하는 방법. ( Internal Session 사용, ABAP Memory사용)
1) [프로그램A]실행 -> A에서 [프로그램B]호출 -> [프로그램B]실행 -> [프로그램B]종료 ->[프로그램A]복귀
[프로그램A] : Call Transaction 'Z14_007' AND SKIP FIRST SCREEN.
[프로그램B] : Leave Program.
2) [프로그램A]실행 -> A에서 [프로그램B]호출 -> [프로그램B]실행 -> [프로그램B]종료
[프로그램A] : Leave TO Transaction 'Z14_007' AND SKIP FIRST SCREEN.
[프로그램B] : Leave Program.
[ Debugging을 통해 ABAP Memory를 확인하는 방법 ]
ECC 6.0 이상.
가) 디버깅 창에 동그라미친 아이콘이 존재한다. 이것을 클릭하면 선택영역이 나오는데
나) 여기서 System Areas를 선택한다.
다) 새로등장한 창에서 Area항목에 "SMEM"을 입력해 주면 현재 ABAP메모리를 확인할수 있다.
'Ⅰ. ERP > 1. ABAP' 카테고리의 다른 글
[SAP ABAP] 효율적인 코딩법(튜닝) (1) | 2022.11.21 |
---|---|
[SAP ABAP] 시스템변수 | sy-repid, sy-cprog .. (0) | 2022.11.16 |
[SAP ABAP] PAI 에서 AT EXIT-COMMAND (0) | 2022.11.04 |
[SAP ABAP] CCM 하면서 정리 ( ECC -> HANA 변화구문 ) (0) | 2022.11.02 |
[SAP ABAP] 시스템 변수 정리 (0) | 2022.10.31 |