İçeriğe geç

AMDP Ne Zaman Kullanılır? ABAP SQL, CDS ve AMDP Arasında Karar

AMDP, SQLScript'i ABAP sınıfının içinde yazıp doğrudan HANA'da çalıştırmanızı sağlar. Güçlüdür, ama bedeli vardır: istemci yönetimi, yetki ve test sizin sorumluluğunuza geçer. SAP'nin kendi önerisi açıktır: ABAP SQL ile yapılabiliyorsa AMDP kullanmayın. Bu yazıda bu çizginin nereden geçtiğini anlatıyorum.

Mustafa Önder Mustafa Önder  ·  24 Ekim 2026  ·  15 dk okuma

İçindekiler

  1. "AMDP Daha Hızlıdır" Efsanesi
  2. Karar Sırası: ABAP SQL, CDS, AMDP
  3. AMDP'nin Gerçekten Gerektiği Yerler
  4. AMDP Sınıfı ve Prosedür
  5. CDS Table Function
  6. İstemci (Client) Güvenliği
  7. AMDP ve Yetki
  8. Hata, Hata Ayıklama ve Test
  9. AMDP'nin Bakım Maliyeti
  10. Sık Yapılan Hatalar
  11. Sonuç

HANA ile birlikte ABAP dünyasına "code pushdown" kavramı girdi: hesaplamayı uygulama sunucusunda değil, verinin yanında, veritabanında yapmak. AMDP (ABAP Managed Database Procedures) bunun en doğrudan aracıdır. SQLScript ile yazılan bir prosedür, ABAP sınıfının bir metodu olarak yaşar, ABAP gibi taşınır ve çağrıldığında HANA'da çalışır.

Bu güç, AMDP'yi bazı projelerde varsayılan araç hâline getirdi. Oysa SAP'nin ABAP belgesi ve resmi cheat sheet deposu tersini söyler: aynı iş ABAP SQL ile yapılabiliyorsa AMDP önerilmez. Bu yazıda karar sırasını, AMDP'nin gerçekten gerektiği yerleri ve kullandığınızda üstlendiğiniz sorumlulukları anlatıyorum. Sözdizimi SAP'nin ABAP anahtar kelime belgesine ve resmi örnek koduna dayanır; ayrıntılar sürüme göre değişebilir.

"AMDP Daha Hızlıdır" Efsanesi

ABAP SQL de veritabanında çalışır. Bir SELECT ... GROUP BY, toplama işlemini HANA'ya yaptırır; uygulama sunucusuna yalnız sonuç gelir. Yani basit bir sorguyu AMDP'ye taşımak onu kendiliğinden hızlandırmaz, çoğu zaman aynı SQL'i daha zor bakım yapılan bir yerde çalıştırır.

AMDP'nin performans avantajı, birden çok adımlı bir hesaplamada ara sonuçların uygulama sunucusuna taşınmasını önlediğinde ortaya çıkar: bir sorgunun sonucu ikinci bir sorguya, o da üçüncüsüne girdi oluyorsa ve bu adımlar ABAP SQL'in tek ifadesiyle (ya da bir CDS görünümüyle) ifade edilemiyorsa. Performans sorununun gerçekten nerede olduğunu bulmak için önce ölçün; ABAP performans analizi yazısındaki ST05 ve SAT adımları AMDP kararından önce gelir.

Karar Sırası: ABAP SQL, CDS, AMDP

