본문 바로가기

SAP셀프스터디/22일만에 이지아밥 1회독 하기

[chapter12] Report Program

최초 작성일: 23년 2월 28일

최종 작성일: 23년 3월 5일

목적: ALV 이해, 포폴 작성

Report Program

01. over view

아밥 프로그램의 기본이 되는 type-1 program을 흔히 report program, executable program 혹은 interactive program이라 한다. 데이터 베이스에서 원하는 데이터를 추출하고 해당 데이터를 정보로 활용할 수 있는 구조로 변경하여 리포트 형식으로 조회한다. 그리고 프로그램 자체적으로 직접 실행이 가능하며 submit이라는 키워드를 통해서 다른 프로그램에서 호출 할 수 있다.

type-1 프로그램을 생성하고 실행시키면 아래와 같은 흐름에 의해 처리된다.

가장 먼저 inintialization을 만나고 selection-screen에서 사용자의 입력 사항에 따라 해당하는 엔트리를 읽고, 데이터를 가공하여 결과를 보여준다.

이러한 프로세스 자체가 데이터를 읽고 조회하는 데 가장 적합하므로 흔히 report program이라 한다.

report program을 실행하였을 때 프로그램의 흐름은 각각 이벤트를 통해 통제 된다.

이벤트 블록(프로세싱 블록)은 selection-screen이나 리스트 등에서 일어나는 사용자 액션에 의해 발생하는 이벤트에 의해서 호출된다.

 

start -> initialization -> selection -> read an entry -> process an entry -> group processing -> list output.

(report 프로그램 flow)

 

02. 프로그램 생성

T-CODE:SE80

'WITH TOP INCL'의 의미는 INCLUDE프로그램을 미리 생성할 것인지를 선택하는 것이다.

1)Excutive program

  • t-code없이 se38에서 직접 실행 가능
  • selection screen과 output list로 구성
  • logical DB 사용가능

2) Module pool

  • screen painter screen (M)
  • screen module processing
  • t-code나 menu function에 의해서만 실행됨

3)Include (I)

  • 다음 프로그램에서 Include로 호출되는 내장형 프로그램

4)Subroutine(S)

  • External perform 구문에서 호출해서 사용 가능한 form 문을 구성
  • 기타 유형 
  • F~K는 Program attribute에서 변경할 수 없으며 각각의 builder에서 관리함

Report 프로그램의 구조

 

  • SELECTION- OPTIONS
  • INITIALIZATION
  • START-OF-SELECTION
  • END-OF-SELECTION
REPORT  Z12_01.

DATA: gt_sfligt type TABLE OF sflight,
      gs_sflight type sflight.

SELECT-OPTIONS : s_carrid FOR gs_sflight-carrid.

INITIALIZATION.
  s_carrid-sign = 'I'.
  s_carrid-option = 'EQ'.
  s_carrid-low = 'AA'.
  APPEND s_carrid.

START-OF-SELECTION.
  SELECT carrid connid
  FROM sflight
  INTO CORRESPONDING FIELDS OF TABLE gt_sflight
  WHERE carrid IN s_carrid.

END-OF-SELECTION.
 LOOP AT gt_sflight INTO gs_sflight.
  WRITE: / gs_sflight-carrid, gs_sflight-connid.
ENDLOOP.

select-option 또는 parameters로 데이터를 선언하고 리포트 프로그램을 실행하게 되면 자동으로 값을 입력받을 수 있는 화면이 생성된다. 사용자에게 조회 조건 값을 입력받을 수 있는 이 화면을 selection screen이라고 정의한다.

03. 프로그램 로직(선언)

report 프로그램은 다음과 같이 크게 3가지 구조로 분류할 수 있다.

  1. 데이터 선언부와 조회선택 화면(SELECTION SCREEN)
    1. 프로그램 및 데이터 선언
      1. REPORT pgm_id
      2. TABLES : sflight
      3. DATA: l_carrid type sflight-carrid
      4. SELECTION SCREEN
        1. SELECT-OPTIONS : SEL_CARR FOR sflight_CARRID.
        2. PARAMETERS: P_CARR LIKE sflight-carrid
  2. 실행시점까지의 Event
    1. INITIALIZATION
    2. AT SELECTION-SCREEN
      1. START OF SELECTION
        1. SELECT * FROM TABLE
      2. END OF SELECTION
  3. 데이터를 뿌려주는 List Event
    1. TOP OF PAGE
    2. END OF PAGE
    3. AT LINE-SELECTION
    4. AT PF<NN>
    5. AT USER-COMMAND.

03-01. 프로그램 선언문

프로그램을 선언하는 구문에는 'REPORT <프로그램 이름>'의 기본 구조에 추가 옵션들이 존재한다.

