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.