Mustafa HAMIT

ABAP’ta READ TABLE ve BINARY SEARCH Kullanımı (Doğru Kullanım, Hatalar, Örnekler)

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ı arama
  • INDEX n ile belirli satırı okuma
  • TRANSPORTING NO FIELDS ile sadece “var mı yok mu?” kontrolü

Başarılı/başarısız durumu genelde sy-subrc ile kontrol edilir:

  • sy-subrc = 0: bulundu
  • sy-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 SEARCH kullanacaksan, tabloyu aradığın anahtara göre önceden SORT etmelisin.

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 SEARCH yazmana 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 SEARCH burada mantıklı değildir.

Özet:

  • Standard table + büyük veri + sık arama → SORT + BINARY SEARCH mantıklı olabilir
  • Sorted table → BINARY SEARCH çoğu zaman gereksiz
  • Hashed table → BINARY SEARCH kullanı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 SEARCH kullanacaksan tabloyu doğru anahtara göre SORT et
  • 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 FIELDS kullan

Eğer ABAP’ta internal table farklarını merak ediyorsanız, bu yazıyı inceleyebilirsiniz.

Link : https://www.mustafahamit.com/abap-internal-table-turleri-nelerdir-standard-sorted-ve-hashed-table-farklari/

Loading

Bir yanıt yazın