Emre Göçmen Blog

SAP ABAP'de Popup ALV Nasıl Oluşturulur?

5 dk. okuma
3823 görüntülenme
0 yorum

Emre Göçmen

Yazar

SAP ABAP'de Popup ALV Nasıl Oluşturulur?

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

0

Yorum yapmak için giriş yapmalısınız.

Henüz yorum bulunmamaktadır.

İlk yorumu yapan siz olun.

Emre Göçmen

Yazar & Geliştirici

SAP ABAP & Full Stack geliştirici olarak deneyimlerim, becerilerim ve kariyer yolculuğum hakkında blog yazılarım.

Kategori

SAP

SAP

Yazılardan Haberdar Olun

Yeni yazılardan ilk siz haberdar olmak için e-posta bültenime abone olun.