SAP ABAP'de Dinamik İç Tablo Sıralama Tekniklerinde Uzmanlaşma
Emre Göçmen
Yazar

SAP ABAP'de Dinamik İç Tablo Sıralama Tekniklerinde Uzmanlaşma
Dinamik iç tablo sıralama, SAP ABAP'de geliştiricilerin tabloları çalışma zamanı koşullarına göre sıralamasına olanak tanıyan güçlü bir özelliktir. Bu, özellikle sıralama kriterleri derleme zamanında bilinmediğinde ve program yürütmesi sırasında belirlenmesi gerektiğinde kullanışlıdır. Bu blog yazısında, örnekler ve en iyi uygulamalar eşliğinde dinamik iç tablo sıralamanın inceliklerini keşfedeceğiz.
Dinamik Sıralamaya Giriş
Birçok senaryoda, kullanıcı girdilerine veya diğer çalışma zamanı koşullarına dayalı olarak bir iç tabloyu sıralamanız gerekebilir. ABAP'deki dinamik sıralama, sıralama alanlarının ve sıralamanın program tarafından belirtilebilmesine olanak tanıyarak bunu başarma esnekliği sağlar.
Temel Kavramlar
Dinamik sıralamaya dalmadan önce, ABAP'deki SORT ifadesini kısaca gözden geçirelim. SORT ifadesi, bir iç tabloyu bir veya daha fazla alana göre sıralamak için kullanılır. İşte basit bir örnek:
DATA: lt_table TYPE TABLE OF spfli,
ls_table TYPE spfli.
* Tabloyu örnek verilerle doldurma
SELECT * FROM spfli INTO TABLE lt_table.
* Tabloyu cityfrom'a göre artan sırada sıralama
SORT lt_table BY cityfrom.
Yukarıdaki örnekte, sıralama alanı cityfrom derleme zamanında belirtilmiştir. Ancak, dinamik sıralamada sıralama alanlarını çalışma zamanında belirleriz.
Field Sembol Kullanarak Dinamik Sıralama
Bir iç tabloyu dinamik olarak sıralamak için field sembol ve dinamik ifadeler kullanırız. İşte adım adım bir kılavuz:
Adım 1: İç Tabloyu Tanımlayın ve Doldurun
Öncelikle, dinamik olarak sıralamak istediğiniz iç tabloyu tanımlayın ve doldurun.
DATA: lt_table TYPE TABLE OF spfli,
ls_table TYPE spfli.
* Tabloyu örnek verilerle doldurma
SELECT * FROM spfli INTO TABLE lt_table.
Adım 2: Sıralama Kriterlerini Belirleyin
Çalışma zamanı koşullarına göre sıralama kriterlerini belirleyin. Bu, kullanıcı girdileri veya programınızdaki herhangi bir mantık olabilir.
DATA: lv_sort_field TYPE string.
* Bir koşula dayalı olarak sıralama alanını ayarlama
lv_sort_field = 'CITYTO'. "" Bu, kullanıcı girdisine bağlı olarak dinamik olabilir
Adım 3: Tabloyu Dinamik Olarak Sıralayın
Dinamik sıralama ile SORT ifadesini kullanın. Burada VALUE operatörü ve dinamik ifadeler kullanılır.
TRY.
SORT lt_table BY VALUE #( ( name = lv_sort_field ) ).
CATCH cx_sy_dyn_table_ill_comp_val.
MESSAGE 'Sıralama kriterlerinde hata' TYPE 'E'.
ENDTRY.
Bu örnekte, lv_sort_field tablonun hangi alana göre sıralanacağını belirler.
Gelişmiş Dinamik Sıralama
Birden fazla alana göre veya farklı sıralarda sıralama gibi daha karmaşık sıralama senaryoları için dinamik sıralama mantığını genişletebilirsiniz.
DATA: lt_sort_order TYPE abap_sortorder_tab,
lv_sort_field2 TYPE string.
lv_sort_field = 'CITYFROM'.
lv_sort_field2 = 'CITYTO'.
APPEND VALUE #( name = lv_sort_field ) TO lt_sort_order.
APPEND VALUE #( name = lv_sort_field2 descending = 'X' ) TO lt_sort_order.
TRY.
SORT lt_table BY lt_sort_order.
CATCH cx_sy_dyn_table_ill_comp_val.
MESSAGE 'Sıralama kriterlerinde hata' TYPE 'E'.
ENDTRY.
Bu örnekte, iç tablo lt_table önce CITYFROM'a göre artan sırada ve sonra CITYTO'ya göre azalan sırada sıralanır.
Hataları Ele Alma
Dinamik sıralama yaparken, potansiyel hataları ele almak önemlidir. CX_SY_DYN_TABLE_ILL_COMP_VAL istisnası, geçersiz sıralama kriterleriyle ilgili sorunları yakalamak için kullanılabilir.
TRY.
SORT lt_table BY VALUE #( ( name = lv_sort_field ) ).
CATCH cx_sy_dyn_table_ill_comp_val.
MESSAGE 'Sıralama kriterlerinde hata' TYPE 'E'.
ENDTRY.
Field Semboller ve Dinamik Tablolarla Dinamik Sıralama
Dinamik iç tabloları sıralamak için, field sembolleri kullanarak tabloları dinamik olarak referans alır ve işleriz. İşte bunu nasıl yapabileceğiniz:
FIELD-SYMBOLS: <gfs_dyn_table> TYPE STANDARD TABLE,
<gfs_dyn_planned> TYPE STANDARD TABLE,
<gfs_dyn_unplanned> TYPE STANDARD TABLE,
<gfs_dyn_withdate_planned> TYPE STANDARD TABLE,
<gfs_dyn_withoutdate_planned> TYPE STANDARD TABLE,
<gfs_dyn_sorted> TYPE STANDARD TABLE,
<ls_table> TYPE any.
DATA : gt_planned TYPE REF TO data,
gt_unplanned TYPE REF TO data,
gt_withdate_planned TYPE REF TO data,
gt_withoutdate_planned TYPE REF TO data,
gt_sorted TYPE REF TO data.
* Dinamik iç tablolar oluşturma
CREATE DATA gt_planned LIKE <gfs_dyn_table>.
CREATE DATA gt_unplanned LIKE <gfs_dyn_table>.
CREATE DATA gt_withdate_planned LIKE <gfs_dyn_table>.
CREATE DATA gt_withoutdate_planned LIKE <gfs_dyn_table>.
CREATE DATA gt_sorted LIKE <gfs_dyn_table>.
* Dinamik tabloları field sembollere atama
ASSIGN gt_planned->* TO <gfs_dyn_planned>.
ASSIGN gt_unplanned->* TO <gfs_dyn_unplanned>.
ASSIGN gt_withdate_planned->* TO <gfs_dyn_withdate_planned>.
ASSIGN gt_withoutdate_planned->* TO <gfs_dyn_withoutdate_planned>.
ASSIGN gt_sorted->* TO <gfs_dyn_sorted>.
* Verileri okuma ve planlama durumuna göre ayırma
LOOP AT <gfs_dyn_table> ASSIGNING <ls_table>.
ASSIGN COMPONENT 'PLANLANDI' OF STRUCTURE <ls_table> TO FIELD-SYMBOL(<lv_plan>).
IF <lv_plan> IS NOT INITIAL.
APPEND <ls_table> TO <gfs_dyn_planned>.
ELSE.
APPEND <ls_table> TO <gfs_dyn_unplanned>.
ENDIF.
ENDLOOP.
* Planlanan verileri malzeme hazır tarihli ve tarihsiz olarak ayırma
LOOP AT <gfs_dyn_planned> ASSIGNING <ls_table>.
ASSIGN COMPONENT 'DELIVERY_DATE' OF STRUCTURE <ls_table> TO FIELD-SYMBOL(<lv_date>).
IF <lv_date> IS NOT INITIAL AND <lv_date> NE '00000000'.
APPEND <ls_table> TO <gfs_dyn_withdate_planned>.
ELSE.
APPEND <ls_table> TO <gfs_dyn_withoutdate_planned>.
ENDIF.
ENDLOOP.
* Malzeme hazır tarihli kayıtları en eskiden en yeniye doğru aynı üretim
*başlangıç tarihi içinde sırala
SORT <gfs_dyn_withdate_planned> BY VALUE #( ( name = 'URETIM_BASLAMA_TARIH' )
( name = 'DELIVERY_DATE' ) ).
* Malzeme hazır tarihsiz kayıtları öncelik sırasına göre azalan şekilde aynı üretim
*başlangıç tarihi içinde sırala
SORT <gfs_dyn_withoutdate_planned> BY VALUE #( ( name = 'URETIM_BASLAMA_TARIH' )
( name = 'ONCELIK' descending = 'X' ) ).
* Sıralanmış tabloları birleştir
APPEND LINES OF <gfs_dyn_withdate_planned> TO <gfs_dyn_sorted>.
APPEND LINES OF <gfs_dyn_withoutdate_planned> TO <gfs_dyn_sorted>.
APPEND LINES OF <gfs_dyn_unplanned> TO <gfs_dyn_sorted>.
* Sonuçları orijinal tabloya geri yaz
REFRESH <gfs_dyn_table>.
APPEND LINES OF <gfs_dyn_sorted> TO <gfs_dyn_table>.
Bu kod, farklı koşullara göre dinamik iç tabloları nasıl sıralayacağınızı ve birincil sıralama düzenini koruyarak bunları nasıl birleştireceğinizi göstermektedir.
Pratik Örnek
Sıralama kriterlerinin kullanıcı girdisine göre belirlendiği pratik bir örnekte hepsini bir araya getirelim:
DATA: lt_table TYPE TABLE OF spfli,
ls_table TYPE spfli,
lv_sort_field TYPE string,
lt_sort_order TYPE abap_sortorder_tab.
* Tabloyu örnek verilerle doldurma
SELECT * FROM spfli INTO TABLE lt_table.
* Sıralama alanını belirlemek için kullanıcı girdisi
PARAMETERS: p_sort TYPE string.
lv_sort_field = p_sort.
APPEND VALUE #( name = lv_sort_field ) TO lt_sort_order.
TRY.
SORT lt_table BY lt_sort_order.
CATCH cx_sy_dyn_table_ill_comp_val.
MESSAGE 'Geçersiz sıralama alanı' TYPE 'E'.
ENDTRY.
* Sıralanmış tabloyu görüntüleme
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid, ls_table-connid, ls_table-cityfrom, ls_table-cityto.
ENDLOOP.
Bu örnekte, kullanıcı p_sort parametresi aracılığıyla sıralama alanını belirtir ve iç tablo buna göre sıralanır.
Sonuç
ABAP'deki dinamik iç tablo sıralama, çalışma zamanında belirlenen sıralama gereksinimleri için sağlam bir yol sunar. Field semboller, dinamik ifadeler ve potansiyel hataları ele alarak, ABAP programlarınızda esnek ve verimli sıralama mantığı oluşturabilirsiniz. Bu kılavuz, uygulamalarınızın işlevselliğini ve kullanıcı deneyimini artırarak çeşitli senaryolarda dinamik sıralama uygulamak için gereken bilgilerle sizi donatmalıdır.
Yorumlar
Henüz yorum bulunmamaktadır.
İlk yorumu yapan siz olun.