1) 프로그램 LIST Heading 지정 : REPORT Z12_O2

2) Line-size : output list의 넓이를 지정한다. 넓이를 0으로 설정하거나, line-size 구문을 삭제하면 표준 길이를 사용하게 된다.

REPORT : Z12_03 LINE-SIZE 30.

3) Message ID

ABAP프로그램에서 사용할 MESSAGE ID를 선언한다.

REPORT:Z12_04 MESSAGE-ID <message-id>.

03-02. DATA 선언

프로그램에서 사용하게 될 테이블과 데이터를 선언하게 된다.

복잡한 프로그램에서는 INCLUDE(프로그램)TOP구문에 포함된다.

INCLUDE 프로그램은 모듈 풀 프로그램에서 주로 사용되며, R/3 Repository에 저장되는 오브젝트로서 독립적으로 실행될 수 없는 프로그램이다. 

TABLE구문은 프로그램 내에서 사용되는 TABLE을 선언하는 것이고, 이렇게 선언된 TABLE과 같은 형태의 구조체(Work area)역할을 수행하게 된다.

'SELECT * FROM SFLIGHT WHERE~'구문만으로 sflight는 하나의 구조체 변수로 활용할 수 있다.

REPORT pgm_id
INCLUDE pgm_idTOP.

TABLES: sflight.
DATA : lv_carrid TYPE sflight-carrid.

03-03.SELECTION SCREEN

프로그램의 조회 조건을 입력할 수 있는 selection screen을 생성하는 부분이다.

리포트 프로그램이 실행되면, selection screen이 자동으로 생성된다.

selection screen은 사용자와 상호작용을 하기 위한 input 필드와 같이 선택 조건을 입력할 수 있는 화면을 제공한다. 리포트 프로그램에서 selection screen은 include 프로그램SEL(또는 top)에 포함하는 것이 좋다.

selection screen은 프로그래머가 정의하지 않아도 자동으로 스크린을 생성하고 flow logic을 구현하도록 도와준다.

SELECT-OPTIONS : sel_carr FOR sflight-carrid.
PARAMETERS: p_carr LIKE sflgiht-carrid.
SELECTION-SCREEN BEGIN OF BLOCK bl1
with FRAME TITLE TEXT-010
SELECTION-SCREEN END OF BLOCK bl1.

03-03-01. parameters

parameters는 사용자가 값을 입력하도록 input 필드를 정의한다.

다음 구문을 사용하여 변수를 선언한다.

data type f는 selectoin screen에서 지원되지 않으므로 파라미터로 선언될 수 없다.

PARAMETERS <P>{(<LENGTH>)}<type>[<decimals>].

PARAMETERS 변수와 같이 TYPE이 정의하지 않으면 기본 char 1자리 type이 정의된다.

parameters에 입력된 값은 데이터를 조회하는 select구문의 조건 등에 사용된다.

파라미터는 1개의 값만 입력받을 수 있으며, 체크박스로 보이는 것과 같은 옵션을 추가할 수있다.

REPORT  Z12_01.
DATA: 1_fname(20) TYPE C.
PARAMETERS: P_1 OBLIGATORY,
            P_2 AS CHECKBOX.

  • 파라미터 옵션
    • DEFAULT 'A'
    • TYPE CHAR10
    • LENGTH n,
    • DECIMALS dec
    • LIKE g
    • MEMORY ID pid
    • MATCHCODE OBJECT mobj
    • MODIF ID modid
    • NO-DISPLAY
    • LOWER CASE
    • OBLIGATORY : 필수 필드로 지정함. 화면 필드에는 물음표(?)가 표시됨
    • AS CHECKBOX : CHECK BOX로 표현함
    • RADIOBUTTON GROUP raid : 라디어 버튼으로 표현함. 두 개 이상의 필드를 Radio group으로 선언하여야
    • VISIBLE LENTHE vlen
    • VALUE CHECK
    • LIKE(g)
    • AS LISTBOX
    • USER-COMMAND ucom
    • AS SEARCH PATTERN
    • VALUE-REQUEST
    • HELP-REQUEST

03-03-02. SELECT-OPTION

parameter가 하나의 값만 입력받을 수 있는 input 필드인 반면에 SELECT-OPTIONS는 2개의 INPUT 필드를 통해 다양한 조건 값(Selection criteria)을 입력받을 수 있다.

RANGE변수와 같은 구조(인터널 테이블)를 가지고 있다.

SELECT-OPTION은 FOR구문과 항상 병행하여야 하며, 이때 FOR구문 다음에 올 수 있는 값은 TABLE로 선언된 테이블 필드 명이나 DATA로 선언된 변수 이어야 한다.

