SAP - Report 프로그램 구조

신지수·2022년 3월 16일
4

SAP

목록 보기
4/10

1. 프로그램 구조(선언)

1-1. DATA


DATA: GT_M0323 LIKE ZOJT01_T0323 OCCURS 0 WITH HEADER LINE.

1-2. SELECTION SCREEN

  • 프로그램의 조회 조건을 입력할 수 있는 SELECTION SCREEN을 생성

1. PARAMETER

  • 사용자 정의 INPUT 필드를 정의
  • 1개의 값만 입력받을 수 있음(select-option과 같은 multiple 기능 x)

" 필수 선택 옵션 추가
PARAMETERS M_1 LIKE GT_M0324-ZGUBUN OBLIGATORY.

2. SELECT-OPTIONS

  • 사용자 정의 INPUT 필드를 정의
  • 2개의 값 입력받을 수 있음
  • SELECT-OPTIONS 쓸 때 참조할 TABLE-FIELD 선언해야 함. (PARAMETER는 선언 안해줘도 됨)
  • SELECT OPTIONS에서 참조하는 테이블이 있다면 Top Include에서 TABLES 명령을 통해 해당 테이블을 선언해주어야 에러가 발생하지 않음.

" 1. 기본 SELECT-OPTION
SELECT-OPTIONS S_DATE FOR GT_DATA-ZDATE.


" 2. TO 가 사라짐
SELECT-OPTIONS S_DATE FOR GT_DATA-ZDATE NO INTERVALS.


" 3. MULTIPLE이 사라짐
SELECT-OPTIONS S_DATE FOR GT_DATA-ZDATE NO-EXTENSION.


3. SELECT-SCREEN

  • 시스템이 생성하는 화면을 사용자 입맛에 맞게 구성요소를 배치

1-3. CONSTANTS, RANGE, DEFINE

1. CONSTANTS

  • X라는 값이 디폴트, 반복적으로 같은 값 쓸 때 사용

 GC_X TYPE C VALUE 'X'.

2. RANGES

  • 테이블의 필드를 참조해서 만듬
  • 무조건 INTERNAL 테이블이 됨
  • SIGN(I,E), OPTION(EQ = , BT <>, GT>), LOW, HIGH

GR_RANGE FOR MARA-MATNR.

3. DEFINE

  • 매크로라고 생각..

DEFINE _CLEAR.
CLEAR: &1, &1[].
END-OF-DEFINITION.

= CLEAR: GT_DATA, GT_DATA[] 같은 의미


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

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

2-1. INITIALIZATION

  • 프로그램을 실행했을 때 가장 먼저 수행.
  • 변수에 초깃값을 지정할 때 사용.

INITIALIZATION.
p_1 = 'AA'.

2-2. AT SELECTION-SCREEN

  • SELECTION-SCREEN에서 Input Field의 값이 변동되었을 때 실행되는 이벤트
  • INITIALIZATION과 START-OF-SELECTION 사이에서 수행
  • 사용자 액션에 대해 반응하고, 화면 필드를 조절

"AUTHORITY 체크 기능

AT SELECTION-SCREEN.
  AUTHORITY-CHECK OBJECT 'Z_TEST'
    ID 'CARRID' FIELD P_CARRID
    ID 'ACTVT' FIELD '03'.
  IF SY-SUBRC = 4.
    MESSAGE E000 WITH 'You need a authority'.
  ENDIF.

2-3. START-OF-SELECTION

  • 데이터베이스에서 원하는 데이터를 가져오는 실질적인 작업
  • LDB -> GET구문, 일반 프로그램 -> SQL 구문

" START-OF-SELECTION
" 아래 코드의 핵심은 실행버튼 눌렀을 때 밑에 PROGRESS BAR가 진행되는 것.
DATA: G_TOTAL TYPE I,
      G_CNT TYPE I,
      G_INDEX TYPE I.

DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT WITH HEADER LINE.

START-OF-SELECTION.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT.
    
  DESCRIBE TABLE GT_SFLIGHT LINES G_TOTAL.
  
  LOOP AT GT_SFLIGHT.
    G_CNT = G_CNT + 1.
    PERFORM PROGRESS_INDICATOR USING G_CNT G_TOTAL ' PROGRESSING... '.
  ENDLOOP.
  
  WRITE 'SUCCESS'.

2-4. END-OF-SELECTION

  • 실행 환경에서 호출되는 마지막 이벤트
  • SELECT 구문에서 모든 데이터를 읽은 후 화면에 WRITE 하기전에 수행
  • 인터널 테이블에 저장된 데이터들을 변형하는 작업 가능

" END-OF-SELECTION
" START-OF-SELECTION에서 데이터를 읽어봐 END-OF-SELECTION에서 데이터를 화면에 뿌려줌
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.
  
