Dinamik Kolon ile ALV Raporu Oluşturma

SAP tabloları içerisindeki bazı bilgilere dayanarak dinamik olarak kolonlar oluşturup bu kolonları ALV raporu olarak ekrana bastırmak istediğimizde bunu sağlayacak olan   CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE metodu kullanabiliriz.

Bu konuya ilişkin örnek programı kodların açıklaması ile birlikte yazının devamında görebilirsiniz.

 

Örnek senaryomuz gereği, Malzeme, Üretim Yeri, Üretim Tarihi ve Maliyet alanlarından oluşan bir tablomuz bulunmakta. Ancak rapor olarak ekrana bastırmak istediğimiz malzeme, üretim yeri ve üretim tarihi bazında Toplam maliyetlerin, üretim tarihlerine ayrıştırılmış olarak gösterilmek istenmesidir. Görsel olarak aşağıdaki tabloda senaryonun ve istenilenin ne olduğunu görebilirsiniz.

Program içerisine ALV raporu yansıtacağımız bir Screen oluşturuyoruz. 1001 numaralı screen içerisine custom control ekleyerek adını GRID_ALV olarak belirliyoruz.

 

Ekran yapısını oluşturduktan sonra aşağıdaki gibi ABAP kodlamasına geçebiliriz. Program ilk çalıştırıldığında 1001 ekranı çağırılacak ve ilk olarak tüm veriler tablodan çekilecek, tüm veriler içerisinde istediğimiz alana göre dinamik kolon sayısı belirlenecek ve bu sayı kadar kolon dinamik yapı içerisine doldurulacaktır. Oluşan her satır dinamik tablo içerisine APPEND edildikten sonra elimizdeki dinamik tablo yapısını ALV grid için oluşturduğumuz GRID ve CONTAINER yapısı içerisine ekleyebiliriz. ABAP kodları üzerinde yer alan açıklamalar ile ekran çıktısını yazının devamında bulabilirsiniz.

REPORT Z_DYNAMIC_COLUMN_ALV.

TYPE-POOLS: SLIS.


" Malzeme Tablosunun Alınması için Internal Table
DATA : LT_MALZEMELER TYPE TABLE OF ZDEMO_TABLE.


" Dinamik tablo yapısı için tanımlamalar
FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
               <DYN_WA>,
               <DYN_FIELD>.

" Dinamik kolonlar için oluşturulacak olan yapı
TYPES : BEGIN OF TY_MALZEME_SURELER,
          MATNR         TYPE MATNR,
          WERKS         TYPE WERKS,
          URETIM_TARIHI TYPE ZURETIM_TARIHI,
          TOTAL_COST    TYPE ZDEMO_COST,
        END OF TY_MALZEME_SURELER.
DATA : LT_MALZEME_SURELER TYPE TABLE OF TY_MALZEME_SURELER,
       LS_MALZEME_SURELER TYPE TY_MALZEME_SURELER.


" Kaç adet dinamik kolon oluşturulacağı için tanımlama
DATA : LV_DYN_COL_COUNT TYPE I.

" Field Catalog tanımlaması
DATA: IT_FLDCAT  TYPE LVC_T_FCAT.

" 1001 ekranı içerisinde oluşturulacak olan ALV yapı tanımlamaları.
DATA : OB_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
       OB_GRID      TYPE REF TO CL_GUI_ALV_GRID.


INITIALIZATION.

START-OF-SELECTION.

  CALL SCREEN 1001.



*&---------------------------------------------------------------------*
*&      Module  STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
MODULE STATUS_1001 OUTPUT.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
  SET TITLEBAR 'TITLE' WITH SY-UNAME.

  " Tablo içerisindeki tüm verilerin çekilmesi.
  PERFORM GET_MALZEMELER.

  " Dinamik tablo yapısının oluşturulması.
  PERFORM SET_DYNAMIC_TABLE.

  " Oluşturulan dinamik tabloya göre rapor bilgilerinin oluşturulması.
  PERFORM CREATE_REPORT.

  " 1001 ekranı üzerindeki ALV içerisinde raporun ekrana yazdırılması.
  IF OB_CONTAINER IS INITIAL.
    CREATE OBJECT OB_CONTAINER
      EXPORTING
        CONTAINER_NAME = 'GRID_ALV'.

    CREATE OBJECT OB_GRID
      EXPORTING
        I_PARENT      = OB_CONTAINER
        I_APPL_EVENTS = 'X'.


    CALL METHOD OB_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        I_DEFAULT       = 'X'
        I_SAVE          = 'A'
      CHANGING
        IT_FIELDCATALOG = IT_FLDCAT
        IT_OUTTAB       = <DYN_TABLE>.


  ELSE.
    CALL METHOD OB_GRID->REFRESH_TABLE_DISPLAY.
  ENDIF.