SELECT-OPTION <seltab> FOR <f>.
  • Selection-options 옵션
    • DEFAULT g -  기본 값을 세팅함
    • DEFAULT g OPTION op SIGN s
      • option과 sign을 지정함
      • option
        • EQ : 같다
        • BT : 사이값
        • NB:  사이값 제외
        • GE: 이상
        • LE: 이하
        • GT: 초과
        • LT: 미만
        • NE: 같지 않다
      • SIGN
        • i : inclusive
        • e: exclusive 
      • DEFAULT g TO h : selection option의 low값에서 high 값을 지정. 구간 값을 지정함
      • DEFAULT g TO h OPTION op SIGN s: option은 bt와 nb만 가능함
      • MEMORY ID pis : 메모리 파라미터 지정
      • NO-DISPLAY : 화면에 보이지 않음
      • LOWERCASE : 대소문자 구별함
      • OBLIGATORY : 필수 필드로 지정함. 화면 필드에는 물음표(?)가 표시됨
      • NO-EXTENSION : 버튼을 제거함
      • NO-INTERVALS : high 값을 제거함
      • VISIBLE LENGTH vlen : 필드의 일부 길이 까지만 화면에 보이게 설정함
      • NO DATABASE SELECTION
      • VALUE-REQUEST
      • HELP-REQUEST
REPORT  Z12_01.
TABLES : sflight.
DATA: gs_scarr TYPE scarr.
DATA: gv_val TYPE char20.
SELECT-OPTIONS : s_1 FOR sflight-carrid DEFAULT 'AC',
                 s_2 FOR gs_scarr-carrid DEFAULT'AA*'
                                            OPTION EQ SIGN I,
                 s_10 for sflight-carrid OBLIGATORY,
                 s_11 for sflight-carrid VISIBLE LENGTH 1.

03-03-03. SELECTION-SCREEN -> 이거 다시!!!!

PARAMETER와 SELECT-OPTION을 사용하면, ABAP 프로그램이 자동으로 필드 내역과 길이를 조절하여 화면(SELECTION SCREEN)을 생성한다.

시스템이 생성하는 화면을 사용자 입맛에 맞게 화면 구성 요소들을 배치하고 싶으면 SELECTION - SCREEN구문을 이용할 수 있다.

 

SELECTION SCREEN 옵션

  • SELECTION-SCREEN BEGIN OF LINE ~SELECTION-SCREEN END OF LINE :파라미터를 여러 개 묶어서 한 라인으로 생성. 라인에서 select - options, selection-screen skip n구문을 사용할 수 없음
  • SELECTION-SCREEN SKIP n : 빈 라인을 n개 삽입함
  • SELECTION-SCREEN ULINE : 언더라인을 추가함. 
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN ULINE.
SELECTION-SCREEN ULINE /1(10).
SELECTION-SCREEN ULINE pos_low(10).
SELECTION-SCREEN ULINE pos_high(10).

  • SELECTION-SCREEN POSITION pos.: selection-screen begin of line 블록 안에서 파라미터의 위치를 지정함
  • SELECTION-SCREEN COMMENT fmt name. :
  • SELECTION-SCREEN PUSHBUTTON fmt name USER-COMMAND ucom.
  • SELECTION-SCREEN BEGIN OF BLOCK block~SELECTION-SCREEN END OF BLOCK block : parameter, select-option 등 블록 형성. with frame: 프레임을 추가함. TITLE title:프레임의 title을 추가함. NO INTERVALS: 블록 안의 SELECT-OPTIONS의 LOW값만 보임
SELECTION-SCREEN BEGIN OF BLOCK block WITH FRAME TITLE text-003.
PARAMETERS: p_3 TYPE c.
SELECT-OPTIONS : s_1 for scarr-carrid.
SELECTION-SCREEN END OF BLOCK block.

  • SELECTION-SCREEN FUNCTION KEY n. : 펑션 키 추

 

03-04. Message ID

ABAP 프로그램 화면 하단에 Message를 보여주려면 리포트 선언 첫 문장에 message-id를 기술해야 한다.

REPORT <Report name> MESSAGE-ID <message-id>.

Message ID 생성

T-CODE: SE91

04. 프로그램 구조(이벤트)

이번 장에서는 프로그램을 실행하면 화면에 보이는 필드들을 초기화 하고, 사용자가 입력한 값에 대한 결과를 반화하는 사용자 이벤트에 대해서 학습한다.

