쌓고 쌓다

[ABAP] HTML로 누적 막대 그래프 그려 넣기 본문

SAP/ABAP

[ABAP] HTML로 누적 막대 그래프 그려 넣기

승민아 2026. 2. 27. 16:17
반응형

ABAP에서 누적 막대 그래프 그리기를 포기했었는데

 

어느날 회식때 동료분이 블로그 글 보고 기억난다고 알려주셔서 그리는 방법을 알게 되었다. 

 

정말 감사합니다.

 

기존 코드를 가지고 쉬운 내용으로 템플릿을 만들어 봤다.

 

A, B, C, D 제품이 있을때

월별 누적 막대그래프를 예제이다.

 

 

방법은

누적 막대 그래프 차트를 그려주는 펑션을 가지고 이미지 데이터를 만들고

이미지 데이터를 가지고 이미지 URL을 생성하고

이미지 URL을 HTML에 포함시켜 SAP GUI에 출력하는 방식이다.

 

막대 그래프, 도넛 그래프 등 다양한 그래프를 그릴 수 있다.

 

 

코드중에 HTML을 어디 화면에 뿌려줄지 지정할 수 있다.

위처럼 ALV 컨테이너가 없어도 화면에 뿌려줄 수 있지만

 

컨테이너를 지정해서 해당 ALV에 표시할 수 도 있다.

 

HTML과 IGS_CHART를 TOP에 선언하여 전역적으로 해주고

 

위처럼 ALV INIT 이후에

HTML의 부모를 원하는 컨테이너에 넣어주면 된다.

 

HTML로 그린 화면은 다른 ALV로 전환하더라도 HTML에 가려져 안보일 수 있으니

VISIBLE을 껐다켰다하면서 다른 ALV와 사용해야한다.

 

 

전체 코드

더보기

*&---------------------------------------------------------------------*
*& Report ZS4H086R11
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZS4H086R11.

" 예제 : 월별 제품 판매량을 누적 막대그래프


TYPES :
  BEGIN OF TY_SALES,
    MONTH       TYPE N LENGTH 2,   " 월
    PRODUCT_ID  TYPE LENGTH 10,  " 제품ID
    SALES_COUNT TYPE I,            " 판매량
  END OF TY_SALES.


DATA GT_SALE_DATA TYPE TABLE OF TY_SALES.

GT_SALE_DATA VALUE #(
  MONTH PRODUCT_ID 'A' SALES_COUNT )
  MONTH PRODUCT_ID 'B' SALES_COUNT )
  MONTH PRODUCT_ID 'A' SALES_COUNT )
  MONTH PRODUCT_ID 'B' SALES_COUNT )
  MONTH PRODUCT_ID 'C' SALES_COUNT )
  MONTH PRODUCT_ID 'D' SALES_COUNT )
).


START-OF-SELECTION.
  DATA LT_IGS_DATA TYPE TABLE OF IGS_DATA,
         LS_IGS_DATA LIKE LINE OF LT_IGS_DATA.

  TRY.
* Default RFC-Destination für IGS (Internet Graphics Server)
      DATA(LV_RFC_DESTCONV CHAR32'IGS_RFC_DEST' ).

* RFC-Destination festlegen
      CL_GFW=>ITS_RFC_DEST LV_RFC_DEST.

* Ist der IGS Chart interpreter erreichbar?
      IF CL_IGS_DATA=>IS_REGISTERED_TYPETYPE CL_IGS_CHART=>INTERPRETER_TYPE ABAP_TRUE.

* IGS Chart-Objekt erzeugen
        DATA(O_IGS_CHARTNEW CL_IGS_CHART).
        O_IGS_CHART->TYPE CL_IGS_CHART=>CO_TYPE_COLS_STACKED.
        O_IGS_CHART->WIDTH 500"넓이
        O_IGS_CHART->HEIGHT 500"높이
        O_IGS_CHART->TITLE 'Title'"제목
        O_IGS_CHART->TITLE_CATEGORIES 'X axis Title'"X축 제목
        O_IGS_CHART->TITLE_VALUES 'Y axis Title'"Y축 제목

        LOOP AT GT_SALE_DATA ASSIGNING FIELD-SYMBOL(<FS_SALLE_DATA>).
          LS_IGS_DATA-<FS_SALLE_DATA>-MONTH.
          LS_IGS_DATA-<FS_SALLE_DATA>-SALES_COUNT.
          LS_IGS_DATA-GROUPID <FS_SALLE_DATA>-PRODUCT_ID.
          APPEND LS_IGS_DATA TO LT_IGS_DATA.
          CLEAR LS_IGS_DATA.
        ENDLOOP.

        "group id 정렬 , group id 순서가 다른 경우 매핑이 되지 않아 로직 추가
