건양대학교 기업소프트웨어학부
ABAP Report 9주차 과제 본문
[9주차 과제 내용]
ALV에 신호등, ROW색상, CELL 색상, SORT, FIELD CATALOG를 적용하는 과제입니다.


[전체 코드 보기]
REPORT zclass_31_02.
TABLES: zstudent_31, zstdclass_31_2, zsubject_31, zstutor_31.
*사용할 테이블을 선언합니다.
TYPES: BEGIN OF t_data,
id TYPE zstudent_31-id,
name TYPE zstudent_31-name,
phone TYPE zstudent_31-phone,
grade TYPE zstdclass_31-grade,
class TYPE zstdclass_31-class,
cname TYPE zsubject_31-cname,
tname TYPE zstutor_31-tname,
light TYPE c LENGTH 1,
color TYPE c LENGTH 4,
it_col TYPE lvc_t_scol,
END OF t_data.
*인터널 테이블을 선언합니다.
SELECTION-SCREEN BEGIN OF BLOCK block WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS s_id FOR zstudent_31-id.
SELECT-OPTIONS s_name FOR zstudent_31-name.
SELECTION-SCREEN END OF BLOCK block.
*셀렉트 옵션즈를 이용해 셀렉션 스크린을 만듭니다.
DATA: ok_code TYPE sy-ucomm,
gv_gender TYPE zstudent_31-gender.
DATA: gt_data TYPE TABLE OF t_data,
gs_data TYPE t_data.
*인터널 테이블, 구조체를 선언
DATA: go_container TYPE REF TO cl_gui_custom_container,
go_alv TYPE REF TO cl_gui_alv_grid.
*ALV를 구현하기 위한 참조변수를 선언.
DATA: gs_layout TYPE lvc_s_layo,
gt_sorting_criteria TYPE lvc_t_sort,
gs_sorting_criterion TYPE lvc_s_sort,
gs_colfield LIKE LINE OF gs_data-it_col,
gt_field_cat TYPE lvc_t_fcat,
gs_field_cat TYPE lvc_s_fcat.
*ALV 디자인을 위한 변수 선언.
START-OF-SELECTION.
SELECT a~id a~name b~class c~cname b~grade a~phone d~tname
FROM zstudent_31 AS a INNER JOIN zstdclass_31_2 AS b
ON a~id = b~id
INNER JOIN zsubject_31 AS c
ON b~class = c~class
INNER JOIN zstutor_31 AS d
ON c~tutor = d~tid
INTO CORRESPONDING FIELDS OF TABLE gt_data
WHERE a~id IN s_id
AND a~name IN s_name.
LOOP AT gt_data INTO gs_data.
CASE gs_data-grade.
WHEN 'A+' OR 'A'.
gs_data-light = '3'.
WHEN 'B+' OR 'B'.
gs_data-light = '0'.
WHEN 'C+' OR 'C'.
gs_data-light = '2'.
WHEN OTHERS.
gs_data-light = '1'.
ENDCASE.
*신호등 설정
MODIFY gt_data FROM gs_data.
IF gs_data-grade = 'A+'.
gs_data-color = 'C' && col_positive && '10'.
ENDIF.
IF gs_data-grade = 'F'.
gs_data-color = 'C' && col_negative && '10'.
ENDIF.
*row 컬러 설정
gs_sorting_criterion-fieldname = 'ID'.
APPEND gs_sorting_criterion TO gt_sorting_criteria.
CLEAR gs_sorting_criterion.
gs_sorting_criterion-fieldname = 'TNAME'.
APPEND gs_sorting_criterion TO gt_sorting_criteria.
*필드 ID와 TNAME 기준으로 sort
MODIFY gt_data FROM gs_data.
IF gs_data-tname ='김성준'.
gs_colfield-fname = 'TNAME'.
gs_colfield-color-col = col_heading.
gs_colfield-color-int = '1'.
gs_colfield-color-inv = '0'.
APPEND gs_colfield TO gs_data-it_col.
ENDIF.
*cell 컬러 설정
MODIFY gt_data FROM gs_data TRANSPORTING light color it_col.
ENDLOOP.
END-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'G100'.
SET TITLEBAR 'T100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'BACK'.
PERFORM free_control.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
PERFORM free_control.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module CLEAR_CODE OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE clear_code OUTPUT.
CLEAR ok_code.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_alv OUTPUT.
IF go_container IS INITIAL.
CREATE OBJECT go_container
EXPORTING
container_name = 'CONTROL_AREA'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE 'error' TYPE 'e'.
ENDIF.
CREATE OBJECT go_alv
EXPORTING
i_parent = go_container.
IF sy-subrc <> 0.
MESSAGE 'control error' TYPE 'e'.
ENDIF.
PERFORM set_fcat.
gs_layout-cwidth_opt = 'X'.
gs_layout-excp_fname = 'LIGHT'.
gs_layout-info_fname = 'COLOR'.
gs_layout-ctab_fname = 'IT_COL'.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'ZSCLASS_31'
is_layout = gs_layout
CHANGING
it_outtab = gt_data
it_fieldcatalog = gt_field_cat
it_sort = gt_sorting_criteria
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
ENDIF.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FREE_CONTROL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM free_control .
CALL METHOD go_container->free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
ENDIF.
CALL METHOD go_alv->free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
ENDIF.
FREE: go_alv, go_container.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_FCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM set_fcat .
gs_field_cat-fieldname = 'NAME'.
gs_field_cat-coltext = '학생이름'.
gs_field_cat-col_pos = 2.
APPEND gs_field_cat TO gt_field_cat.
gs_field_cat-fieldname = 'TNAME'.
gs_field_cat-coltext = '교수이름'.
gs_field_cat-col_pos = 7.
APPEND gs_field_cat TO gt_field_cat.
ENDFORM.
[신호등 (Exceptions) 표시]
ALV에서 Exceptions 표시를 Icon으로 표현할 수 있습니다. 사용자에게 데이터의 긴급함에 대해서 인식할 수 있게끔 하도록 할 때 사용합니다.
1. light TYPE c LENGTH 1.
light 필드를 인터널 테이블에 추가해줍니다.
2. gs_layout-excp_fname = 'LIGHT'.
ALV 레이아웃 설정에서 excp_fname 속성을 이용해 Exceptions 필드를 설정합니다.
3. 인터널 테이블의 레코드에 신호등 필드의 값을 입력합니다.
LOOP AT gt_data INTO gs_data.
CASE gs_data-grade.
WHEN 'A+' OR 'A'.
gs_data-light = '3'.
WHEN 'B+' OR 'B'.
gs_data-light = '2'.
WHEN 'C+' OR 'C'.
gs_data-light = '0'.
WHEN OTHERS.
gs_data-light = '1'.
ENDCASE.
Case 문을 사용해 학점에 따라 신호등이 다르게 나타나도록 했습니다.
학점이 A+, A인 경우 초록색의 신호등이 뜨도록 해주었습니다.
학점이 B+, B인 경우 회색의 신호등이 뜨도록 해주었습니다.
학점이 C+, C인 경우 노란색의 신호등이 뜨도록 해주었습니다.
위의 경우를 제외한 나머지의 경우는 빨간색의 신호등이 뜨도록 해주었습니다.
[신호등 아이콘]
- 0(회색) : 미진행 상태
- 1(빨간색) : 문제 발생 상태
- 2(노란색) : 진행 중 상태
- 3(초록색) : 문제 없이 완료된 상태
- space(아무색도 아님)
[ROW 색상 설정]
ALV에서 강조하고 싶은 line의 색상을 설정할 수 있습니다.