<flow>

  • INITIALIZATION :selection screen 화면이 열리기 전에 화면 필드 값을 초기화하는데 주로 사용한다.
  • AT SELECTION-SCREEN : 사용자가 selection screen에 값을 입력하기 전/후에 작동한다.
  • START-OF-SELECTION : 사용자가 실행버튼(f8)을 클릭하면 데이터베이스에서 값을 읽어온다. 일반적으로 select 구문이 사용되는 블록이다.
  • END-OF-SELECTION : 데이터를 읽은 후의 작업을 수행하는 블록이다.

04-01. INITIALIZATION

이벤트 중에서 프로그램을 실행했을 때 가장 먼저 수행되는 것은 initialization이다. 이 이벤트는 SELECTION-SCREEN이 조회되기 전에 작동하므로 변수에 초깃값을 지정할때 흔히 사용된다. 즉 , INITIALIZATION 이벹느에서 SELECTION-SCREEN에 사용되는 필드 들의 초깃값을 지정함으로써, 사용자가 자주 사용하는 값을 자동으로 입력되게 한다.

INITIALIZATION.
p_1 = 'AA'.


REPORT  Z12_01 MESSAGE-ID zmessage.
TABLES : sflight.

PARAMETERS : p_carrid LIKE sflight-carrid,
             p_connid LIKE sflight-connid.
SELECT-OPTIONS : s_flight FOR sflight-fldate.

INITIALIZATION.


p_carrid = ' AA'.
p_connid = '17'.
s_flight-low ='20150101'.
s_flight-high = '20151231'.
APPEND s_flight.

SELECT OPTION은 인터널 테이블 형태이기 때문에 반드시 APPEND 구문으로 데이터를 추가하여야 한다.

데이터 할당과 APPEND는 항상 싸으로 움직여야 한다.

 

04-02. AT SELECTION-SCREEN

SELECTION-SCREEN에서 Input field 의 값이 변동되었을 때 실행되는 이벤트이며,

initialization과 start-of-selection 사이에 수행되어 사용자 액션에 대해 반응하고 화면 필드를 조절한다.

예를 들어 selection- screen에 사업부 필드가 존재하고, 사용자는 다른 사업부의 데이터를 조회하지 못하도록 설정해야할 상황이 생길 수 있다.

이때는 사용자가 사업부 코드를 변경하면 AT SELECTION-SCREEN 이벤트가 자동으로 실행되기 때문에 해당 이벤트에

권한 체크 로직을 추가하면 된다.

AT SELECTION-SCREEN.
AUTHORITY-CHECK OBJECT 'Z-TEST'
  ID 'CARRID' FIELD pa_carr
  ID 'ACTVT' FIELD '03'.
IF SY-SUBRC = 4.
  MESSAGE e000 with ' you need a authority'/
end if.

이벤트 기능 개별옵션들

1) AT SELECTION-SCREEN ON <FIELD>

SELECTION SCREEN에서 전달되는 특정필드에 대해 수행한다. 오류 메세지가 발생하면 해당 피드는 다시 값을 입력받도록 커서가 위치하게 된다.

AT SELECTION-SCREEN ON <FIELD>.

REPORT  Z12_01 MESSAGE-ID zmessage.
TABLES : scarr.

SELECT-OPTIONS: s_carrid FOR scarr-carrid.

AT SELECTION-SCREEN ON s_carrid.

if s_carrid NE 'AA'.
  MESSAGE E000.
ENDIF.

실행화면

2) AT SELECTION-SCREEN ON END OF sel.

SELECTION SCREEN에서 여러 건의 값을 입력할 떄, 전체 SELECTION TABLE의 입력 값을 제어할 수 있다.

즉 하한/상한 값, 미 입력 값 등을 체크할 때 사용할 수 있다.

AT SELECTION-SCREEN ON END OF sel1.

REPORT  Z12_01 MESSAGE-ID ZMESSAGE.

TABLES: scarr.
SELECT-OPTIONS : s_carrid  FOR scarr-carrid.

AT SELECTION-SCREEN ON END OF s_carrid.
  LOOP AT s_carrid.
    if s_carrid-LOW is initial.
      MESSAGE e000.
    ENDif.
ENDLOOP.

3) AT SELECTION-SCREEN OUTPUT

SELECTION-SCREEN 화면의 LAYOUT 속성(강조, 조회 전용 과 같은 필드 속성)을 설정할 수 있다.

T-CODE: SE11에서 'SCREEN' 테이블 조회해서 확인 후 추가 가능하다.

AT SELECTION-SCREEN OUTPUT.

SCREEN은 스탠더드에서 정의된 구조체로 ABAP Dictionary Workbench에서 SCREEN 필드를 조회할 수 있다. SCREEN의 해당 구성 요소를 적절한 갑으로 변경함으로써, SCREEN LAYOUT을 사용자의 의도에 맞게 설정할 수 있다.

모든 스크린 필드들은 시스템 테이블인 SCREEN에 저장된다.

