본문 바로가기
ABAP

[step-3] executable program templete - PBO,PAI,CLS,F01

by 키노s 2025. 6. 24.

처음에는 잘 정리해서 기록해 놔야지로 시작했는데 의미가 없는 거라 생각이 듭니다.ㅠㅠ

많은 분들이 이미 초보부터 중급까지 잘 정리된 곳이 많네요~

그래도 시작은 했으니 종료는 짓겠습니다.

 

PBO, PAI은 ABAP을 하시면 대략적으로 다 아실거라 생각합니다.

간단한 설명과 프로그램 흐름 도식화를 참고하시면 됩니다.

 

 

1. PBO (Process Before Output)

🔹 정의

화면이 출력되기 전에 실행되는 로직입니다.
즉, SAP가 화면을 그리기 전에 PBO 모듈에 정의된 로직을 먼저 실행합니다.

🔹 주요 목적

  • 초기화 (변수 세팅)
  • 화면 필드 값 설정 (screen-name, screen-input, screen-invisible 등)
  • ALV/Grid 생성
  • 컨트롤 설정
  • 타이틀바, 메뉴 설정 (SET PF-STATUS, SET TITLEBAR)
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  DATA lt_excl TYPE TABLE OF sy-ucomm.

  SET PF-STATUS 'S0100' EXCLUDING lt_excl.
  SET TITLEBAR 'T0100'.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Module SET_ALV OUTPUT
*&---------------------------------------------------------------------*
MODULE set_alv OUTPUT.
  IF gv_alv100 IS INITIAL.
    PERFORM create_obj_dcontainer     USING gv_dct100.
    PERFORM create_split_container USING gv_dct100 gv_split100 gv_top100 gv_bot100.
    PERFORM create_sub_split_container USING gv_bot100 gv_subsplit gv_mid100 gv_tog100.
    PERFORM create_obj_grid USING gv_alv100 gv_mid100.
    PERFORM event_handler_register.
    PERFORM set_layout                USING gs_layo.
    PERFORM exclude_of_toolbar_button USING 'GT_EXCLUDE'.
    PERFORM set_dyn_lvc_fcat          USING gt_fcat.
    PERFORM set_sort                  CHANGING gt_sort.
    PERFORM set_display_100.
  ELSE.
    CALL METHOD gv_alv100->refresh_table_display
      EXPORTING
        is_stable      = gs_stb
        i_soft_refresh = ''.
  ENDIF.
ENDMODULE.

2. PAI (Process After Input)

🔹 정의

사용자가 화면에서 어떤 동작(버튼 클릭, 데이터 입력 등)을 한 후 실행되는 로직입니다.
SAP는 화면을 사용자가 조작하고 [Enter]나 버튼을 누르면 PAI 모듈을 수행합니다.

🔹 주요 목적

  • 사용자 입력값 유효성 검증
  • 버튼 이벤트 처리 (sy-ucomm)
  • 사용자 입력값을 기반으로 내부 테이블 수정/조회
  • 트랜잭션 처리 (ex. 저장, 삭제, 전송)
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
MODULE exit INPUT.
  CASE ok_code.
    WHEN 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  ok_code = sy-ucomm.
  CASE ok_code.
    WHEN 'CREATE'.
      PERFORM create_sto_check.
    WHEN 'REFR'.
      PERFORM refresh_init.

      CALL METHOD gv_alv100->refresh_table_display
        EXPORTING
          is_stable = VALUE lvc_s_stbl( row = abap_true col = abap_true ).
  ENDCASE.
ENDMODULE.

 

3. CLS : 클래스 정의 영역

🔹 주요 목적

  • 로컬 클래스 정의 (CLASS ... DEFINITION)
  • 클래스 구현부 (CLASS ... IMPLEMENTATION)
  • 주로 ALV 컨트롤 관련 클래스, 이벤트 핸들러, 또는 도메인 로직 캡슐화용 클래스 등을 정의합니다.
*----------------------------------------------------------------------*
*       CLASS LCL_ALV_GRID DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.

  PUBLIC SECTION.
    CLASS-DATA f_alv  TYPE c.

    METHODS : set_fixed_column,
      set_optimizer.