ENDMODULE.



*&---------------------------------------------------------------------*
*&      Form  GET_MALZEMELER
*&---------------------------------------------------------------------*
FORM GET_MALZEMELER .

  " Tüm bilgiler internal table içerisinde toplanır.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_MALZEMELER FROM ZDEMO_TABLE.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  SET_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
FORM SET_DYNAMIC_TABLE .
  DATA: INDEX(3) TYPE C.

  DATA: NEW_TABLE    TYPE REF TO DATA,
        NEW_LINE     TYPE REF TO DATA,
        WA_IT_FLDCAT TYPE LVC_S_FCAT.


  " Toplanan malzemeler KEY alanlara göre filtrelenir ve farklı bir internal table içerisinde toplanır.
  MOVE-CORRESPONDING LT_MALZEMELER TO LT_MALZEME_SURELER.

  IF LT_MALZEME_SURELER IS NOT INITIAL.
    SORT LT_MALZEME_SURELER BY MATNR WERKS URETIM_TARIHI.
    DELETE ADJACENT DUPLICATES FROM LT_MALZEME_SURELER COMPARING MATNR WERKS URETIM_TARIHI.

    " Tarih bilgilerine göre kaç tane dinamik kolon oluşturulacağının sayısı alınır.
    DESCRIBE TABLE LT_MALZEME_SURELER LINES LV_DYN_COL_COUNT.
  ENDIF.


  " SET Field Catalog

  " Sabit kolonlar
  CLEAR WA_IT_FLDCAT.
  WA_IT_FLDCAT-FIELDNAME = 'MATNR'.
  WA_IT_FLDCAT-SCRTEXT_S =
  WA_IT_FLDCAT-SCRTEXT_M =
  WA_IT_FLDCAT-SCRTEXT_L =
  WA_IT_FLDCAT-SELTEXT =
  WA_IT_FLDCAT-REPTEXT =
  WA_IT_FLDCAT-COLTEXT = 'Malzeme No'.
  WA_IT_FLDCAT-DATATYPE = 'CHAR'.
  WA_IT_FLDCAT-INTLEN = 18.
  APPEND WA_IT_FLDCAT TO IT_FLDCAT .

  CLEAR WA_IT_FLDCAT.
  WA_IT_FLDCAT-FIELDNAME = 'WERKS'.
  WA_IT_FLDCAT-SCRTEXT_S =
  WA_IT_FLDCAT-SCRTEXT_M =
  WA_IT_FLDCAT-SCRTEXT_L =
  WA_IT_FLDCAT-SELTEXT =
  WA_IT_FLDCAT-REPTEXT =
  WA_IT_FLDCAT-COLTEXT = 'Üretim Yeri'.
  WA_IT_FLDCAT-DATATYPE = 'CHAR'.
  WA_IT_FLDCAT-INTLEN = 4.
  APPEND WA_IT_FLDCAT TO IT_FLDCAT .

  CLEAR INDEX.

  " Dinamik Kolonlar

  " Dinamik kolon sayısı kadar DO işlemi uygulanır ve FCAT içersine eklenir.
  DO LV_DYN_COL_COUNT TIMES.
    INDEX = SY-INDEX.
    CLEAR : WA_IT_FLDCAT, LS_MALZEME_SURELER.

    READ TABLE LT_MALZEME_SURELER INTO LS_MALZEME_SURELER INDEX INDEX.

    WA_IT_FLDCAT-FIELDNAME = LS_MALZEME_SURELER-URETIM_TARIHI.

    WA_IT_FLDCAT-DATATYPE = 'INT4'.
    WA_IT_FLDCAT-SCRTEXT_S =
    WA_IT_FLDCAT-SCRTEXT_M =
    WA_IT_FLDCAT-SCRTEXT_L =
    WA_IT_FLDCAT-SELTEXT =
    WA_IT_FLDCAT-REPTEXT =
    WA_IT_FLDCAT-COLTEXT = LS_MALZEME_SURELER-URETIM_TARIHI+6(2) && '.'
                        && LS_MALZEME_SURELER-URETIM_TARIHI+4(2) && '.'
                        && LS_MALZEME_SURELER-URETIM_TARIHI+0(4).
    WA_IT_FLDCAT-COLDDICTXT   = 'L'.

    " Tablo içerisindeki her bir tarih kolon olarak eklenir.
    APPEND WA_IT_FLDCAT TO IT_FLDCAT .

  ENDDO.

  SORT IT_FLDCAT BY FIELDNAME DESCENDING.
  DELETE ADJACENT DUPLICATES FROM IT_FLDCAT COMPARING FIELDNAME.

