본문 바로가기
ABAP/소스코드

[Class] Progress Indicator 처리용 Common Class

by name_text 2023. 5. 24.

Progress Indicator 처리용 Common Class

SAPGUI_PROGRESS_INDICATOR

 

"SAPGUI_PROGRESS_INDICATOR"을 간편하기 사용하기 위해 Common Include를 만들어서 사용하고 있었습니다.

2023.05.10 - [ABAP/소스코드] - [Include] Progress Indicator 처리용 Common Include

 

[Include] Progress Indicator 처리용 Common Include

Progress Indicator 처리용 Common Include SAPGUI_PROGRESS_INDICATOR 실행시간이 오래 걸리는 프로그램의 경우 최대한 튜닝을 하여 빠르게 처리되는게 가장 좋지만 튜닝에도 한계가 있다보니 어쩔수 없이 처리

playabap.tistory.com

 

Include 방식이 신입 개발자들에게 설명하기도 편하고 사용성도 나쁘지 않았는데,

아무래도 자주 사용하는 기능이다 보니 좀더 간편하게 사용하고자 동일한 기능을 Class로 만들었습니다.

 

#1. ZCL_PROGRESS 구조

Method 3개와 전역번수 3개의 아주 간단한 클래스입니다.

#2. Class 소스코드

class ZCL_PROGRESS definition
  public
  final
  create public .

public section.

  methods INITIAL
    importing
      value(I_TOTAL) type I .
  methods SET_PERCENT
    importing
      value(I_TEXT) type ANY optional .
  methods SET_STEP
    importing
      value(I_TEXT) type ANY optional .
  methods CONSTRUCTOR
    importing
      value(I_TOTAL) type I optional .
protected section.
private section.

  data G_PROGRESS_TOTAL type I .
  data G_PROGRESS_CURNT type I .
  data G_PERCENTAGE_PREV type I .
ENDCLASS.



CLASS ZCL_PROGRESS IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TOTAL                        TYPE        I(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method CONSTRUCTOR.
    INITIAL( I_TOTAL ).
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->INITIAL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TOTAL                        TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method INITIAL.
    CLEAR: G_PROGRESS_CURNT, G_PERCENTAGE_PREV.
    G_PROGRESS_TOTAL = I_TOTAL.
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->SET_PERCENT
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TEXT                         TYPE        ANY(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method SET_PERCENT.
    DATA: LV_PROGRESS_TITLE TYPE STRING,
          LV_PERCENTAGE TYPE I,
          LV_PER_TEXT(10) TYPE C,
          LV_TEXT TYPE STRING.

   MOVE I_TEXT TO LV_TEXT.
   ADD 1 TO G_PROGRESS_CURNT.
   IF G_PROGRESS_TOTAL = 0.
     G_PROGRESS_TOTAL = 100.
   ENDIF.
   IF G_PROGRESS_CURNT <> 0.
     LV_PERCENTAGE = G_PROGRESS_CURNT * 100 / G_PROGRESS_TOTAL.
   ENDIF.
   IF LV_PERCENTAGE > 100.
     LV_PERCENTAGE = 100.
   ENDIF.
   IF LV_PERCENTAGE > G_PERCENTAGE_PREV.
     G_PERCENTAGE_PREV = LV_PERCENTAGE.
     WRITE LV_PERCENTAGE TO LV_PER_TEXT. CONDENSE LV_PER_TEXT.
     CONCATENATE '[' LV_PER_TEXT '%] ' ` ` LV_TEXT INTO LV_PROGRESS_TITLE.

     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
       EXPORTING
         PERCENTAGE = LV_PERCENTAGE
         TEXT       = LV_PROGRESS_TITLE.
   ENDIF.
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->SET_STEP
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TEXT                         TYPE        ANY(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method SET_STEP.
    DATA: LV_PROGRESS_TITLE TYPE STRING,
          LV_PERCENTAGE TYPE I,
          LV_CUR_TEXT(10) TYPE C,
          LV_TOT_TEXT(10) TYPE C,
          LV_TEXT TYPE STRING.
   CLEAR : LV_CUR_TEXT, LV_TOT_TEXT.

   MOVE I_TEXT TO LV_TEXT.
   ADD 1 TO G_PROGRESS_CURNT.
   WRITE G_PROGRESS_CURNT TO LV_CUR_TEXT. CONDENSE LV_CUR_TEXT.
   IF G_PROGRESS_TOTAL = 0.
     G_PROGRESS_TOTAL = 100.
   ELSE.
     WRITE G_PROGRESS_TOTAL TO LV_TOT_TEXT. CONDENSE LV_TOT_TEXT.
   ENDIF.
   IF G_PROGRESS_CURNT <> 0.
     LV_PERCENTAGE = G_PROGRESS_CURNT * 100 / G_PROGRESS_TOTAL.
   ENDIF.
   IF LV_PERCENTAGE > 100.
     LV_PERCENTAGE = 100.
   ENDIF.

   IF LV_TOT_TEXT IS INITIAL.
     CONCATENATE '[' LV_CUR_TEXT '] ' ` ` LV_TEXT INTO LV_PROGRESS_TITLE.
   ELSE.
     CONCATENATE '[' LV_CUR_TEXT 'of' LV_TOT_TEXT '] ' ` ` LV_TEXT INTO LV_PROGRESS_TITLE.
   ENDIF.

   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       PERCENTAGE = LV_PERCENTAGE
       TEXT       = LV_PROGRESS_TITLE.
  endmethod.
ENDCLASS.
ABAP

 

#3. 사용 예시

REPORT YSANDBOX.
"Progress 오브젝트
DATA GCL_PROGRESS TYPE REF TO ZCL_PROGRESS.

START-OF-SELECTION.
  SELECT
    *
  FROM T001
  INTO TABLE @DATA(LT_T001).

  "PROGRESS 오브젝트 생성
  CREATE OBJECT GCL_PROGRESS.

  "Progress 전역 변수 초기화 및 최대값 입력
  GCL_PROGRESS->INITIAL( LINES( LT_T001 ) ).

  LOOP AT LT_T001 INTO DATA(LS_T001).
    "퍼센트 형식의 Progress 호출

    GCL_PROGRESS->SET_PERCENT( '처리중입니다...' ).

    WAIT UP TO '0.5' SECONDS.
  ENDLOOP.
  
  
* 또는 Object 생성시 최대값 설정하여 사용
DATA(LO_PROGRESS) = NEW ZCL_PROGRESS( 10 ).

DO 10 TIMES.
  LO_PROGRESS->SET_PERCENT( '진행중' ).
  WAIT UP TO 1 SECONDS.  
ENDDO. 

"Progress 전역 변수 초기화 및 최대값 변경
LO_PROGRESS->INITIAL( 20 ).
DO 20 TIMES.
  LO_PROGRESS->SET_PERCENT( '진행중' ).
  WAIT UP TO 1 SECONDS.  
ENDDO.
ABAP

댓글