İhtiyaca göre ABAP SQL, CDS view entity ve AMDP seçimi
İhtiyaçİlk tercihNeden
Filtre, join, toplama, CASE, alt sorguABAP SQLZaten veritabanında çalışır; istemci ve yetki otomatik
Ortak tablo ifadeleri (WITH), pencere fonksiyonları, hiyerarşilerABAP SQL (güncel sürümlerde)Çok adımlı sorguların büyük kısmını tek ifadede çözer
Tekrar kullanılan veri modeli, Fiori/OData, satır bazlı yetkiCDS view entityModel bir kez tanımlanır; DCL ve anotasyonlar üzerine kurulur
Ara sonuçlar üzerinde prosedürel, çok adımlı mantıkAMDP (çoğu zaman CDS table function olarak)ABAP SQL'in tek ifadesine sığmayan akış
ABAP SQL ve CDS'te karşılığı olmayan SQLScript veya HANA yeteneğiAMDPVeritabanına özgü yeteneğe tek kapı
Kural: AMDP'ye "bu ABAP SQL ile yapılamıyor" cümlesini kanıtladıktan sonra geçin. ABAP SQL'in yetenekleri her sürümde genişliyor; birkaç yıl önce AMDP gerektiren bir sorgu bugün tek bir SELECT olabilir.

AMDP'nin Gerçekten Gerektiği Yerler

  • Prosedürel akış: Bir ara sonuca göre dallanan, tablo değişkenleri üzerinde birkaç adımda ilerleyen ve her adımın bir öncekinin sonucuna dayandığı hesaplamalar.
  • Veritabanına özgü yetenekler: SQLScript'te bulunup ABAP SQL ve CDS'te karşılığı olmayan fonksiyonlar veya HANA kütüphaneleri. Burada önce sürümünüzün ABAP SQL ve CDS belgesine bakın; karşılık eklenmiş olabilir.
  • CDS modeline sığmayan bir veri kaynağı: Hesaplanması çok adımlı ama sonucu bir CDS varlığı gibi kullanılması gereken veri. Bunun doğru aracı, bir AMDP fonksiyonuyla uygulanan CDS table function'dır.

Ortak noktaları: hepsinde AMDP bir istisna, uygulamanın geri kalanı ise ABAP SQL ve CDS üzerinedir.

AMDP Sınıfı ve Prosedür

Sözdizimini görmek için basit bir örnekle başlayalım: bir şirket kodundaki onaylı masraf formlarını masraf yerine göre toplayan bir prosedür. (Bu kadar basit bir iş için AMDP gerekmez; bunu aşağıda göstereceğim.)

CLASS zcl_exp_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

    TYPES: BEGIN OF ty_cost_center_total,
             company_code TYPE zexp_report-company_code,
             cost_center  TYPE zexp_report-cost_center,
             report_count TYPE i,
             total_amount TYPE zexp_report-total_amount,
             currency     TYPE zexp_report-currency,
           END OF ty_cost_center_total,
           tt_cost_center_total TYPE STANDARD TABLE OF ty_cost_center_total WITH EMPTY KEY.

    METHODS get_cost_center_totals
      AMDP OPTIONS READ-ONLY CDS SESSION CLIENT DEPENDENT
      IMPORTING VALUE(iv_company_code) TYPE zexp_report-company_code
      EXPORTING VALUE(et_totals)       TYPE tt_cost_center_total
      RAISING   cx_amdp_execution_error.

ENDCLASS.

CLASS zcl_exp_amdp IMPLEMENTATION.

  METHOD get_cost_center_totals
    BY DATABASE PROCEDURE FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING zi_expensereport.

    approved = SELECT CompanyCode, CostCenter, TotalAmount, Currency
                 FROM zi_expensereport
                 WHERE CompanyCode = :iv_company_code
                   AND Status = 'A';

    et_totals = SELECT CompanyCode      AS company_code,
                       CostCenter       AS cost_center,
                       COUNT(*)         AS report_count,
                       SUM(TotalAmount) AS total_amount,
                       Currency         AS currency
                  FROM :approved
                  GROUP BY CompanyCode, CostCenter, Currency;

  ENDMETHOD.

ENDCLASS.

