메인프로그램
메인 프로그램 코딩.
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.
▪이 부분은 템플릿에서 선언했던 부분과 크게 다른 부분이 없으므로 넘어간다.
▪ 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만 선언해주기.
'SAP ABAP 개발 및 설명 > 인사 마스터만들기' 카테고리의 다른 글
인사마스터 ALV 프로젝트 ver 2 (CLASS문) (0) | 2020.10.02 |
---|---|
인사마스터 ALV 프로젝트 ver 2 (TOP문 , 메인프로그램) (0) | 2020.10.02 |
인사마스터 ALV 프로젝트 ver 1.3 (0) | 2020.09.17 |
인사마스터 ALV 프로젝트 ver 1.2 (0) | 2020.09.16 |
인사마스터 ALV 프로젝트 ver 1. 요구사항 정리 (0) | 2020.08.03 |