LOOP AT SCREEN이라는 구문을 통해 해당 스크린 필드들이 차례대로 SCREEN헤더에 복사되고 각필드의 속성을 SCREEN의 구성요소 값에 의해 통제할 수 있다. 그리고 최종적으로 MODIFY SCREEN을 이용해 실제로 값을 적용시키게 된다.

4) ON VALUE-REQUEST FOR psel_low_high

ABAP Dictionary에서 제공해주는 possible entry대신 사용자가 정의해준 entry가 보이게 설정하 ㄹ수 이싿.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR psel_low_high.

5) ON HELP-REQUEST FOR<FIELD>

ABAP Dictionary에 해당 필드의 도움말이 없거나 기존의 도움말을 대신해서 표현하고자 할 때 사용된다.

SELECTION SCREEN의 필드를 선택하고 F1을 눌렀을 때 수행된다.

Logical Database에 선언된 값들은 제어할 수 없으며 parameters, select - options로 선언해서 제어할 수 있다.

AT SELECTION-SCREEN ON HELP-REQUEST FOR <field>.

04-03. START-OF-SELECTION

조회 화면의 필드에 대한 초깃값 세팅 및 데이터 검증이 완료되었다면

이제 데이터베이스에서 원하는 데이터를 가져오는 실질적인 작업을 수행하여야 한다.

logical database를 이용한 프로그램이라면 get 구문 일반 프로그램이라면 sql문이 수행된다.

sql 수행 이전에 clear 구문이나 로직 상의 준비작업을 한 후에 select 를 수행하는 것이 좋다.

select를 수행하면서 시간이 지연될 경우 sapgui_progress_indicator함수를 이용해 모래시계를 보여주는 것도 좋은 방법이다.

04-04. END-OF-SELECTION

실행 환경에서 호출되는 마지막 이벤트로서 select 구문에서 모든 데이터를 읽은 후 화면에 write 하기 전에 수행된다.

인터널 테이블에 저장된 데이터들을 변형하는 작업을 할 수 있다.

END OF SELECTION.


REPORT  Z12_12.

DATA: gs_str TYPE scarr,  
      gt_itab TYPE TABLE OF scarr.

START-OF-SELECTION.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM scarr.

END-OF-SELECTION.
LOOP AT gt_itab INTO gs_str.
  WRITE: / gs_str-carrid, gs_str-carrname.
ENDLOOP.

05. 프로그램 구조(List Process 이벤트)

조회 화면에서 조회 조건 입력값을 입력한 후 사용자가 실행버튼을 클릭하거나 F8키를 눌렀을때 데이터를 화면에 뿌려주는 List process 이벤트에 대해서 학습한다.

TOP-OF-PAGE
END-OF-PAGE
AT LINE-SELECTION
AT PF<NN>
AT USER-COMMAND.
  • TOP-OF-PAGE: 새로운 페이지가 시작될 떄 수행되는 List process 이벤트 이다.  start of selection에서 첫번째 write를 만나면 수행되고, 새로운 페이지 마다 수행된다.
  • END-OF-PAGE : 페이지 끝에서 수행되는 블록이다
  • AT LINE-SELECTION : LIST에서 라인을 더블 클릭하거나 F2키를 눌렀을 경우 수행되는 이벤트이다.
  • AT PF<NN>: PF<nn>으로 선언된 function을 수행한다.
  • AT-USER-COMMAND : 프로그램에서 Function으로 선언된 기능을 수행한다.
  • top-of-page furing line-selection: secondary list에서 header를 control할때 사용하는 이벤트 이다.

05-01. TOP - OF - PAGE

새로운 페이지에 첫 번째 데이터가 출력되기 전에 수행된다.

그리고 NO STANDARD PAGE HEADING 옵션으로 생선된 프로그램에서 직접 HEADER를 입력할때 사용한다.

추가적인 옵션이 없을 때에는 기초적인 LIST 생성 시에만 사용된다.

NEW-PAGE구문에서는 EVENT를 수행하지 않는다.

현재 PAGE에서 고정된 HEADER로 지정되기 때문에 스크롤을 해도 움직이지 않는다.

REPORT  Z12_12.
TOP-OF-PAGE.
  WRITE: sy-title, 60 'page no:', sy-pagno.
  ULINE.
  WRITE:/ 'Enjoy ABAP', sy-datum.
  ULINE.

START-OF-SELECTION.
  DO 50 TIMES.
    WRITE: / sy-index.
  ENDDO.

 

05-02. END - OF - PAGE

END-OF-PAGE는 현재 페이지의 남은 공간이 부족할때 수행되는 이벤트 이다.

즉 페이지의 Footer를 지정하게 된다. 