Belgede tanımlanan kurallar:

  • Sınıf: IF_AMDP_MARKER_HDB arayüzü zorunludur. Sınıf AMDP metotlarının yanında normal metotlar da içerebilir. AMDP sınıfları yalnız ADT'de düzenlenebilir.
  • Prosedür parametreleri: Hepsi değerle (VALUE(...)) geçer; referansla geçiş yoktur. Tipler genel olamaz; elementer tipler veya bileşenleri elementer olan yapılı satırlı tablo tipleri kullanılır. RETURNING kullanılamaz ve yalnız giriş parametreleri isteğe bağlı olabilir.
  • Uygulama: BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT metodun prosedür olduğunu söyler. USING listesi, SQLScript'in eriştiği ABAP nesnelerini (tablolar, CDS görünümleri, diğer AMDP metotları) sayar.
  • Gövde ABAP değildir. METHOD ile ENDMETHOD arası SQLScript'tir; ABAP değişkenleri yoktur, parametreler :iv_company_code biçiminde kullanılır.

ABAP'tan çağrı, normal bir metot çağrısıdır:

TRY.
    NEW zcl_exp_amdp( )->get_cost_center_totals(
      EXPORTING iv_company_code = '1000'
      IMPORTING et_totals       = DATA(totals) ).
  CATCH cx_amdp_execution_error INTO DATA(amdp_error).
    " amdp_error->get_text( ) ile günlüğe yazın
ENDTRY.

Aynı iş, ABAP SQL ile

SELECT CompanyCode, CostCenter,
       COUNT(*)           AS ReportCount,
       SUM( TotalAmount ) AS TotalAmount,
       Currency
  FROM zi_expensereport
  WHERE CompanyCode = @company_code
    AND Status = 'A'
  GROUP BY CompanyCode, CostCenter, Currency
  INTO TABLE @DATA(totals).

Bu tek ifade de toplamayı HANA'da yapar. Üstelik istemciyi otomatik yönetir, zi_expensereport'un DCL rolünü uygular, ABAP Unit ile kolayca test edilir ve ABAP bilen herkes tarafından okunur. AMDP sürümünün bu dört özelliğin hiçbirini kendiliğinden taşımadığını aşağıdaki bölümlerde göreceğiz. Bu örnekte doğru seçim açıkça ABAP SQL'dir.

CDS Table Function

AMDP'nin sonucunu ABAP SQL'de ve başka CDS görünümlerinde bir veri kaynağı gibi kullanmak istiyorsanız doğru araç CDS table function'dır. Table function bir CDS varlığıdır; gövdesi bir AMDP fonksiyonudur.

@EndUserText.label: 'Masraf yeri toplamları'
@AccessControl.authorizationCheck: #CHECK
@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #SESSION_VARIABLE
define table function ZTF_ExpenseCostCenterTotal
  with parameters
    p_company_code : abap.char(4)
  returns
  {
    client      : abap.clnt;
    CompanyCode : abap.char(4);
    CostCenter  : abap.char(10);
    ReportCount : abap.int4;
    TotalAmount : abap.dec(15,2);
    Currency    : abap.cuky;
  }
  implemented by method zcl_exp_amdp=>cost_center_totals;

Uygulayan metot özel bir biçimle tanımlanır: public bölümde, statik ve parametresiz. Parametreler ve dönüş tipi table function'dan türetilir:

CLASS-METHODS cost_center_totals FOR TABLE FUNCTION ztf_expensecostcentertotal.

METHOD cost_center_totals
  BY DATABASE FUNCTION FOR HDB
  LANGUAGE SQLSCRIPT
  OPTIONS READ-ONLY
  USING zi_expensereport.

  RETURN SELECT mandt            AS client,
                CompanyCode      AS CompanyCode,
                CostCenter       AS CostCenter,
                COUNT(*)         AS ReportCount,
                SUM(TotalAmount) AS TotalAmount,
                Currency         AS Currency
           FROM zi_expensereport
           WHERE CompanyCode = :p_company_code
             AND Status = 'A'
           GROUP BY mandt, CompanyCode, CostCenter, Currency;

ENDMETHOD.

Table function artık ABAP SQL'de okunabilir:

SELECT * FROM ztf_expensecostcentertotal( p_company_code = '1000' )
  INTO TABLE @DATA(totals).

İstemciye bağlı bir table function'da ilk dönüş elemanı istemci alanıdır ve SQLScript'in döndürdüğü kolon adları returns listesindeki adlarla eşleşmelidir.

İstemci (Client) Güvenliği