ENDCLASS.                    "LCL_ALV_GRID DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_ALV_GRID IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_alv_grid IMPLEMENTATION.

  METHOD set_fixed_column.
    CALL METHOD me->set_fixed_cols
      EXPORTING
        cols = 5.
  ENDMETHOD.                    "SET_FIXED_COLUMN

  METHOD set_optimizer.
    CALL METHOD me->optimize_all_cols
      EXPORTING
        include_header = 1.
  ENDMETHOD.                    "SET_OPTIMIZER

ENDCLASS.                    "LCL_ALV_GRID IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.

  PUBLIC SECTION.
    METHODS : handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.

    METHODS : handle_user_command
      FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.

    METHODS : handle_after_user_command
      FOR EVENT after_user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm .

    METHODS : handle_data_changed
      FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed e_onf4 e_ucomm.

    METHODS : handle_data_changed_finished
      FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified
                et_good_cells.

    METHODS : handle_hotspot_click
      FOR EVENT hotspot_click OF cl_gui_alv_grid
      IMPORTING e_row_id
                e_column_id.

    METHODS : handle_double_click
      FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row
                e_column.

    METHODS : handle_button_click
      FOR EVENT button_click OF cl_gui_alv_grid
      IMPORTING es_col_id
                es_row_no.

    METHODS : handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING sender
                e_fieldname
                e_fieldvalue
                es_row_no
                er_event_data
                et_bad_cells
                e_display.

    METHODS : handle_top_of_page
      FOR EVENT top_of_page OF cl_gui_alv_grid
      IMPORTING e_dyndoc_id.

ENDCLASS.  "(LCL_EVENT_RECEIVER DEFINITION)

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.

*-- ToolBar 버튼생성
  METHOD handle_toolbar.
    PERFORM toolbar_pros  USING e_object e_interactive.
  ENDMETHOD.                    "handle_toolbar

*-- ToolBar에 생성된 버튼(Function)들에 대해서 처리
  METHOD handle_user_command.
    PERFORM user_command_pros USING e_ucomm.
  ENDMETHOD.                    "handle_user_command

*-- Event 처리후
  METHOD handle_after_user_command.
    PERFORM after_user_command USING e_ucomm.
  ENDMETHOD.                    "HANDLE_AFTER_USER_COMMAND

*-- Data change할때
  METHOD handle_data_changed.
    PERFORM data_changed  USING er_data_changed e_onf4 e_ucomm.
  ENDMETHOD.                    "handle_data_changed

*-- Data change한 후
  METHOD handle_data_changed_finished.
    PERFORM data_changed_finished USING e_modified
                                        et_good_cells.
  ENDMETHOD.                    "HANDLE_DATA_CHANGED_FINISHED

*-- Hotspot click
  METHOD handle_hotspot_click.
    PERFORM hotspot_click USING e_row_id e_column_id.
  ENDMETHOD.                    "handle_hotspot_click

*-- Double Click
  METHOD handle_double_click.
    PERFORM double_click  USING e_row e_column.
  ENDMETHOD.    "handle_double_click

*-- Button Click
  METHOD handle_button_click.
    PERFORM button_click  USING ES_COL_ID
                                ES_ROW_NO.
  ENDMETHOD.    "handle_button_click

*-- On help f4 - Search Help
  METHOD handle_onf4.
    PERFORM on_f4 USING sender
                        e_fieldname
                        e_fieldvalue
                        es_row_no
                        er_event_data
                        et_bad_cells
                        e_display.
  ENDMETHOD.                    "HANDLE_ONF4


*-- top of page
  METHOD handle_top_of_page.
    PERFORM top_of_page USING gv_header100.
  ENDMETHOD.                    "HANDLE_TOP_OF_PAGE
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION

 

4. F01 : FORM 루틴 구현 영역

🔹 주요 역할

  • 프로그램에서 사용하는  FORM 루틴(서브루틴) 을 정의하는 영역
  • 실제 비즈니스 로직, 데이터 처리, ALV 출력 준비, BAPI 호출, 검증 로직 등이 포함됨

    사용된는 FROM sample
    FORM get_data. SELECT 쿼리 수행, 내부 테이블 채움
    FORM build_fieldcatalog. ALV 필드카탈로그 설정
    FORM set_layout. ALV 레이아웃 설정 (lvc_s_layo)
    FORM create_po. BAPI 호출 또는 커스텀 트랜잭션 처리
    FORM validate_input. 사용자 입력 검증, 오류 메시지 출력
    FORM refresh_alv. refresh_table_display 호출 등 화면 갱신 처리