아래와 같이 명시적으로 line-count를 지정하면 페이지가 line-count 수를 넘어가면 수행된다.

'line-count 10(2)'의 숫자 10은 한 페이지의 총 라인 수를 의미하며, (2)는 page footer에 뿌려줄 라인 수를 의미한다. line-count 옵션을 사용하지 않는 경우, default line-size는 83 칼럼이며, default line-count(높이)는 60,000 line이다.

line-size, line-count는 반드시 숫자를 사용하여야 하며, 데이터 오브젝트를 사용할 수 없다. 프로그램 내에서 new-page이벤트를 추가하였다면 end-of-page는 수행되지 않는다.

REPORT  Z12_14 LINE-COUNT 10(2).

TOP-OF-PAGE.
WRITE: 'Top of Page'.
ULINE AT /(60).

END-OF-PAGE.
ULINE.
WRITE: /30 'Page no :', sy-pagno.

START-OF-SELECTION.
DO 20 TIMES.
    WRITE: / sy-index.
ENDDO.

REPORT  Z12_14 LINE-SIZE 60 LINE-COUNT 10(2).

TOP-OF-PAGE.
WRITE: 'Top of Page'.
ULINE AT /(60).

END-OF-PAGE.
ULINE.
WRITE: /30 'Page no :', sy-pagno.

START-OF-SELECTION.
DO 20 TIMES.
    WRITE: / sy-index.
ENDDO.

 

05-03. AT LINE-SELECTION

report의 한 라인을 더블 클릭 하거나 f2키를 눌렀을 때 발생하는 이벤트이다.

이때 발생하는 sy-ucomm시스템 변수에는 'pick'이 할당된다.

예제 12-16에서 format hotspot구문을 사용하며, 해당 라인은(클릭=더블 클릭)의 효과를 가져오게 된다. 색상 및 inverse를 예제와 같이 지정할 수 있다. on 구문으로 시작하였으면, 반드시 off 구문으로 끝내야한다.

REPORT  Z12_14.
START-OF-SELECTION.
  WRITE: 'First Line'.
 
 FORMAT HOTSPOT ON COLOR 7.
 WRITE: / 'Click this line'.
 FORMAT HOTSPOT OFF COLOR OFF.

AT LINE-SELECTION.
   WRITE: ' Secondary list'.
   WRITE:/ 'sy-ucomm =', sy-ucomm.
REPORT  Z12_17.

DATA: GS_SCARR TYPE SCARR,
      GT_SCARR TYPE TABLE OF SCARR,
      GV_FNAME(20) TYPE C,
      GV_VALUE(20) TYPE C,
      GV_CARRID LIKE SCARR-CARRID,
      GV_CARRNAME LIKE SCARR-CARRNAME.

AT LINE-SELECTION.
 GET CURSOR FIELD GV_FNAME VALUE GV_VALUE.

CASE GV_FNAME.
  WHEN 'GS_SCARR-CARRID'.
    SPLIT SY-LISEL AT ' ' INTO GV_CARRID GV_CARRNAME.
    WRITE: GV_CARRID, GV_CARRNAME.

  WHEN OTHERS.
ENDCASE.

START-OF-SELECTION.
  SELECT *
   INTO CORRESPONDING FIELDS OF TABLE GT_SCARR
    FROM SCARR.

LOOP AT GT_SCARR INTO GS_SCARR.
  WRITE: / gs_scarr-carrid, gs_scarr-carrname.
ENDLOOP.

GET CURSOR 구문은 현재 커서의 필드명, 라인 값을 가져오는 명령어 이다.

아래 결과 값에서 ' AF air france'라인을 더블클릭하게 되면

at line-selection 부분이 실행되고 

get cursor 구문에서 필드명과 값을 할당받는다.

 

A

AT LINE-SELECTION.
 GET CURSOR FIELD GV_FNAME VALUE GV_VALUE.

특이한 점은 위 get cursor구문에서 'value gv_value'를 삭제해도 작동은 하는데

'get cursor field gv_value'하면 커서가 작동하지 않는다.

 

아래 구문을 이해해야함..

sy-lisel시스템 변수는 list에서 선택한 라인의 값 전부를 가지고 있다.

split 구문을 이용하여 시스템 변수 sy-lisel을 공백 ' ' 으로 구분하여 각 gv_carrid, gc_connid변수에 값을 할당한다..

CASE GV_FNAME.
  WHEN 'GS_SCARR-CARRID'.
    SPLIT SY-LISEL AT ' ' INTO GV_CARRID GV_CARRNAME.
    WRITE: GV_CARRID, GV_CARRNAME.

  WHEN OTHERS.
ENDCASE.

05-04. AT PF(NN)