Bu, AMDP'nin en kolay gözden kaçan sorumluluğudur. ABAP SQL istemciyi örtük olarak yönetir: bir SELECT yalnız oturumdaki istemcinin verisini okur. AMDP ise Native SQL gibi çalışır ve örtük istemci yönetimi yoktur. Bir tabloyu SQLScript'te filtresiz okursanız bütün istemcilerin verisini okursunuz.

ABAP Cloud'da bu yüzden AMDP metotlarının istemci güvenli (client-safe) olması zorunludur:

  • İstemciye bağlı nesnelere erişen metot AMDP OPTIONS ... CDS SESSION CLIENT DEPENDENT ile, yalnız istemciden bağımsız nesnelere erişen metot CLIENT INDEPENDENT ile tanımlanır.
  • USING listesindeki her şey istemci güvenli olmalıdır: oturum istemcisine göre süzülen CDS görünümleri, istemciye bağlı tablolar (bu ekle çerçeve onları oturum istemcisine göre süzen bir görünüm üzerinden okur), istemci güvenli table function'lar ve aynı eki taşıyan diğer AMDP metotları.
  • İstemciye bağlı table function'lar @ClientHandling.type: #CLIENT_DEPENDENT ve @ClientHandling.algorithm: #SESSION_VARIABLE taşımalıdır.
  • SQLScript, USING listesinde olmayan ya da ABAP'ın yönetmediği veritabanı nesnelerine erişemez ve istemci kimliğini parametre alan HANA fonksiyonlarını çağıramaz.

ABAP Cloud'da ayrıca yalnız okumaya izin verilir (READ-ONLY zorunludur), yalnız SQLScript kullanılabilir ve erişilen veri kaynakları ABAP Cloud için serbest bırakılmış olmalıdır. Klasik ABAP'ta (Standard ABAP) bu kurallar daha gevşektir, ama sorumluluk ortadan kalkmaz: istemciyi açıkça yönetmeyen bir AMDP, test sisteminde fark edilmeyen ve canlıda başka bir istemcinin verisini getiren bir hatadır.

AMDP ve Yetki

CDS access control (DCL) yalnız ABAP SQL ile okunan CDS varlıklarında devreye girer. SQLScript içinde okunan tablo ve görünümler için rol değerlendirilmez. Yukarıdaki prosedür zi_expensereport'u okuyor; bu görünümün şirket kodu rolü varsa bile, AMDP içinde bu rol uygulanmaz ve prosedür yetkisi olmayan şirket kodlarının toplamını da döndürebilir.

İki çözüm vardır:

  • Table function'a rol yazmak: Table function ABAP SQL ile okunduğunda kendi DCL rolü uygulanır. Yukarıdaki örnekte @AccessControl.authorizationCheck: #CHECK var; CompanyCode üzerinden bir pfcg_auth rolü yazıldığında sonuç kullanıcının yetkisine göre süzülür.
  • Prosedürde yetkiyi açıkça kontrol etmek: Çağrıdan önce ABAP'ta AUTHORITY-CHECK ile şirket kodunu kontrol etmek. Bu, kontrolün her çağrı yerinde hatırlanmasını gerektirir.

Rol yazımı ve DCL'nin devreye girmediği diğer yerler için CDS yetkilendirme yazısına bakabilirsiniz.

Hata, Hata Ayıklama ve Test

  • Hatalar: SQLScript çalışırken oluşan hatalar ABAP'ta CX_AMDP_EXECUTION_ERROR gibi AMDP istisnaları olarak gelir. Prosedür bu istisnayı RAISING ile bildirmeli, çağıran yakalamalıdır. Table function için ise RAISING tanımlanamaz.
  • Hata ayıklama: ADT, SQLScript gövdesinde kesme noktası koymaya ve tablo değişkenlerini incelemeye izin veren bir AMDP hata ayıklayıcısı sunar.
  • Test: AMDP metodunu ABAP Unit'ten çağırmak mümkündür. Benim önerim: bilinen bir veriyle AMDP sonucunu, aynı hesabın basit bir ABAP SQL sürümüyle karşılaştıran bir test yazın. İki sonuç farklıysa hata ya AMDP'dedir ya da varsayımınızdadır. ABAP Unit'in genel kurgusu için ABAP Unit test yazısına bakabilirsiniz.
  • İstemci ve yetki testi: Birden çok istemcisi olan bir test sisteminde sonucu her istemcide, yetkisi kısıtlı bir kullanıcıyla da kontrol edin. AMDP hatalarının çoğu tam burada görünür.