*        SORT LT_IGS_DATA BY GROUPID X.
        O_IGS_CHART->DATA LT_IGS_DATA.
*        O_IGS_CHART->EXTENSION = VALUE IGS_EXT_TAB(
*                                                    ( TOKEN = 'TITLE' VALUE = '')"'href="http://www.google.de"' )
*                                                    ( TOKEN = 'LGNDI' VALUE = '')"'href="http://www.google.de"' )
*                                                  ).

        DATALV_CONTENT_TYPE TYPE W3PARAM-CONT_TYPE.
        DATALV_CONTENT_SUBTYPE TYPE W3PARAM-CONT_TYPE.
        DATALV_CONTENT_LENGTH TYPE W3PARAM-CONT_LEN.
        DATAIT_MIME_CONTENT TYPE W3MIMETABTYPE.
        DATAIT_IMAGEMAP_HTML TYPE W3HTMLTABTYPE.
        DATALV_MSG TYPE CHAR255.

*       Chart 데이터를 가지고 image 데이터 생성
        O_IGS_CHART->SENDIMPORTING
                             CONTENT_TYPE   LV_CONTENT_TYPE
                             CONTENT_LENGTH LV_CONTENT_LENGTH
                             CONTENT        IT_MIME_CONTENT
                             IMAGEMAP       IT_IMAGEMAP_HTML
                             MSG_TEXT       LV_MSG ).

* CONTENT TYPE : image/* -> CONTENTTYPE : image, CONTENT_SUBTYPE : *
        SPLIT LV_CONTENT_TYPE AT '/' INTO LV_CONTENT_TYPE LV_CONTENT_SUBTYPE.

* HTML-Viewer erzeugen
        DATA(O_HTMLNEW CL_GUI_HTML_VIEWERPARENT CL_GUI_CONTAINER=>DEFAULT_SCREEN ).

        DATALV_MIME_CONTENT_URL TYPE W3URL.

* image 데이터를 가지고 이미지 URL을 생성
        O_HTML->LOAD_DATAEXPORTING
                             TYPE         LV_CONTENT_TYPE
                             SUBTYPE      LV_CONTENT_SUBTYPE
                             SIZE         LV_CONTENT_LENGTH
                           IMPORTING
                             ASSIGNED_URL LV_MIME_CONTENT_URL
                           CHANGING
                             DATA_TABLE   IT_MIME_CONTENT ).


* 위에서 생성된 이미지 URL을 img 태그의 src 파라미터로 사용하여 HTML 구성
        DATA(IT_HTMLVALUE W3HTMLTABTYPELINE '<html>' )
                                             LINE '  <head>' )
*                                             ( line = '    <meta charset="utf-8">' ) "AAA
                                             LINE '    <title>IGS Chart Demo</title>' )
                                             LINE '  </head>' )
                                             LINE '  <body>' ).
        APPEND LINES OF VALUE W3HTMLTABTYPELINE '    <img src="' && LV_MIME_CONTENT_URL && '" usemap=#chart border=0>' )
                                             LINE '  </body>' )
                                             LINE '</html>' TO IT_HTML.

        DATALV_OUTPUT_URL TYPE W3URL.

* 위의 HTML을 가지고 HTML URL을 생성
        O_HTML->LOAD_DATAEXPORTING
                             TYPE         'text'
                             SUBTYPE      'html'
                           IMPORTING
                             ASSIGNED_URL LV_OUTPUT_URL
                           CHANGING
                             DATA_TABLE   IT_HTML ).

* HTML im HTML-Viewer anhand der URL anzeigen : HTML URL을 사용하여 HTML 출력
        O_HTML->SHOW_URLURL LV_OUTPUT_URL ).
*        O_HTML->SHOW_URL( URL = 'https://www.naver.com/' ). <- 브라우저처럼 다른 웹 URL에 접속도 가능하다.

* Container cl_gui_container=>default_screen erzwingen
        WRITE/ SPACE.
      ENDIF.
    CATCH CX_ROOT INTO DATA(E_TXT).
      WRITE/ E_TXT->GET_TEXT).
  ENDTRY.

반응형