PF<nn>으로 선언된 function을 수행한다.

function kye nn번을 눌렀을 떄 발생하는 이벤트 이다.

<nn>은 1~ 24번 까지의 숫자이다.

REPORT  Z12_18.

START-OF-SELECTION.
WRITE: 'Function key Test PF5,PF6,PF7'.

AT PF5.
  PERFORM wlist.

AT PF6.
  PERFORM wlist.

AT PF7.
  PERFORM wlist.

Form Wlist.
  WRITE:
 / ' You selected below functoin key.',
/ 'sy-ycomm=', sy-ucomm.

ENDFORM.

05-05. AT USER-COMMAND

 

GUI STATUS를 먼저 생성해야하며, 해당 내용은 여기서 참고 -> [참고] GUI Status 생성 (SET PF-STATUS) (tistory.com)

REPORT  Z12_19.

START-OF-SELECTION.
SET PF-STATUS 'TEST'.
WRITE: 'Click the button'.

AT USER-COMMAND.
CASE SY-UCOMM.
WHEN 'FC1'.
 LEAVE PROGRAM.
ENDCASE.

05-06. TOP-OF-PAGE DURING LINE-SELECTION -> 이거 작동을 안해서 한번 더 확인 요망

 

REPORT  Z12_20.

TOP-OF-PAGE.
 WRITE: 'First list TOP-OP-PAGE'.
 ULINE.

TOP-OF-PAGE DURING LINE-SELECTION.
WRITE 'Secondary List Top-of-page'.
  uline.

AT SELECTION-SCREEN.
perform write_list.

START-OF-SELECTION.
  write: 'double-click this line'.

form write_list.
write: 'secondary list',
/' sy-pfkey:' , sy-pfkey.
ENDFORM.
REPORT  Z12_21.

data: lt_scarr TYPE STANDARD TABLE OF scarr WITH HEADER LINE.
DATA: ls_scarr TYPE scarr,
      lv_chk TYPE C,
      ls_fldname(30),
      lv_fldval(50).

START-OF-SELECTION.
  SELECT * INTO TABLE lt_scarr FROM scarr.

END-OF-SELECTION.
LOOP AT lt_scarr.
  write: / lv_chk AS CHECKBOX,
   sy-vline, lt_scarr-carrid, lt_scarr-carrname.
   HIDE: lt_scarr-carrid, lt_scarr-carrname.
ENDLOOP.

AT LINE-SELECTION.
  CHECK sy-lsind = 1.
WINDOW STARTING AT 5 5 ENDING AT 55 10.
WRITE: / ' you selected below data'.
WRITE: / lt_scarr-carrid, lt_scarr-carrname.

상세한 내용은 여기 ->[참고] HIDE AREA (tistory.com)

05-07. WRITE 구문 -> 이건 시간 날때 다시 해보장..

write구문은 output 리스트에 데이터를 쓰는 기능을 주고 하게 되며,

값을 할당하는 (move) 기능도 수행한다. 리스트 용으로 사용될 때에는 데이터를 list buffer에 저장한다.

output리스트에 사용될 수 있는 항목은 다음과 같다.

  • data 구문으로 선언된 필드
  • tables 구문으로 선언된 구조체의 항목
  • field-symbol로 선언된 필드 심볼
  • 언어에 종속적이지 않은 text 문장

05-07-01. AT pl

WRITE AT pl. (position and length specification)

05-07-02. write option

WRITE option. (formatting option)

05-07-03. write output 포맷

WRITE ofmt(output format by field)

05-07-04. write as checkbox

WRITE OUTPUT AS CHECKBOX.

05-07-05. write as symbol.

WRITE OUTPUT AS SYMBOL.

05-07-06. write as icon

WRITE OUTPUT AS ICON.

05-07-07. write as line

WRITE OUTPUT AS LINE.

05-07-08. write as quickinfo

06. Calling program -> 이것도 다음에.. 지금 이해하기 어렵다..

프로그램 수행시 하나의 프로그램을 여러 명의 개발자가 동시에 개발해야 하는 경우가 발생할 수 있다.

즉, 프로그램이 매우 복잡한 기능을 수행해야하는 경우, 기능별로 프로그램을 나누어서 개발하는 것도 좋은 방법이다(모쥴화).

이렇게 구성된 패키지 프로그램은 메인 프로그램에서 사용자의 요구에 따라 각각의 프로그램을 호출하여 사용한다.

프로그램 호출 

  실행 가능한 프로그램 호출 트랜잭션 호출
타 프로그램 호출 후 복귀 X SUBMIT LEAVE TO TRANSACTION
타 프로그램 호출 후 복귀 O SUBMIT AND RETURN CALL TRANSACTION

06-01. 리포트 프로그램 호출

