SAP ABAP'de Popup ALV Nasıl Oluşturulur?
Emre Göçmen
Yazar

SAP ABAP'de Popup ALV Nasıl Oluşturulur?
Popup ALV (ABAP Liste Görüntüleyici), kullanıcılara ana ekrandan çıkmadan veri listelerini etkileşimli olarak inceleme imkanı sunan güçlü bir SAP bileşenidir. Bu kapsamlı rehberde, ABAP'de tamamen işlevsel bir Popup ALV oluşturmanın tüm adımlarını ele alacağız.
Popup ALV Nedir?
Popup ALV, bir diyalog penceresi içinde görüntülenen ALV Grid bileşenidir. Bu bileşen, kullanıcıların veri sıralama, filtreleme, gruplama ve dışa aktarma gibi standart ALV işlevlerini kullanarak veri listelerini analiz etmelerine olanak tanır. Ana ekrandan çıkmadan veri analizine izin verdiği için kullanıcı deneyimini önemli ölçüde iyileştirir.
Popup ALV'ler özellikle şu durumlarda faydalıdır:
• Ana ekrandaki bir seçimin detaylarını göstermek
• Çok adımlı bir süreçte ara sonuçları görüntülemek
• Kullanıcının bir listeden seçim yapmasına olanak tanımak
• Ayrıntılı veri incelemesi için geçici pencereler sağlamak
Popup ALV Oluşturmak İçin Adım Adım Kılavuz
1. Veri Yapısını ve İç Tabloyu Tanımlayın
İlk adım, ALV'de görüntülenecek verileri içeren bir iç tablo tanımlamaktır:
* Veri yapısını ve iç tabloyu tanımlayın
TYPES: BEGIN OF ty_data,
matnr TYPE matnr, " Malzeme numarası
maktx TYPE maktx, " Malzeme tanımı
werks TYPE werks_d, " Üretim yeri
lgort TYPE lgort_d, " Depo yeri
menge TYPE menge_d, " Miktar
meins TYPE meins, " Ölçü birimi
dmbtr TYPE dmbtr, " Tutar
waers TYPE waers, " Para birimi
END OF ty_data.
DATA: lt_data TYPE TABLE OF ty_data,
ls_data TYPE ty_data.
2. Verileri Doldurun
İkinci adım, ALV'de görüntülenecek verileri toplamaktır. Bu örnekte MARA ve MARC tablolarından bazı malzeme verilerini alacağız:
* Örnek veri toplama
SELECT m~matnr m~maktx c~werks c~lgort
FROM mara AS m
INNER JOIN marc AS c ON m~matnr = c~matnr
INTO CORRESPONDING FIELDS OF TABLE lt_data
UP TO 100 ROWS
WHERE m~mtart = 'FERT' " Sadece bitmiş ürünler
AND c~werks IN ('1000', '2000') " Belirli üretim yerleri
ORDER BY m~matnr.
* Örnek olarak miktar ve değer bilgilerini rastgele dolduralım
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
<fs_data>-menge = ( sy-tabix + 1 ) * 10.
<fs_data>-dmbtr = <fs_data>-menge * 25.
<fs_data>-meins = 'ST'.
<fs_data>-waers = 'TRY'.
ENDLOOP.
3. Alan Kataloğunu Oluşturun
Alan kataloğu, ALV'deki sütunların görünümünü ve davranışını tanımlar:
* Alan kataloğu için gerekli değişkenleri tanımlayın
DATA: lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat,
ls_layout TYPE lvc_s_layo.
* Alan kataloğunu oluşturan işlevi çağırın
PERFORM create_fieldcatalog CHANGING lt_fieldcat.
* Alan kataloğu oluşturma formu
FORM create_fieldcatalog CHANGING pt_fieldcat TYPE lvc_t_fcat.
* Malzeme numarası
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-coltext = 'Malzeme No'.
ls_fieldcat-key = 'X'. " Anahtar alan
ls_fieldcat-outputlen = 10.
APPEND ls_fieldcat TO pt_fieldcat.
* Malzeme tanımı
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MAKTX'.
ls_fieldcat-coltext = 'Malzeme Tanımı'.
ls_fieldcat-outputlen = 30.
APPEND ls_fieldcat TO pt_fieldcat.
* Üretim yeri
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'WERKS'.
ls_fieldcat-coltext = 'Üretim Yeri'.
ls_fieldcat-outputlen = 5.
APPEND ls_fieldcat TO pt_fieldcat.
* Depo yeri
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'LGORT'.
ls_fieldcat-coltext = 'Depo Yeri'.
ls_fieldcat-outputlen = 5.
APPEND ls_fieldcat TO pt_fieldcat.
* Miktar
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MENGE'.
ls_fieldcat-coltext = 'Miktar'.
ls_fieldcat-outputlen = 10.
ls_fieldcat-datatype = 'QUAN'. " Miktar veri tipi
ls_fieldcat-no_zero = 'X'. " Sıfırları gösterme
ls_fieldcat-emphasize = 'C500'. " Renklendirme (açık sarı)
APPEND ls_fieldcat TO pt_fieldcat.
* Ölçü birimi
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MEINS'.
ls_fieldcat-coltext = 'Birim'.
ls_fieldcat-outputlen = 3.
APPEND ls_fieldcat TO pt_fieldcat.
* Tutar
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'DMBTR'.
ls_fieldcat-coltext = 'Tutar'.
ls_fieldcat-outputlen = 12.
ls_fieldcat-datatype = 'CURR'. " Para birimi veri tipi
ls_fieldcat-no_zero = 'X'. " Sıfırları gösterme
ls_fieldcat-emphasize = 'C300'. " Renklendirme (açık yeşil)
APPEND ls_fieldcat TO pt_fieldcat.
* Para birimi
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'WAERS'.
ls_fieldcat-coltext = 'Para Birimi'.
ls_fieldcat-outputlen = 3.
APPEND ls_fieldcat TO pt_fieldcat.
ENDFORM.
4. Düzen Ayarlarını Yapılandırın
ALV Grid için düzen ayarlarını tanımlayın:
* Düzen ayarlarını yapılandırın
CLEAR ls_layout.
ls_layout-zebra = 'X'. " Zebra desenli arka plan
ls_layout-cwidth_opt = 'X'. " Sütun genişliğini otomatik optimize et
ls_layout-grid_title = 'Malzeme Stok Listesi'. " Grid başlığı
ls_layout-sel_mode = 'A'. " Satır seçim modu (A: her türlü seçim)
5. Popup Penceresini ve ALV Grid'i Oluşturun
Şimdi popup penceresini ve içindeki ALV Grid'i oluşturalım:
* Popup ALV için gerekli nesneleri tanımlayın
DATA: lo_popup TYPE REF TO cl_gui_dialogbox_container,
lo_alv_grid TYPE REF TO cl_gui_alv_grid,
lv_screen_start TYPE i VALUE 100,
lv_screen_end TYPE i VALUE 100.
* Popup penceresini oluşturun
CREATE OBJECT lo_popup
EXPORTING
width = 800 " Genişlik piksel cinsinden
height = 400 " Yükseklik piksel cinsinden
top = 50 " Ekranın üstünden konumu
left = 50 " Ekranın solundan konumu
caption = 'Malzeme Stok Durumu' " Pencere başlığı
lifetime = cl_gui_control=>lifetime_dynpro.
* ALV Grid'i popup konteynerine bağlayın
CREATE OBJECT lo_alv_grid
EXPORTING
i_parent = lo_popup.
* ALV Grid için olay işleyicilerini kaydedin
SET HANDLER lcl_event_handler=>on_double_click FOR lo_alv_grid.
SET HANDLER lcl_event_handler=>on_toolbar FOR lo_alv_grid.
SET HANDLER lcl_event_handler=>on_user_command FOR lo_alv_grid.
* ALV Grid'in ilk gösterimini yapın
CALL METHOD lo_alv_grid->set_table_for_first_display
EXPORTING
i_save = 'A' " Düzeni sakla (A: otomatik)
is_layout = ls_layout
CHANGING
it_outtab = lt_data
it_fieldcatalog = lt_fieldcat.
* Popup ekranını çağırın ve işleme başlayın
CALL SCREEN lv_screen_start STARTING AT 10 10
ENDING AT 110 40.
6. Olay İşleme Sınıfını Ekleyin
ALV olaylarını işlemek için bir olay işleyici sınıfı oluşturun:
* Olay işleme sınıfını tanımlayın
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
on_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING
e_row e_column es_row_no,
on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object,
on_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_double_click.
DATA: lv_matnr TYPE matnr,
lv_werks TYPE werks_d.
READ TABLE lt_data INDEX es_row_no-row_id INTO ls_data.
IF sy-subrc = 0.
lv_matnr = ls_data-matnr.
lv_werks = ls_data-werks.
MESSAGE s000(0k) WITH 'Seçilen malzeme:' lv_matnr
'Üretim yeri:' lv_werks.
ENDIF.
ENDMETHOD.
METHOD on_toolbar.
DATA: ls_toolbar TYPE stb_button.
" Detayları göster butonu ekle
CLEAR ls_toolbar.
ls_toolbar-function = 'DETAIL'.
ls_toolbar-icon = icon_detail.
ls_toolbar-text = 'Detaylar'.
ls_toolbar-quickinfo = 'Malzeme detaylarını göster'.
ls_toolbar-butn_type = 0.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD.
METHOD on_user_command.
DATA: lt_selected_rows TYPE lvc_t_row,
ls_selected_row TYPE lvc_s_row.
CASE e_ucomm.
WHEN 'DETAIL'.
" Seçili satırları al
CALL METHOD lo_alv_grid->get_selected_rows
IMPORTING
et_index_rows = lt_selected_rows.
IF lt_selected_rows IS INITIAL.
MESSAGE 'Lütfen bir satır seçin' TYPE 'I'.
ELSE.
READ TABLE lt_selected_rows INTO ls_selected_row INDEX 1.
READ TABLE lt_data INDEX ls_selected_row-index INTO ls_data.
IF sy-subrc = 0.
MESSAGE s000(0k) WITH 'Detaylar:' ls_data-matnr
ls_data-maktx ls_data-werks.
ENDIF.
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.
7. Ekran İşlemlerini Tanımlayın
Popup ekranı için PBO ve PAI modüllerini tanımlayın:
* PBO ve PAI modülleri
MODULE status_0100 OUTPUT.
SET PF-STATUS 'POPUP'.
SET TITLEBAR 'TITLE_100'.
ENDMODULE.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
" Popup penceresini kapatın
IF lo_popup IS BOUND.
CALL METHOD lo_popup->free
EXCEPTIONS
OTHERS = 1.
ENDIF.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
8. Fonksiyonel Modül Haline Getirme
Kodunuzu tekrar kullanılabilir bir fonksiyon modülüne dönüştürmek için:
FUNCTION z_display_popup_alv.
*"----------------------------------------------------------------------
*"*"Yerel Arayüz:
*" IMPORTING
*" REFERENCE(IT_DATA) TYPE ANY TABLE
*" REFERENCE(IV_TITLE) TYPE STRING OPTIONAL
*" REFERENCE(IV_WIDTH) TYPE I DEFAULT 800
*" REFERENCE(IV_HEIGHT) TYPE I DEFAULT 400
*"----------------------------------------------------------------------
DATA: lo_popup TYPE REF TO cl_gui_dialogbox_container,
lo_alv_grid TYPE REF TO cl_gui_alv_grid,
lt_fieldcat TYPE lvc_t_fcat,
ls_layout TYPE lvc_s_layo.
" Popup konteynerini oluştur
CREATE OBJECT lo_popup
EXPORTING
width = iv_width
height = iv_height
top = 50
left = 50
caption = iv_title.
" ALV Grid'i oluştur
CREATE OBJECT lo_alv_grid
EXPORTING
i_parent = lo_popup.
" Alan kataloğunu otomatik oluştur
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = cl_abap_typedescr=>describe_by_data( it_data )
CHANGING
ct_fieldcat = lt_fieldcat
EXCEPTIONS
OTHERS = 1.
" Düzen ayarlarını yapılandır
ls_layout-zebra = 'X'.
ls_layout-cwidth_opt = 'X'.
ls_layout-grid_title = iv_title.
ls_layout-sel_mode = 'A'.
" ALV'yi görüntüle
CALL METHOD lo_alv_grid->set_table_for_first_display
EXPORTING
is_layout = ls_layout
CHANGING
it_outtab = it_data
it_fieldcatalog = lt_fieldcat.
" Ekrana tıklama olayını bekle
DATA: lv_dummy TYPE c.
cl_gui_cfw=>flush( ).
cl_gui_cfw=>dispatch( ).
READ LINE.
" Kapatırken kaynakları serbest bırak
IF lo_popup IS BOUND.
CALL METHOD lo_popup->free.
ENDIF.
ENDFUNCTION.
Uygulama Örneği
İşte bir programda nasıl kullanacağınızın tam örneği:
REPORT zpopup_alv_demo.
START-OF-SELECTION.
PERFORM get_data_and_display.
FORM get_data_and_display.
TYPES: BEGIN OF ty_material,
matnr TYPE matnr,
maktx TYPE maktx,
werks TYPE werks_d,
lgort TYPE lgort_d,
menge TYPE menge_d,
meins TYPE meins,
dmbtr TYPE dmbtr,
waers TYPE waers,
END OF ty_material.
DATA: lt_materials TYPE TABLE OF ty_material,
ls_material TYPE ty_material.
" Örnek veri topla
SELECT m~matnr m~maktx c~werks c~lgort
FROM mara AS m
INNER JOIN marc AS c ON m~matnr = c~matnr
INTO CORRESPONDING FIELDS OF TABLE lt_materials
UP TO 50 ROWS
WHERE m~mtart = 'FERT'
ORDER BY m~matnr.
" Örnek değerleri doldur
LOOP AT lt_materials ASSIGNING FIELD-SYMBOL(<fs_mat>).
<fs_mat>-menge = ( sy-tabix + 1 ) * 10.
<fs_mat>-dmbtr = <fs_mat>-menge * 25.
<fs_mat>-meins = 'ST'.
<fs_mat>-waers = 'TRY'.
ENDLOOP.
" Popup ALV fonksiyonunu çağır
CALL FUNCTION 'Z_DISPLAY_POPUP_ALV'
EXPORTING
it_data = lt_materials
iv_title = 'Malzeme Stok Durumu'.
ENDFORM.
İpuçları ve En İyi Uygulamalar
Popup ALV'leri oluştururken dikkate alınması gereken bazı ipuçları:
• Bellek yönetimi: Popup kapatıldığında tüm nesneleri serbest bıraktığınızdan emin olun
• Pencere boyutlandırma: Görüntülenen veri miktarına uygun bir pencere boyutu kullanın
• Renklendirme: Önemli alanları vurgulamak için emphasize özelliğini kullanın
• Butonlar: Kullanıcı deneyimini geliştirmek için yararlı toolbar butonları ekleyin
• Filtreleme: Büyük veri kümeleri için filtreleme özelliklerini etkinleştirin
• Sütun genişlikleri: Verimli alan kullanımı için cwidth_opt özelliğini etkinleştirin
Sonuç
Popup ALV'ler, SAP uygulamalarınızın kullanıcı deneyimini önemli ölçüde geliştirebilen güçlü bileşenlerdir. Bu rehberde, işlevsel bir Popup ALV'nin nasıl oluşturulacağını, özelleştirileceğini ve kullanılacağını ayrıntılı olarak öğrendik. Bu bilgileri kullanarak, kullanıcılarınız için daha interaktif ve kullanıcı dostu uygulamalar geliştirebilirsiniz.
Bu teknikleri kendi projelerinizde uygulayarak, kullanıcılarınıza daha verimli ve görsel olarak çekici bir veri görüntüleme deneyimi sunabilirsiniz.
Yorumlar
Henüz yorum bulunmamaktadır.
İlk yorumu yapan siz olun.



