본문 바로가기

SAP ABAP 개발 및 설명/인사 마스터만들기

인사마스터 ALV 프로젝트 ver 1.1

메인프로그램


메인 프로그램 코딩.

2020/08/21 - [ABAP 실습/ALV GRID] - ALV GRID 템플릿만들기

기존에 만들어 놓은 템플릿을 활용하여 인클루드문의 이름을 선언해주고 SELECTION-SCREEN에 대한 세팅을 해준다. 

<메인프로그램 전문>
INCLUDE ZR08_0000_TOP.
INCLUDE ZR08_0000_CO1.
INCLUDE ZR08_0000_PBO.
INCLUDE ZR08_0000_PAI.
INCLUDE ZR08_0000_F01.


INITIALIZATION.

AT SELECTION-SCREEN.
START-OF-SELECTION.

//*인사데이터 조회
PERFORM SELECT_DATA.

//*도메인 데이터 조회
PERFORM GET_DOMAIN_DATA.

END-OF-SELECTION.

call screen 100.
<TOP문 전문>
TABLES : ZT08_0010, DD07T.


CONSTANTS : GC_STATUS_DEFAULT TYPE ZT08_0010-STATUS VALUE '1',
            GC_WAERS_DEFAULT  TYPE ZT08_0010-WAERS  VALUE 'JPY',
            GC_STATUS_RETIRE  TYPE ZT08_0010-STATUS VALUE '3',
            GC_MODE_INSERT    TYPE C                VALUE 'I', "등록"
            GC_MODE_UPDATE    TYPE C                VALUE 'U', "변경"
            GC_MODE_RETIRE    TYPE C                VALUE 'R'. "퇴직"

DATA : CON1_REF TYPE REF TO CL_GUI_CUSTOM_CONTAINER. "컨테이너 객체 생성"
DATA : g_grid TYPE REF TO Cl_GUI_ALV_GRID.
DATA : gs_variant TYPE disvariant.
DATA : OK_CODE TYPE SY-UCOMM.

"필드 카탈로그 선언" - 테이블과 스트럭쳐 둘다 타입을 잠조해서
DATA : gt_fieldcat TYPE lvc_t_fcat.
DATA : gs_fieldcat TYPE lvc_s_fcat.

"레이아웃 선언"
DATA : gs_layout type lvc_s_layo.

DATA : BEGIN OF GS_ITAB.
  INCLUDE STRUCTURE ZT08_0010.
DATA : DEPT_T TYPE DD07T-DDTEXT,
       GRADE_T TYPE DD07T-DDTEXT,
       STATUS_T TYPE DD07T-DDTEXT,
       END OF GS_ITAB.

DATA GT_ITAB LIKE TABLE OF GS_ITAB.

DATA : BEGIN OF GS_ITAB_0200.
                INCLUDE STRUCTURE ZT08_0010.
DATA : MODE TYPE C,
       INDEX TYPE LVC_S_ROID-ROW_ID,
       END OF GS_ITAB_0200.





*------------EVENT BLOCK-------------------------
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN:SKIP 1.
SELECT-OPTIONS:
          s_EMPNO FOR ZT08_0010-EMPNO,
          s_DEPT   FOR ZT08_0010-DEPT,
          s_ENTDT FOR ZT08_0010-ENTDT,
          s_GRADE FOR ZT08_0010-GRADE,
          s_STATUS FOR ZT08_0010-STATUS.
SELECTION-SCREEN:SKIP 1.
SELECTION-SCREEN: END OF BLOCK b1.

TOP 문 상단에 TABLES 선언.

> TABLES : 1)ZT08_0010, DD07T의 란 테이블 유형을 가지는 WORK AREA를 선언하는 것.

> TABLES : 1)ZT08_0010, DD07T을 SQL 등에서 사용하겠다고 선언해주는 역할.

 

Constraints의 의미

>DATA 명령과 매우 유사하며, DATA 명령 대신 [CONSTANTS]명령을 사용,

 

GC_STATUS_DEFAULT TYPE ZT08_0010-STATUS VALUE '1',
GC_WAERS_DEFAULT  TYPE ZT08_0010-WAERS  VALUE 'JPY',
GC_STATUS_RETIRE  TYPE ZT08_0010-STATUS VALUE '3',

->추후 스크린 상에서 디폴트로 표현하고 싶어서 Constants로 선언해준 부분.

 

GC_MODE_INSERT    TYPE C                VALUE 'I', "등록"
GC_MODE_UPDATE    TYPE C                VALUE 'U', "변경"
GC_MODE_RETIRE    TYPE C                VALUE 'R'. "퇴직"

-> 버튼이 C 타입의 한자리의 길이를 가지기 떄문에 이와 관련하여 상수를 설정. 이후 추후 200번 스크린을 불어들이는 버튼에 따른 스크린을 구분하기 쉽게 사용하는 것.


메인프로그램 PERFORM 문