06-02. 트랜잭션 호출

07. BDC 프로그램

SAP을 설치하고 난 후 기존의 시스템 또는 외부 시스템에서 오랫동안 축적된 데이터를 SAP에 맞는 데이터 형태로 가져와야 한다.

물론 외부 시스템과 연동하여 SAP을 사용하게 된다면 지속적으로 이러한 작업이 필요하다.

이럴 때는 데이터 전송 프로그램을 생성해야하며 이때 Data Transfer Workbench를 사용할 수 있다.

 Data Transfer Workbench는 데이터 전송을 위한 일련의 작업들을 총괄해주는 tool이라 할 수 있다.

레거시 시스템에서 데이터를 추출해내고 SAP 포맷에 맞는 형태로 데이터를 생성한 후 SAP으로 데이터를 전송하게 된다.

전송 방법에는 BAPI, Batch input, direct input 등의 기술을 사용한다.

이중 batch input을 사용하는 데 필요한  BDC 프로그램을 어떻게 작성하는지 살펴보장..

 

일반적으로 Batch input 프로그램을 BDC(Batch Data Communication)프로그램이라고 한다. BDC는 ABAP 프로그램이라기보다는 TOOL에 가깝다. 그러나 실무에는 아주 많이 사용되고 중요한 부분이기 때문에 개념위주로 정리한다.

 

 SAP에서는 ERD를 제공하고 있지 않기때문에 BDC를 이용하여 실제 우리가 사용하는 트랜잭션과 같은 화면(프로세스)을 진행하면서 데이터를 생성하거나 변경하게 된다. 이외에도 트랜잭션을 수행하여 데이터를 변경하면 로그 정보가 저장되어 임의로 비즈니스 정보를 조작하 ㄹ수 없다는 장점도 있다.

 

BDC프로그램은 Batch Input 세션을 생성하여 실행하는 방법과 프로그램 내에서 CALL TRANSACTION 구문으로 트랜잭션을 호출하는 방법을 나누어 진다.

 

07-01. Batch Input 이용

batch input은 주로 대량의 데이터를 전송할때 사용되므로 실시간 데이터 전송에는 적합하지 않다.

이 경우에는 call transaction을 이용하는 것이 바람직하다.

전형적으로 신규로 설치된 SAP R/3에 레거시 시스템 데이터를 이전할 떄 사용하고 일 단위 짧게는 시간단위로 외부 시스템 데이터를 가져올 때 사용된다.

07-02. Call Transaction 이용  -> 이거 만드는 방법은 나중에 상세하게 살펴보장..

사용자가 트랜잭션을 실행하여 화면에 값을 입력하는 프로세스를 프로그램으로 구현하여

엑셀과 같은 파일 형태로 데이터를 표준 프로그램에 입력하는 방법이다.

실무에서 많이 사용되며, Batch Input Session을 생성하지 않고 ABAP프로그램 내에서 CALL TRANS-ACTION 구문을 이용하여 데이터를 입력하게 된다.

CALL TRANSACTION <tcode>
	USING <bdc_tab>
 OPTION FROM <cts_params>
   MODE <mode>
   UPDATE <update>
 MESSAGE INTO MESSTAB.
  • <tcode> : 트랜잭션 코드
  • <bdc_tab> : BDCDATA 구조의 인터널 테이블을 트랜잭션에 전달 한다.
  • <ctu_params> : call transaction 문의 옵션을 설정한다.

07-03. 레코딩 및 BDC 프로그램 생성 -> 이것도 지금 내 단계에서는 조금 어려운것 같아서 패스..

batch input을 수행하려면 batch input 프로그램이 있어야 한다.

이 프로그램을 만들려면 전송한 데이터가 어떤 트랜잭션을 수행해야하는 지 결정하는 레코딩 작업이 선행되어야 한다.

레코딩 작업의 주 목적은  BDC 프로그램 작성을 위한 것이라고 볼 수 있다.

 

BDC 프로그램을 만들기 위해 트랜잭션 레코딩에 대해 간단히 살펴보기..

 

1) 용도

  • Batch input 또는 call transaction을 실행하는 데이터 프로그램 생성
  • batch input 세션 생성
  • 테스트 데이터 생성
  • function module 생성

2) 특징

 

F1,F4(PROCESS ON HELP-REQUEST, PROGRESS ON VALUE-REQUEST)는 레코딩 되지 않는다.

그리고 ERROR나 Warning 메세지도 레코딩 되지 않는다.

이는 현 화면에서 성공적으로 다음 프로세스로 진행 할 수 있도록 하기 위함이다..

 

3.1 transaction recorder 수행

3.2 transaction recording을 이용하여 BDC 프로그램 생성