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-OPTIONSzaten 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/
![]()