ABAP’ta internal table (iç tablo) üzerinde kayıt bulmanın en yaygın yolu READ TABLE komutudur. Büyük tablolarla çalışırken BINARY SEARCH doğru kullanılırsa ciddi performans kazandırabilir; yanlış kullanılırsa ise hem yanlış sonuç döndürebilir hem de “bulamadım” gibi hatalı durumlar üretebilir.
Bu yazıda READ TABLE’ın temel kullanımını, BINARY SEARCH’ün ne zaman gerekli olduğunu, Sorted/Hashed tablolarla ilişkiyi ve en sık yapılan hataları örneklerle anlatacağız.
1) READ TABLE nedir?
READ TABLE, bir internal table içinde belirli bir kayıt/alan değerine göre satır arar.
En sık kullanım şekilleri:
WITH KEY ...ile anahtar bazlı aramaINDEX nile belirli satırı okumaTRANSPORTING NO FIELDSile sadece “var mı yok mu?” kontrolü
Başarılı/başarısız durumu genelde sy-subrc ile kontrol edilir:
sy-subrc = 0: bulundusy-subrc <> 0: bulunamadı
2) Basit READ TABLE örnekleri
2.1 WITH KEY ile arama (standart)
TYPES: BEGIN OF ty_mat,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
END OF ty_mat.
DATA lt_mat TYPE STANDARD TABLE OF ty_mat WITH EMPTY KEY.
DATA ls_mat TYPE ty_mat.
"örnek veri
APPEND VALUE #( matnr = '000000000000001234' mtart = 'FERT' ) TO lt_mat.
APPEND VALUE #( matnr = '000000000000009999' mtart = 'HALB' ) TO lt_mat.
READ TABLE lt_mat INTO ls_mat WITH KEY matnr = '000000000000009999'.
IF sy-subrc = 0.
WRITE: / 'Bulundu:', ls_mat-matnr, ls_mat-mtart.
ELSE.
WRITE: / 'Bulunamadi'.
ENDIF.
2.2 Sadece var mı kontrolü (TRANSPORTING NO FIELDS)
READ TABLE lt_mat TRANSPORTING NO FIELDS WITH KEY matnr = '000000000000009999'.
IF sy-subrc = 0.
WRITE / 'Kayit var'.
ENDIF.
Bu yöntem satırı kopyalamaz; sadece bulma işlemi yapar.
3) BINARY SEARCH nedir ve ne zaman kullanılır?
BINARY SEARCH, aramayı “ikili arama” mantığıyla yapar ve büyük tablolarda daha hızlıdır. Ancak kritik bir şartı vardır:
BINARY SEARCH sadece tablo doğru şekilde sıralanmışsa (SORT) doğru sonuç verir.
Altın kural:
READ TABLE ... BINARY SEARCHkullanacaksan, tabloyu aradığın anahtara göre öncedenSORTetmelisin.
4) BINARY SEARCH doğru kullanım örneği (STANDARD TABLE)
Senaryo: lt_mat büyük bir tablo olsun ve MATNR ile arama yapacağız.
4.1 Tabloyu sırala
SORT lt_mat BY matnr.
4.2 Binary search ile oku
READ TABLE lt_mat INTO ls_mat
WITH KEY matnr = '000000000000009999'
BINARY SEARCH.
IF sy-subrc = 0.
WRITE: / 'Bulundu (binary):', ls_mat-matnr, ls_mat-mtart.
ENDIF.
5) En sık hata: SORT yokken BINARY SEARCH kullanmak
Yanlış örnek:
READ TABLE lt_mat INTO ls_mat
WITH KEY matnr = '000000000000009999'
BINARY SEARCH.
Eğer lt_mat MATNR’ye göre sıralı değilse:
- yanlış satır dönebilir
sy-subrc“bulunamadı” dönebilir- davranış güvenilir değildir
Bu yüzden “BINARY SEARCH ekledim hızlandı” yaklaşımı, SORT kontrolü yoksa risklidir.
6) Sorted/Hashed table varken BINARY SEARCH kullanılır mı?
6.1 SORTED TABLE
SORTED TABLE zaten anahtarına göre her zaman sıralıdır. Bu yüzden:
READ TABLE ... WITH KEY ...zaten hızlıdır.- çoğu durumda ayrıca
BINARY SEARCHyazmana gerek yoktur.
6.2 HASHED TABLE
HASHED TABLE anahtar aramasında en hızlı seçeneklerden biridir (hash lookup).
READ TABLE ... WITH TABLE KEY ...kullanılır.BINARY SEARCHburada mantıklı değildir.
Özet:
- Standard table + büyük veri + sık arama →
SORT+BINARY SEARCHmantıklı olabilir - Sorted table →
BINARY SEARCHçoğu zaman gereksiz - Hashed table →
BINARY SEARCHkullanılmaz
7) Çok alanlı key ile BINARY SEARCH
Eğer arama birden fazla alanla yapılacaksa SORT sırası da aynı olmalıdır.
Örnek: werks + matnr ile arıyorsan:
SORT lt_marc BY werks matnr.
READ TABLE lt_marc INTO DATA(ls_marc)
WITH KEY werks = '1000'
matnr = '000000000000009999'
BINARY SEARCH.
Not: SORT sırası ile KEY sırası uyumlu olmalıdır.
8) Alternatif: Table expression (modern ABAP)
ABAP 7.40+ ile şuna benzer bir kullanım da var:
DATA(ls_any) = lt_mat[ matnr = '000000000000009999' ].
Bulamazsa exception (CX_SY_ITAB_LINE_NOT_FOUND) atar. Bu yüzden güvenli kullanım için line_exists( ) veya TRY...CATCH gerekir.
Sonuç
READ TABLE, internal table aramalarının temelidir. BINARY SEARCH ise doğru kullanılırsa performans kazandırır ama mutlaka şunlara dikkat edilmelidir:
BINARY SEARCHkullanacaksan tabloyu doğru anahtara göreSORTet- Standard table için anlamlı; Sorted/Hashed tabloda çoğu zaman gereksiz
- Çok alanlı aramada SORT sırası ile KEY sırası aynı olmalı
- Sadece kontrol için
TRANSPORTING NO FIELDSkullan
Eğer ABAP’ta internal table farklarını merak ediyorsanız, bu yazıyı inceleyebilirsiniz.
![]()