PERFORM select_data

FORM select_data.
    SELECT *
    FROM ZT08_0010
    INTO CORRESPONDING FIELDS OF TABLE GT_ITAB
    WHERE EMPNO IN s_EMPNO
      AND DEPT IN s_DEPT
      AND ENTDT IN s_ENTDT
      AND GRADE IN s_GRADE
      AND STATUS IN s_STATUS.
ENDFORM.

만든 테이블에서 모든 데이터를 SELECT-OPTIONS를 조건으로 가지고 오는 구문을 선언해준다.

 

PERFORM get_domain_data

이 부분은 테이블에서 선언해준 부분에 DEPT(부서), GRADE(직급), STATUS(재직상태)에 대해 도메인에서 선언해준 value_range의 값들을 가지고 오는 부분이다.

 

방법1. -> 기본적인 코딩

FORM get_domain_data .

  DATA LV_LINE TYPE  I.
  DATA lt_domain TYPE TABLE OF dd07t WITH HEADER LINE.

  SELECT * FROM dd07t
    INTO CORRESPONDING FIELDS OF TABLE lt_domain
    WHERE DOMNAME IN ( 'Z_DEPT08', 'ZDGRADE08', 'ZDSTATUS08' )
      AND ddlanguage = sy-langu.

  LOOP AT GT_ITAB INTO GS_ITAB. 

  lv_line  = sy-tabix .

  READ TABLE LT_DOMAIN WITH KEY domname = 'Z_DEPT08'
                                domvalue_l =  gs_itab-DEPT .

      IF sy-subrc = 0.
      gs_itab-DEPT_T = lt_domain-ddtext.
      ENDIF.

  READ TABLE lt_domain WITH KEY domname = 'ZDGRADE08'
                               domvalue_l =  gs_itab-GRADE.

      IF sy-subrc = 0.
      gs_itab-GRADE_T = lt_domain-ddtext.
      ENDIF.

  READ TABLE lt_domain WITH KEY domname = 'ZDSTATUS08'
                                domvalue_l =  gs_itab-STATUS.

      IF sy-subrc = 0.
      gs_itab-STATUS_T = lt_domain-ddtext.
      ENDIF.

MODIFY GT_ITAB FROM GS_ITAB INDEX LV_LINE .
ENDLOOP .
ENDFORM.

value_range를 담고있는 테이블인 dd07t의 형식을 가지는 인터널 테이블을 선언하고 SQL문을 통해서 필요한 값들을 선언한 테이블에 가지고 온다.

 

그리고 내가 선언한 테이블을 한줄한줄 루프문을 통해 읽으면서 DEPT(부서), GRADE(직급), STATUS(재직상태)에 해당하는 도메인(domname)숫자값(domvalue_l)을 키로서 lt_domain 테이블을 읽으며 필요한 텍스트를 gs_itab에 가지고 오는 과정을 수행한다.

 

마지막에는 MODIFY를 통해 내가 선언한 GT_ITAB을 GS_ITAB을 통해서, 인텍스로는 지금 작업하는(SY-TABIX)줄을 통해서 변형해주는 과정을 통하도록 하자.

 

방법2. 필드심볼 사용

FORM get_domain_data .
  FIELD-SYMBOLS: <FS_ITAB> LIKE GS_ITAB.

  DATA LV_LINE TYPE  I.
  DATA lt_domain TYPE TABLE OF dd07t WITH HEADER LINE.

  SELECT * FROM dd07t
    INTO CORRESPONDING FIELDS OF TABLE lt_domain
    WHERE DOMNAME IN ( 'Z_DEPT08', 'ZDGRADE08', 'ZDSTATUS08' )
      AND ddlanguage = sy-langu.

LOOP AT GT_ITAB ASSIGNING <FS_ITAB>.

  lv_line  = sy-tabix .

  READ TABLE LT_DOMAIN WITH KEY domname = 'Z_DEPT08'
                                domvalue_l =  gs_itab-DEPT .

      IF sy-subrc = 0.
      <FS_ITAB>-DEPT_T = lt_domain-ddtext.
      ENDIF.

  READ TABLE lt_domain WITH KEY domname = 'ZDGRADE08'
                               domvalue_l =  gs_itab-GRADE.

      IF sy-subrc = 0.
      <FS_ITAB>-GRADE_T = lt_domain-ddtext.
      ENDIF.

  READ TABLE lt_domain WITH KEY domname = 'ZDSTATUS08'
                                domvalue_l =  gs_itab-STATUS.

      IF sy-subrc = 0.
      <FS_ITAB>-STATUS_T = lt_domain-ddtext.
      ENDIF.

ENDLOOP .
ENDFORM.

필드심볼을 사용하기 위해서는 WA를 필드심볼과 같게 선언해준다.

 