AMDP'nin Bakım Maliyeti

  • Yalnız HANA: AMDP bugün yalnız SAP HANA veritabanı prosedür ve fonksiyonlarını destekler. S/4HANA'da bu bir sorun değildir, ama kod veritabanına bağlıdır.
  • İki dil: Ekipte SQLScript bilen biri yoksa AMDP, yalnız yazan kişinin bakım yapabildiği bir kara kutuya dönüşür.
  • Örtük güvenceler yok: İstemci, yetki ve hata yönetimi her metotta bilinçli olarak kurulmalıdır.
  • Araç bağımlılığı: AMDP sınıfları yalnız ADT'de düzenlenir.
  • ABAP Cloud kısıtları: Yalnız okuma, yalnız serbest bırakılmış kaynaklar, istemci güvenliği zorunlu.

Bu maliyetlerin hiçbiri AMDP'yi kötü yapmaz; yalnız onu bir varsayılan değil, gerekçesi yazılmış bir istisna yapar. Kod incelemesinde her AMDP için "bu neden ABAP SQL veya CDS değil?" sorusunun cevabı, sınıfın başında bir yorum olarak durmalıdır.

Sık Yapılan Hatalar

Basit sorguyu AMDP'ye taşımak

Filtre, join ve toplama zaten veritabanında çalışır. AMDP'ye taşımak hız kazandırmaz; istemci, yetki ve test sorumluluğunu size yükler.

İstemciyi unutmak

Filtresiz okunan istemciye bağlı tablo, bütün istemcilerin verisini getirir. ABAP Cloud'da CDS SESSION CLIENT DEPENDENT, klasik ABAP'ta da açık bir istemci yönetimi şarttır.

DCL'nin uygulandığını sanmak

SQLScript içinde okunan görünümün rolü uygulanmaz. Sonucu kullanıcıya gidecek veri için table function'a rol yazın veya yetkiyi açıkça kontrol edin.

AMDP içinde iş mantığı biriktirmek

Doğrulama, durum geçişi ve hesaplama kuralları AMDP'ye yazıldığında ekranla arka plan arasında iki ayrı kural seti oluşur. AMDP veri hazırlasın, iş kuralları ABAP'ta (ve RAP'ta) kalsın.

Gerekçesiz AMDP

Birkaç yıl sonra sınıfı açan geliştirici neden AMDP kullanıldığını bilmezse ne kaldırmaya ne de değiştirmeye cesaret eder. Gerekçeyi yazın.

Sonuç

AMDP, ABAP geliştiricisinin elindeki en keskin araçlardan biridir ve keskin araçlar dikkat ister. Karar sırası basittir: önce ABAP SQL, tekrar kullanılan model için CDS, ikisinin de çözemediği çok adımlı ya da veritabanına özgü işler için AMDP, tercihen bir CDS table function olarak. AMDP'ye geçtiğinizde istemci güvenliğini, yetkiyi ve testi bilinçli olarak kurun; bunlar ABAP SQL'in size bedavaya verdiği şeylerdi.

CDS ile veri modelleme ve servis tarafı için OData V4 ve CDS yazısına, sunduğum geliştirme kapsamı için SAP geliştirme hizmet sayfasına bakabilirsiniz.

Mevcut AMDP'lerinizi gözden geçirmek, istemci ve yetki risklerini bulmak veya yavaş bir hesaplama için doğru aracı seçmek için destek alın.

Ön Görüşme Talep Et
← Blog'a Dön

İletişim

Projeleriniz için iletişime geçin.