FORM PROGRESS_INDICATOR USING VALUE(P_CUR) VALUE(P_TOTAL) VALUE(P_TEXT).
  DATA: LV_TEXT(50) TYPE C, LV_IDX(3) TYPE N.
  
  LV_IDX = ( P_CUR / P_TOTAL ) * 100.
  
  CONCATENATE LV_IDX ' % : ' P_TEXT INTO LV_TEXT.
  
  CALL FUNCTION
    'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = LV_IDX
      TEXT = LV_TEXT
    EXCEPTIONS
      OTHERS = 0.
ENDFORM. 


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

조회 화면에서 조회 조건 입력 값을 입력한 후 사용자가 실행하면 데이터를 화면에 뿌려줌.

3-1. TOP-OF-PAGE

  • 새로운 페이지에 첫 번째 데이터가 출력되기 전에 수행
  • 페이지의 Header
  • NO STANDARD PAGE HEADING 옵션으로 생성된 프로그램에서 직접 HEADER를 입력할 때 사용
  • 추가 옵션이 없을 경우 기초적인 LIST 생성시에만 사용

" TOP-OF-PAGE
" 글머리 작성하기
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.

3-2. END-OF-PAGE

  • 현재 페이지의 남은 공간이 부족할 때 수행
  • 페이지의 Footer

"END-OF-PAGE  
"명시된 line-count, line-size를 넘어가면 수행
TOP-OF-PAGE.
  WRITE: 'Top of Page'.
  ULINE.
  
END-OF-PAGE.
  ULINE.
  WRITE: /30 'Page No:', SY-PAGNO.

START-OF-SELECTION.
  DO 20 TIMES.
    WRITE / SY-INDEX.
  ENDDO.    

3-3. AT LINE-SELECTION

  • report의 특정 line을 더블클릭하거나 f2키를 눌렀을 때 발생

START-OF-SELECTION.
  WRITE 'FIRST LIST'.
  
  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.

3-4. AT PF<'NN'>

  • 키보드 F키
  • Function Key nn을 눌렀을 때 발생(nn은 1~ 24번까지의 숫자)
" AT PF<NN>
" 키보드 f키 눌렀을 때 실행

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 Function Key',
  / 'SY-UCOMM = ', SY-UCOMM.
ENDFORM.

3-5. AT USER-COMMAND

  • 프로그램에서 Function으로 선언된 기능을 수행

GUI Status 생성(SET PF-STATUS)
[p.580]

  • 표준 리포트 프로그램에서 제공하는 메뉴를 삭제하거나 기능을 추가
  • ABAP프로그램 영역과 독립적으로 존재
  • T-CODE:SE41에서 생성하여 화면에 동적으로 추가
  • EXCLUDING옵션을 사용하여 메뉴 중 일부 비활성화 가능

3-6. TOP-OF-PAGE DURING LINE-SELECTION

  • Secondary List의 Header를 Control 할 때 사용

" TOP-OF-PAGE DURING LINE-SELECTION
" 하위 페이지 HEADING 설정
TOP-OF-PAGE.
  WRITE 'First List TOP-OF-PAGE'.
  ULINE.
  
TOP-OF-PAGE DURING LINE-SELECTION.
  WRITE 'SECONDARY LIST TOP-OF-PAGE'.
  ULINE.

AT LINE-SELECTION.
  PERFORM WRITE_LIST.

START-OF-SELECTION.
  WRITE: 'DOUBLIE-CLICK THIS LINE'.
  
FORM WRITE_LIST.
  WRITE: 'SECONDARY LIST',
  /' SY-PFKEY:', SY-PFKEY.
ENDFORM.

3-7. WRITE 구문

  • OUTPUT 리스트에 데이터를 쓰는 기능

1. AT pl

  • 필드의 위치와 길이를 지정

DATA: GT_DATA TYPE TABLE OF SFLIGHT WITH HEADER LINE.

TOP-OF-PAGE.
  WRITE:/50 'Report Format' CENTERED.
  WRITE:/48 '------------------' CENTERED.

SKIP.

START-OF-SELECTION.
  " 1번째 네모 블럭 위의 뚜껑과 양옆 
  WRITE:/(51) SY-ULINE, 53(68) SY-ULINE,
        / SY-VLINE NO-GAP, 51 SY-VLINE NO-GAP, 53 SY-VLINE NO-GAP, 120 SY-VLINE NO-GAP.
  
  WRITE: 2(9) 'Report No' NO-GAP CENTERED, SY-VLINE NO-GAP.
  WRITE: 12(9) '00001' NO-GAP CENTERED, SY-VLINE NO-GAP.

  WRITE: 54(11) 'Report Date' NO-GAP CENTERED, SY-VLINE NO-GAP.
  WRITE: 66(10) SY-DATUM NO-GAP CENTERED, 120 SY-VLINE NO-GAP.
  WRITE:/(51) SY-ULINE, 53(68) SY-ULINE.
SKIP.


4. 프로그램 만드는 순서

  1. DATA 선언 - 변수 선언
  2. 조회조건 만들기
  3. 실제 데이터 가져오기 (DB) -> START-OF-SELECTION
  4. 가져온 데이터를 가공
  5. 가공한 데이터를 화면에 뿌려줌 -> END-OF-SELECTION
profile
병아리 개발자🐥

0개의 댓글