1. color TYPE c LENGTH 4.
color 필드를 인터널 테이블에 추가합니다. 해당 필드에 들어가는 color code의 값에 따라 line의 컬러를 표현합니다. 필드명은 보통 color를 사용합니다.
2. gs_layout-info_fname = 'COLOR'
ALV 레이아웃 설정에서 info_fname 속성을 사용해 컬러 지정 필드를 설정합니다.
3. color code 값 설정
IF gs_data-grade = 'A+'.
gs_data-color = 'C' && col_positive && '10'.
ENDIF.
IF gs_data-grade = 'F'.
gs_data-color = 'C' && col_negative && '10'.
ENDIF.
학점(grade)가 A+인 경우 line 컬러를 col_positive(초록색)로 설정했습니다.
학점(grade)가 F인 경우 line 컬러를 col_negative(빨간색)로 설정했습니다.
[Cell 색상 설정]
ALV에서 강조하고 싶은 cell의 색상을 설정할 수 있습니다.
1. it_col TYPE lvc_t_scol
it_col 필드를 인터널 테이블에 추가합니다. 타입은 lvc_t_scol의 인터널 테이블 형태입니다.
2. gs_layout-ctab_fname = 'IT_COL'
ALV 레이아웃 설정에서 ctab_fname 속성을 사용해 필드를 설정합니다.
3. DATA: gs_colfield LIKE LINE OF gs_data-it_col.
gs_colfield 필드를 gs_data-it_col의 라인으로 선언합니다.
3. cell color 설정
fname에는 cell color로 강조되어야 하는 필드의 이름이 들어갑니다. tname의 cell color를 설정할 수 있도록 했습니다.
color에는 color를 지정하는 값이 들어갑니다.
- COL : col type group의 여덟가지 color 상수 중 한가지
- INT : 색상을 강조한 경우 '1', 강조하지 않은 경우 '0'
- INV : 글자, 배경색 반전된 경우 '1', 반전되지 않은 경우 '0'
IF gs_data-tname ='김성준'.
gs_colfield-fname = 'TNAME'.
gs_colfield-color-col = col_heading.
gs_colfield-color-int = '1'.
gs_colfield-color-inv = '0'.
APPEND gs_colfield TO gs_data-it_col.
ENDIF.
if문을 사용해 tname이 '김성준' 교수님 인 경우 col_heading의 컬러로 조회되도록 설정했습니다.
[Sort (정렬)]
ALV 에서 데이터를 정렬할 수 있도록 설정할 수 있습니다.
1. DATA : gt_sorting_criteria TYPE lvc_t_sort,
gs_sorting_criterion TYPE lvc_s_sort.
정렬하기 위해 필요한 데이터를 선언합니다.
2. CHANGING
it_sort = gt_sorting_criteria
메소드 set_table_for_first_display의 changing의 it_sort에 gt_sorting_criteria를 적어줍니다.
3. 정렬 기준을 적어줍니다. field name ID와 TNAME을 기준으로 sort 하도록 해주었습니다.
gs_sorting_criterion-fieldname = 'ID'.
APPEND gs_sorting_criterion TO gt_sorting_criteria.
CLEAR gs_sorting_criterion.
gs_sorting_criterion-fieldname = 'TNAME'.
APPEND gs_sorting_criterion TO gt_sorting_criteria.
[Field catalog]
필드 카탈로그는 ALV에서 조회되는 칼럼들의 필드 정보를 포함하는 lvc_t_fcat 타입의 테이블 구조를 가집니다. 필드 카탈로그의 다양한 속성을 정의해 사용할 수 있습니다. 예를 들어 필드 위치, 필드명 등을 정의해 사용할 수 있습니다. 필드 카탈로그 속성은 lvc_t_fcat에서 확인할 수 있습니다.
1. DATA: gt_field_cat TYPE lvc_t_fcat,
gs_field_cat TYPE lvc_s_fcat.
필드 카탈로그를 사용하기 위해 데이터를 선언합니다.
2. CHANGING
it_fieldcatalog = gt_field_cat
메소드 set_table_for_first_display의 CHANGING의 it_fieldcatalog에 gt_field_cat를 적어줍니다.
3. 필드 카탈로그의 속성을 정의해 사용합니다. 서브루틴을 정의해서 그 안에 코드를 적었습니다.
사용한 속성은 fieldname, coltext, col_pos 입니다.
- fieldname : 아웃풋 테이블의 필드 이름
- coltext : 칼럼 텍스트
- col_pos : 칼럼 output 순서
FORM set_fcat .
gs_field_cat-fieldname = 'NAME'.
gs_field_cat-coltext = '학생이름'.
gs_field_cat-col_pos = 2.
APPEND gs_field_cat TO gt_field_cat.
gs_field_cat-fieldname = 'TNAME'.
gs_field_cat-coltext = '교수이름'.
gs_field_cat-col_pos = 7.
APPEND gs_field_cat TO gt_field_cat.
ENDFORM.
name(학생이름), tname(교수성함) 필드가 같은 Data Element를 사용하기 때문에 ALV를 조회하게 되면 필드명이 둘 다 이름으로 뜹니다. 어떤 데이터가 학생 이름인지 교수 이름인지 확인할 수 없으므로 필드 카탈로그를 이용해 필드명을 변경해 주었습니다.
coltext를 이용해 각 필드의 필드명을 학생이름, 교수이름으로 바꿔주었습니다.
col_pos를 이용해 칼럼이 출력 되는 순서를 정해주었습니다. 학생이름 칼럼은 2번째, 교수이름 칼럼은 7번째에 위치하게됩니다.