Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

건양대학교 기업소프트웨어학부

ABAP Report 9주차 과제 본문

카테고리 없음

ABAP Report 9주차 과제

sap20200331 2022. 5. 4. 16:37

[9주차 과제 내용] 

ALV에 신호등, ROW색상, CELL 색상, SORT, FIELD CATALOG를 적용하는 과제입니다. 

selection screen
프로그램 실행 화면

[전체 코드 보기]

더보기

REPORT zclass_31_02.

TABLESzstudent_31zstdclass_31_2zsubject_31zstutor_31.
*사용할 테이블을 선언합니다.

TYPESBEGIN 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 LENGTH 1,
         color  TYPE 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.
*셀렉트 옵션즈를 이용해 셀렉션 스크린을 만듭니다.


DATAok_code TYPE sy-ucomm,
      gv_gender TYPE zstudent_31-gender.

DATAgt_data TYPE TABLE OF t_data,
        gs_data TYPE t_data.
*인터널 테이블, 구조체를 선언


DATAgo_container TYPE REF TO cl_gui_custom_container,
      go_alv TYPE REF TO cl_gui_alv_grid.
*ALV를 구현하기 위한 참조변수를 선언.

DATAgs_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.

  FREEgo_alvgo_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의 색상을 설정할 수 있습니다. 

ALV color code

 

1. color  TYPE 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번째에 위치하게됩니다.