* FCAT içerisindeki yapıya göre dinamik tablo oluşturulur.
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = IT_FLDCAT
    IMPORTING
      EP_TABLE        = NEW_TABLE.

  ASSIGN NEW_TABLE->* TO <DYN_TABLE>.

* Dinamik tablos satır yapısı oluşturulur.
  CREATE DATA NEW_LINE LIKE LINE OF <DYN_TABLE>.
  ASSIGN NEW_LINE->* TO <DYN_WA>.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  CREATE_REPORT
*&---------------------------------------------------------------------*
FORM CREATE_REPORT .
  DATA: FIELDNAME(20) TYPE C,
        FIELDVALUE    TYPE I,
        INDEX(3)      TYPE C.
  FIELD-SYMBOLS: <FS1>.

  INDEX = SY-INDEX.

  CLEAR LS_MALZEME_SURELER.
  READ TABLE LT_MALZEME_SURELER INTO LS_MALZEME_SURELER INDEX INDEX.

  " Filtrelenen malzemeler içerisinde MATNR, WERKS ve Üretim Tarihi bazında COST toplamı REDUCTION kullanılarak hesaplanır.
  LOOP AT LT_MALZEME_SURELER ASSIGNING FIELD-SYMBOL(<FS_MLZ>).

    <FS_MLZ>-TOTAL_COST = REDUCE ZDEMO_COST( INIT VAL TYPE ZDEMO_COST
                                FOR WA IN LT_MALZEMELER
                                WHERE ( MATNR EQ <FS_MLZ>-MATNR
                                AND     WERKS EQ <FS_MLZ>-WERKS
                                AND     URETIM_TARIHI EQ <FS_MLZ>-URETIM_TARIHI )
                                NEXT VAL = VAL + WA-COST ).


  ENDLOOP.


  " Kolon bazında dinamik olarak oluşturulan üretim tarihi kolonları filtrelenerek
  " Hangi tarihte toplam olarak hangi malzemeden hangi üretim yerinde olduğu belirlenir
  " Tablo filtreli olarak özet hale getirilir.
  DATA : LT_MLZ_LIST TYPE TABLE OF TY_MALZEME_SURELER.
  MOVE-CORRESPONDING LT_MALZEME_SURELER TO LT_MLZ_LIST.
  SORT LT_MLZ_LIST BY MATNR WERKS.
  DELETE ADJACENT DUPLICATES FROM LT_MLZ_LIST COMPARING MATNR WERKS.

  " Tablo içerisinde hangi alana hangi değer geleceği oluşturulur ve satır yapısı olarak
  " dinamik tablo içerisine eklenir.
  LOOP AT LT_MLZ_LIST ASSIGNING FIELD-SYMBOL(<FS_MLZ_1>).
    CLEAR : <DYN_WA>.
    LOOP AT LT_MALZEME_SURELER ASSIGNING FIELD-SYMBOL(<FS_MLZ_SURE>)
      WHERE MATNR EQ <FS_MLZ_1>-MATNR
        AND WERKS EQ <FS_MLZ_1>-WERKS.

      FIELDNAME  = <FS_MLZ_SURE>-URETIM_TARIHI.CONDENSE FIELDNAME.
      FIELDVALUE = <FS_MLZ_SURE>-TOTAL_COST.CONDENSE FIELDNAME.
      ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS1>.
      <FS1> =  FIELDVALUE.


      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <FS1>.
      <FS1> = <FS_MLZ_SURE>-MATNR.

      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <DYN_WA> TO <FS1>.
      <FS1> = <FS_MLZ_SURE>-WERKS.

    ENDLOOP.

    APPEND <DYN_WA> TO <DYN_TABLE>.
  ENDLOOP.
ENDFORM.

FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
**Status
  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING RT_EXTAB .
**Title
  SET TITLEBAR 'TITLE'.
ENDFORM.

FORM USER_COMMAND  USING R_UCOMM     LIKE SY-UCOMM
                         RS_SELFIELD TYPE SLIS_SELFIELD.

ENDFORM.

Sonuç olarak ekran çıktısı ilk başta belirlediğimiz senaryodaki gibi olmuştur.

 


Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s