Mustafa HAMIT

ABAP’ta RANGE Kullanımı (SELECT-OPTIONS, RANGES Tablosu, IN ile Filtreleme) – Örneklerle

ABAP’ta “bir alan için birden fazla değer / aralık” ile filtreleme yapmak istediğimizde en pratik yöntem RANGE mantığıdır. RANGE hem selection screen tarafında SELECT-OPTIONS ile karşımıza çıkar, hem de program içinde RANGES veya TYPE RANGE OF ile manuel oluşturulabilir.

Bu yazıda RANGE’in yapısını, SIGN / OPTION / LOW / HIGH alanlarını, en yaygın kullanım şekillerini ve dikkat edilmesi gereken noktaları örneklerle anlatacağız.


1) RANGE nedir?

RANGE aslında standart bir iç tablo formatıdır. Her satır bir filtre koşulunu temsil eder.

Bir RANGE satırında şu alanlar vardır:

  • SIGN
    • I = Include (dahil et)
    • E = Exclude (hariç tut)
  • OPTION
    En yaygın opsiyonlar:
    • EQ (eşit)
    • BT (between)
    • GE / LE (>= / <=)
    • CP (pattern, like)
    • NE (eşit değil) (her yerde önerilmez)
  • LOW
    Değerin kendisi veya aralık başlangıcı
  • HIGH
    Sadece aralık gerekiyorsa (BT) aralık bitişi

2) Selection Screen: SELECT-OPTIONS kullanımı

Kullanıcıdan “tek değer + çoklu değer + aralık” almanın klasik yolu:

SELECT-OPTIONS: s_matnr FOR mara-matnr.

Bu tek satırla ABAP otomatik olarak:

  • çoklu seçim
  • aralık
  • exclude
  • pattern

gibi özellikleri verir.

Kullanım:

SELECT matnr, mtart, matkl
  FROM mara
  INTO TABLE @DATA(lt_mara)
  WHERE matnr IN @s_matnr.

Buradaki IN @s_matnr aslında RANGE mantığıdır.


3) Program içinde RANGE tanımlama (TYPE RANGE OF)

Selection screen olmadan da RANGE oluşturabilirsin:

DATA r_matnr TYPE RANGE OF mara-matnr.

RANGE satırı eklemek:

3.1 Tek değer (EQ)

APPEND VALUE #( sign = 'I'
                option = 'EQ'
                low = '000000000000001234' ) TO r_matnr.

3.2 Aralık (BT)

APPEND VALUE #( sign = 'I'
                option = 'BT'
                low = '000000000000001000'
                high = '000000000000002000' ) TO r_matnr.

3.3 Hariç tutma (Exclude)

APPEND VALUE #( sign = 'E'
                option = 'EQ'
                low = '000000000000001500' ) TO r_matnr.

Sonra Open SQL’de kullan:

SELECT matnr, mtart
  FROM mara
  INTO TABLE @DATA(lt_mara)
  WHERE matnr IN @r_matnr.

4) RANGES komutu ile klasik tanımlama

Eski stil ama hâlâ görülür:

RANGES r_matnr FOR mara-matnr.

Sonra satır doldurma:

r_matnr-sign = 'I'.
r_matnr-option = 'EQ'.
r_matnr-low = '000000000000001234'.
APPEND r_matnr.

Modern ABAP’ta TYPE RANGE OF + APPEND VALUE #(...) daha okunur.


5) CP (pattern) ile LIKE mantığı

Örnek: MATNR belirli bir desenle başlıyorsa:

APPEND VALUE #( sign = 'I'
                option = 'CP'
                low = 'MAT*' ) TO r_matnr.

Sonra:

SELECT matnr
  FROM mara
  INTO TABLE @DATA(lt_mats)
  WHERE matnr IN @r_matnr.

Not: CP performansı, indeks kullanımı ve alan formatına göre değişebilir. Çok büyük tablolarda dikkat.


6) RANGE boşsa ne olur?

Eğer r_matnr boş ise ve sen WHERE matnr IN @r_matnr yazarsan:

  • genelde sonuç “hiç kayıt gelmesin” gibi davranır (DB’ye göre değişen optimizasyonlar olabilir)
  • ama pratikte çoğu raporda istenen davranış bu değildir

Bu yüzden sık kullanılan kontrol:

IF r_matnr IS INITIAL.
  "kullanıcı hiç seçim yapmadıysa ne olacak? (ör. hata ver / default ver)
ENDIF.

7) RANGE ile FOR ALL ENTRIES birlikte kullanımı

Örnek: hem kullanıcı MATNR range seçsin, hem de FAE tablosundan gelen listeyi uygula.

Genelde şu mantıkla ilerlenir:

  • Önce RANGE ile bir filtre uygula
  • Sonra oluşan liste ile FAE veya JOIN kullan

FAE içinde doğrudan “IN range” + “FAE” birlikte de yazılabilir, ama dikkatli planlamak gerekir (performans/okunabilirlik).


Sonuç

ABAP’ta RANGE mantığı hem selection screen tarafında hem de program içinde filtre oluşturmak için çok güçlüdür.

Özet:

  • SELECT-OPTIONS zaten bir RANGE tablosudur
  • RANGE alanları: SIGN / OPTION / LOW / HIGH
  • Open SQL’de WHERE field IN @range şeklinde kullanılır
  • Modern yazım: DATA r_x TYPE RANGE OF ... + APPEND VALUE #( ... )

Abap’ta select option örnekleri için bu yazıyı okuyabilirsiniz.

Link: https://www.mustafahamit.com/abap-selection-screen-temelleri-parameters-select-options/

Loading

Bir yanıt yazın