▪이후 GS_ITAB이 사용되었던 부분에 필드심볼인 <FS_ITAB>을 사용해주면 된다. 필드심볼을 WA를 대신해서 사용했을 때의 장점은 필드심볼을 사용했을 때에는 작업하는 줄에 대해서 MODIFY나 UPDATE와 같은 구문 없이도 작업이 수행되기 때문에 구문이 단축될 수 있고 직접적으로 작업이 수행된다는 것이다.


SCREEN 100


SCREEN 100->스크린 100번에 대한 구문

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
 MODULE INIT_CON.
 
PROCESS AFTER INPUT.
 MODULE EXIT_100 AT EXIT-COMMAND.
 MODULE USER_COMMAND_0100.

 

 

SCREEN 100의 PBO 해당 코드전문

MODULE status_0100 OUTPUT.
 SET PF-STATUS '100'.
 SET TITLEBAR '100'.
ENDMODULE.

MODULE init_con OUTPUT.
IF CON1_REF IS INITIAL. 

"컨테이너에 SCREEN CON1 담기"
"CON1_REF 생성"
  
  CREATE OBJECT CON1_REF
  EXPORTING
    CONTAINER_NAME = 'CON1'.
  "G_GRID 생성"
  CREATE OBJECT G_GRID
  EXPORTING
    I_PARENT = CON1_REF.

PERFORM MAKE_FIELDCATALOG.
PERFORM MAKE_LAYOUT.
PERFORM MAKE_ALV.

ELSE.
PERFORM DO_REFRESH.

ENDIF.

ENDMODULE.

이 부분은 템플릿에서 선언했던 부분과 크게 다른 부분이 없으므로 넘어간다.

 

PF-STATUS

▪ 100번의 PBO의 PF-STATUS에서 버튼 3가지(신규 / 변경 / 퇴직)에 해당하는 버튼을 만들어준다.

 

필드카탈로그 선언부분

FORM make_fieldcatalog .

gs_fieldcat-fieldname = 'EMPNO'.
gs_fieldcat-ref_field = 'EMPNO'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '사원번호'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'NAME'.
gs_fieldcat-ref_field = 'NAME'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '이름'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'DEPT'.
gs_fieldcat-ref_field = 'DEPT'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '부서'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'DEPT_T'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '부서설명'.

APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'ENTDT'.
gs_fieldcat-ref_field = 'ENTDT'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '입사일'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'GRADE'.
gs_fieldcat-ref_field = 'GRADE'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '직급'.

APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'GRADE_T'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '직급설명'.


APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'RETDT'.
gs_fieldcat-ref_field = 'RETDT'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '퇴사일'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'STATUS'.
gs_fieldcat-ref_field = 'STATUS'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '재직구분'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'STATUS_T'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '재직구분설명'.

APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'PHONE'.
gs_fieldcat-ref_field = 'PHONE'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '전화번호'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-fieldname = 'ADDR_H'.
gs_fieldcat-ref_field = 'ADDR_H'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '자택주소'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.


gs_fieldcat-fieldname = 'ADDR_W'.
gs_fieldcat-ref_field = 'ADDR_W'.
gs_fieldcat-ref_table = 'ZT08_0010'.
gs_fieldcat-coltext = '근무지주소'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.

gs_fieldcat-FIELDNAME = 'SALARY'.
gs_fieldcat-COLTEXT   = '기본급'.
gs_fieldcat-CFIELDNAME = 'WAERS'.
APPEND gs_fieldcat TO gt_fieldcat.


gs_fieldcat-FIELDNAME = 'WAERS'.
gs_fieldcat-NO_OUT    = 'X'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR GS_FIELDCAT.

ENDFORM.

레이아웃 선언부분

FORM make_layout .

CLEAR GS_LAYOUT.
GS_LAYOUT-CWIDTH_OPT = 'A'.
GS_LAYOUT-STYLEFNAME = 'STYLE'.

ENDFORM. 

GS_LAYOUT-CWIDTH_OPT = 'A'. -> 입력 길이가 넓어지면 자동으로 길어짐

 

ALV 구현 부분

FORM make_alv .

CALL METHOD G_GRID->set_table_for_first_display
	EXPORTING  
    is_variant = gs_variant   
    is_layout = gs_layout
    
    CHANGING
    it_outtab = GT_ITAB
    it_fieldcatalog = gt_fieldcat.
    ENDFORM. 

REFRESH 부분

FORM do_refresh .
*  DATA: ls_scroll type lvc_s_stbl.

CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.
*     EXPORTING
*       i_soft_refresh = 'X'
*       IS_STABLE      = LS_SCROLL.
ENDFORM. 

필요할 경우에는 LVC_S_STBL이라는 스트럭쳐를 생성하여 REFRESH_TABLE_DISPLAY라는 METHOD를 사용해서 스크롤과 같은 기능을 진행할 순 있지만 현재의 경우는 특별한 조치없이 스크린 200에서의 수행이 100번에 REFRESH되어 반영되기만을 희망하므로 METHOD만 선언해주기.

반응형