Emre Göçmen Blog

SAP ABAP Core Data Services (CDS) ile Başlangıç

5 dk. okuma
2508 görüntülenme
0 yorum

Emre Göçmen

Yazar

SAP ABAP Core Data Services (CDS) ile Başlangıç

ABAP Core Data Services (CDS) - Kapsamlı Rehber

İçindekiler

  1. CDS Nedir?
  2. ABAP CDS'nin Avantajları
  3. CDS Görünümleri Oluşturma
  4. CDS İlişkileri (Associations)
  5. CDS ile OData Servisi Oluşturma
  6. CDS Analitik Sorguları
  7. Performans Optimizasyonu
  8. Sonuç

1. CDS Nedir?

Core Data Services (CDS), SAP HANA'nın güçlü özelliklerinden yararlanmak için SAP tarafından geliştirilen, veri modelleme ve veri erişimi için kullanılan güçlü bir çerçevedir. CDS, geleneksel SQL VIEW'ları genişleterek daha zengin semantik modellemeler oluşturmanıza olanak tanır.

CDS, SAP S/4HANA mimarisinin temel yapı taşlarından biridir ve aşağıdaki alanlarda kullanılmaktadır:

  • Veri modelleme
  • Veri erişimi
  • İş mantığının veri modellerine entegrasyonu
  • Kullanıcı arayüzü (UI) bağlantıları
  • Analitik işlemler
  • Servis tabanlı veri tüketimi (OData)

ABAP CDS, bu kavramı ABAP geliştirme ortamında kullanmanıza olanak tanıyarak, SAP HANA'nın "Code-to-Data" prensibini destekler - yani veriyi işlemek için kodu veritabanına taşır, böylece ağ trafiğini azaltır ve performansı artırır.

2. ABAP CDS'nin Avantajları

  • Veritabanı Düzeyinde İşleme: Veri işleme işlemleri veritabanı katmanında gerçekleştirilir, bu da ABAP katmanındaki işlemlere kıyasla önemli performans artışları sağlar.
  • Yeniden Kullanılabilirlik: CDS görünümleri merkezi olarak tanımlanır ve birden çok uygulama, rapor ve arayüz tarafından yeniden kullanılabilir, bu da kod tekrarını azaltır.
  • Zengin Veri Modelleme: Hesaplanan alanlar, ilişkiler, parametreler ve daha fazlası gibi güçlü özellikleri destekler.
  • Kod Tutarlılığı: Veri erişim mantığı CDS görünümlerinde merkezileştirildiğinde, tüm uygulamalar aynı iş kurallarını takip eder.
  • Kapsamlı Açıklama (Annotation) Desteği: UI renderlaması, OData servisleri, arama desteği ve daha fazlası için semantik zenginleştirmeler ekleyebilirsiniz.
  • SAP Fiori Entegrasyonu: CDS görünümleri, SAP Fiori uygulamaları için veri kaynaklarını tanımlamak için kullanılabilir.
  • Analitik Yetenekler: Analitik sorgulama için özet ve drill-down yetenekleri içerir.
  • Yetkilendirme Kontrolü: Veri erişimi kontrolü doğrudan CDS düzeyinde tanımlanabilir.

3. CDS Görünümleri Oluşturma

3.1 Temel CDS Görünümü

ABAP Development Tools (ADT) kullanarak bir CDS görünümü oluşturmak için şu adımları izleyin:

Adım 1: Eclipse tabanlı ABAP Development Tools (ADT) veya SAP Business Application Studio'da projenizi açın.

Adım 2: Yeni bir CDS görünümü oluşturun:

  • Projeye sağ tıklayın > Yeni > ABAP Repository Nesnesi > Core Data Services > Veri Tanımı

Adım 3: CDS görünümünüzü adlandırın (örn. Z_CUSTOMER_BASIC) ve aşağıdaki gibi tanımlayın:

@AbapCatalog.sqlViewName: 'ZCUSTOMERBASIC'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Müşteri Temel Verileri'
define view Z_CUSTOMER_BASIC
  as select from kna1
{
    key kna1.kunnr as CustomerNumber,
    kna1.name1 as CustomerName,
    kna1.land1 as CountryCode,
    kna1.ort01 as City,
    kna1.pstlz as PostalCode,
    kna1.stras as Street,
    kna1.telf1 as Telephone,
    kna1.kunnr as SearchTerm
}
where kna1.loevm = ''  // Yalnızca silinen bayrak işaretli olmayanları seçin

Açıklama (Annotations):

  • @AbapCatalog.sqlViewName: Veritabanında oluşturulacak fiziksel SQL görünümünün adını belirtir. Maximum 16 karakter olmalıdır.
  • @AbapCatalog.compiler.compareFilter: SQL WHERE yan tümcelerinin daha iyi optimizasyonu için kullanılır.
  • @AccessControl.authorizationCheck: Yetkilendirme kontrolü düzeyini tanımlar. #CHECK değeri, standart SAP yetkilendirme kontrollerinin uygulanacağını belirtir.
  • @EndUserText.label: Görünüm için tanımlayıcı bir etiket sağlar.

3.2 Açıklamaları (Annotations) Kullanma

Açıklamalar (Annotations), CDS görünümlerini çeşitli tüketim senaryoları için zenginleştiren meta verilerdir. İşte daha gelişmiş açıklamalar içeren bir örnek:

@AbapCatalog.sqlViewName: 'ZCUSTUI'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Müşteri Verileri - UI Özelleştirmeli'
@UI: {
  headerInfo: {
    typeName: 'Müşteri',
    typeNamePlural: 'Müşteriler',
    title: { type: #STANDARD, value: 'CustomerName' }
  }
}
@Search.searchable: true
define view Z_CUSTOMER_UI
  as select from kna1
{
    @UI.facet: [
      { id: 'CustomerDetails',
        purpose: #STANDARD,
        type: #IDENTIFICATION_REFERENCE,
        label: 'Müşteri Detayları',
        position: 10 }
    ]
    
    @UI.hidden: true
    key kna1.kunnr as CustomerNumber,
    
    @UI: {
      lineItem: [{ position: 10, importance: #HIGH }],
      identification: [{ position: 10 }],
      selectionField: [{ position: 10 }]
    }
    @Search.defaultSearchElement: true
    kna1.name1 as CustomerName,
    
    @UI: {
      lineItem: [{ position: 20, importance: #MEDIUM }],
      identification: [{ position: 20 }],
      selectionField: [{ position: 20 }]
    }
    @Consumption.valueHelp: '_Country'
    kna1.land1 as CountryCode,
    
    @UI: {
      lineItem: [{ position: 30, importance: #MEDIUM }],
      identification: [{ position: 30 }]
    }
    kna1.ort01 as City,
    
    @UI: {
      identification: [{ position: 40 }]
    }
    kna1.pstlz as PostalCode,
    
    @UI: {
      identification: [{ position: 50 }]
    }
    kna1.stras as Street,
    
    @UI: {
      identification: [{ position: 60 }]
    }
    kna1.telf1 as Telephone
}
where kna1.loevm = ''

Önemli UI Açıklamaları:

  • @UI.headerInfo: Fiori elementlerinde kullanılan listedeki başlık bilgilerini tanımlar.
  • @UI.facet: UI bölümlerini ve düzenini tanımlar.
  • @UI.lineItem: Liste görünümünde hangi alanların gösterileceğini belirtir.
  • @UI.identification: Nesnenin ayrıntı sayfasında gösterilen alanları tanımlar.
  • @UI.selectionField: Arama kriterlerinde görünecek alanları tanımlar.
  • @Search.searchable ve @Search.defaultSearchElement: Arama işlevi için kullanılır.

3.3 Parametreler ve Hesaplanan Alanlar

CDS görünümleri, hesaplanan alanlar ve parametreler içerebilir, bu da dinamik sorgular oluşturmanıza olanak tanır:

@AbapCatalog.sqlViewName: 'ZSALESANALYSIS'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Satış Analizi'
define view Z_SALES_ANALYSIS
  with parameters
    P_DisplayCurrency : waers,
    P_StartDate       : sy-datum,
    P_EndDate         : sy-datum
  as select from vbak
    inner join vbap on vbak.vbeln = vbap.vbeln
    inner join mara on vbap.matnr = mara.matnr
{
    key vbak.vbeln as SalesDocument,
    key vbap.posnr as SalesDocumentItem,
    vbak.audat as DocumentDate,
    vbak.kunnr as CustomerNumber,
    mara.matnr as MaterialNumber,
    mara.mtart as MaterialType,
    vbap.kwmeng as OrderQuantity,
    vbap.meins as SalesUnit,
    
    // Hesaplanan alanlar
    case when vbap.kwmeng > 0 and vbap.netwr > 0
         then division(vbap.netwr, vbap.kwmeng, 2)
         else 0
    end as UnitPrice,
    
    vbap.netwr as NetAmount,
    
    // Para birimi dönüşümü (örnek - gerçek dönüşüm daha karmaşıktır)
    currency_conversion(
      amount             => vbap.netwr,
      source_currency    => vbak.waerk,
      target_currency    => :P_DisplayCurrency,
      exchange_rate_date => vbak.audat
    ) as ConvertedAmount,
    
    // HANA'nın SQL fonksiyonlarını kullanma
    days_between(vbak.audat, vbak.erdat) as DaysToProcessing
}
where vbak.audat between :P_StartDate and :P_EndDate
  and vbak.vbtyp = 'C'  // Sadece siparişleri seçin

Parametreler ve Hesaplanan Alanların Açıklaması:

  • with parameters: Dinamik filtreler ve hesaplamalar için giriş parametreleri tanımlar.
  • Hesaplanan alanlar: CASE ifadeleri, fonksiyonlar ve diğer SQL ifadelerini kullanabilirsiniz.
  • currency_conversion(): SAP'nin para birimi dönüştürme fonksiyonu.
  • days_between(): SAP HANA'nın tarihler arasındaki gün sayısını hesaplayan fonksiyonu.

4. CDS İlişkileri (Associations)

CDS ilişkileri, CDS görünümleri arasında bağlantılar kurmanıza ve veriyi önceden birleştirmenize olanak tanır:

@AbapCatalog.sqlViewName: 'ZCUSTORDERS'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Müşteri ve Siparişleri'
define view Z_CUSTOMER_ORDERS
  as select from Z_CUSTOMER_BASIC as Customer
  association [0..*] to vbak as _SalesOrders
    on Customer.CustomerNumber = _SalesOrders.kunnr
  association [0..1] to t005t as _CountryText
    on $projection.CountryCode = _CountryText.land1
    and _CountryText.spras = 'T' // Türkçe için dil kodu
{
    key Customer.CustomerNumber,
    Customer.CustomerName,
    Customer.CountryCode,
    _CountryText.landx as CountryName,
    Customer.City,
    Customer.PostalCode,
    
    // Siparişleri sayma (taşma semantiği)
    @Semantics.amount.currencyCode: 'OrdersCurrencyCode'
    _SalesOrders.netwr as TotalOrdersAmount,
    _SalesOrders.waerk as OrdersCurrencyCode,
    
    // İlişkileri açığa çıkarma
    _SalesOrders,
    _CountryText
}

Yukarıdaki Kodun Açıklaması:

  • association [0..*]: Müşteri ve siparişleri arasında bire-çok ilişki tanımlar.
  • association [0..1]: Ülke kodu ve ülke açıklaması arasında bire-bir ilişki tanımlar.
  • on $projection.CountryCode: Geçerli projeksiyondan alanlar kullanılarak birleştirme koşulları tanımlanır.
  • _SalesOrders: İlişkiye erişmek için kullanılan takma ad.

İlişkileri Kullanma:

İlişkileri tanımladıktan sonra, bu ilişkileri kullanan başka bir CDS görünümü oluşturabilirsiniz:

@AbapCatalog.sqlViewName: 'ZCUSTORDDETAIL'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Müşteri Sipariş Detayları'
define view Z_CUSTOMER_ORDER_DETAILS
  as select from Z_CUSTOMER_ORDERS as CustomerOrders
  association [1..*] to vbap as _OrderItems
    on CustomerOrders._SalesOrders.vbeln = _OrderItems.vbeln
{
    key CustomerOrders.CustomerNumber,
    CustomerOrders.CustomerName,
    key CustomerOrders._SalesOrders.vbeln as SalesDocument,
    key _OrderItems.posnr as SalesDocumentItem,
    _OrderItems.matnr as MaterialNumber,
    _OrderItems.arktx as ItemDescription,
    @Semantics.quantity.unitOfMeasure: 'OrderUnit'
    _OrderItems.kwmeng as OrderQuantity,
    _OrderItems.meins as OrderUnit,
    @Semantics.amount.currencyCode: 'DocumentCurrency'
    _OrderItems.netwr as NetAmount,
    _OrderItems.waerk as DocumentCurrency
}

İlişkilerle ilgili önemli noktalar:

  1. İlişkiler sadece tanımlanır, ancak otomatik olarak veri getirmezler
  2. İlişkili veriyi kullanmak istediğinizde, onu projeksiyona açıkça ekleyin veya açığa çıkarın
  3. İlişkiler CDS görünümlerinde JOIN işlemleri kullanmaktan daha esnek ve sezgiseldir
  4. LEFT OUTER JOIN semantiğiyle çalışırlar

5. CDS ile OData Servisi Oluşturma

CDS görünümlerini SAP Gateway tarafından kullanılabilecek OData servisleri olarak kolayca yayınlayabilirsiniz:

Adım 1: CDS Görünümüne OData İçin Açıklamalar Ekleme

@AbapCatalog.sqlViewName: 'ZCUSTODATA'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Müşteri OData Servisi'
@OData.publish: true
@ObjectModel.modelCategory: #BUSINESS_OBJECT
@ObjectModel.compositionRoot: true
@ObjectModel.transactionalProcessingEnabled: true
@ObjectModel.writeActivePersistence: 'kna1'
@ObjectModel.createEnabled: true
@ObjectModel.updateEnabled: true
@ObjectModel.deleteEnabled: true
define view Z_CUSTOMER_ODATA
  as select from kna1
{
    @ObjectModel.mandatory: true
    key kna1.kunnr as CustomerNumber,
    
    @ObjectModel.mandatory: true
    kna1.name1 as CustomerName,
    
    kna1.land1 as CountryCode,
    kna1.ort01 as City,
    kna1.pstlz as PostalCode,
    kna1.stras as Street,
    kna1.telf1 as Telephone
}
where kna1.loevm = ''

OData Açıklamalarının Açıklaması:

  • @OData.publish: Görünümü bir OData servisi olarak yayınlar.
  • @ObjectModel.modelCategory: İş nesnesi modeli olarak tanımlar.
  • @ObjectModel.transactionalProcessingEnabled: CRUD (Oluştur, Oku, Güncelle, Sil) işlemlerini etkinleştirir.
  • @ObjectModel.writeActivePersistence: Yazma işlemlerinin gerçekleştirileceği tablo.
  • @ObjectModel.xxxEnabled: CRUD işlemlerini ayrı ayrı etkinleştirir/devre dışı bırakır.

Adım 2: Servis Tanımı Oluşturma

S/4HANA'da, OData servisi tanımı ve SAP Gateway için yapılandırma oluşturmanız gerekir:

@EndUserText.label: 'Müşteri OData Servisi'
define service Z_CUSTOMER_SRV {
  expose Z_CUSTOMER_ODATA as Customer;
}

Adım 3: OData Servisini Aktifleştirme

  1. /IWFND/MAINT_SERVICE işlemini çalıştırın
  2. Ekle Servis seçeneğine tıklayın
  3. Sistem Takma Adını seçin
  4. Teknik Servis Adını Arayın (Z_CUSTOMER_SRV)
  5. Servisi aktifleştirin ve kaydedin

Adım 4: Servisi Test Etme

Servisinizi şu URL ile test edebilirsiniz:

https://<server>:<port>/sap/opu/odata/sap/Z_CUSTOMER_SRV/

OData servisi şunları destekleyebilir:

  • CRUD işlemleri
  • Filtreleme
  • Sıralama
  • Sayfalama
  • Yetkilendirme kontrolü

6. CDS Analitik Sorguları

CDS analitik sorguları, çok boyutlu raporlama için OLAP yeteneklerini destekler:

@AbapCatalog.sqlViewName: 'ZSALESANAL'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Satış Analizi'
@Analytics.dataCategory: #CUBE
define view Z_SALES_ANALYTICS
  as select from vbak
    inner join vbap on vbak.vbeln = vbap.vbeln
    inner join kna1 on vbak.kunnr = kna1.kunnr
{
    // Boyutlar
    @AnalyticsDetails.query.axis: #FREE
    key vbak.vkorg as SalesOrg,
    
    @AnalyticsDetails.query.axis: #FREE
    key vbak.vtweg as DistChannel,
    
    @AnalyticsDetails.query.axis: #FREE
    key kna1.land1 as CustomerCountry,
    
    @AnalyticsDetails.query.axis: #FREE
    key vbap.matnr as Material,
    
    // Tarih boyutu
    @AnalyticsDetails.query.axis: #FREE
    key vbak.audat as DocDate,
    
    // Ölçümler / Sayaçlar
    @DefaultAggregation: #SUM
    @Semantics.amount.currencyCode: 'Currency'
    vbap.netwr as NetAmount,
    
    @DefaultAggregation: #SUM
    @Semantics.quantity.unitOfMeasure: 'BaseUnit'
    vbap.kwmeng as Quantity,
    
    // Para birimi/birim
    @AnalyticsDetails.query.axis: #FREE
    vbap.waerk as Currency,
    
    @AnalyticsDetails.query.axis: #FREE
    vbap.meins as BaseUnit
}

Analitik Sorgular Hakkında Önemli Notlar:

  • @Analytics.dataCategory: Görünümün bir küp olduğunu tanımlar.
  • @DefaultAggregation: Otomatik toplama davranışını belirtir.
  • @AnalyticsDetails.query.axis: Boyut/ölçü olarak kullanılabilen alanları belirtir.
  • @Semantics: Para birimi ve ölçü birimi ilişkilerini tanımlar.

7. Performans Optimizasyonu

Verimli CDS görünümleri oluşturma için en iyi uygulamalar:

  1. Sadece Gerekli Alanları Seçin: Gerekli olanları seçin, "SELECT *" kullanmaktan kaçının.
  2. Uygun İndeksleri Kullanın: CDS görünümlerinizdeki WHERE yan tümcelerindeki alanların uygun şekilde indekslendiğinden emin olun.
  3. WHERE Yan Tümcelerini Optimize Edin: Filtreler mümkün olduğunca erken uygulayın ve indekslere/karşılaştırma filtreleri iyileştirmelerine izin verin.
  4. @AbapCatalog.compiler.compareFilter: true kullanın: SAP'nin filtre optimizasyonlarını etkinleştirir.
  5. Birleştirme (JOIN) Optimizasyonu:
    // Bu yerine:
    as select from A inner join B inner join C
    
    // Şunu tercih edin (daha iyi optimizasyon sağlar):
    as select from A 
      inner join B on ...
      inner join C on ...
  6. CDS İçinde İç İçe Görünümler Yapmak Yerine İlişkiler Kullanın: İlişkiler daha esnek ve genellikle daha iyi optimize edilir.
  7. WHERE Yan Tümcelerinde Fonksiyon Çağrılarından Kaçının: Fonksiyon çağrıları indeks kullanımını engeller.
  8. Büyük Hacimli Tablolar İçin Toplama İşlemlerinde Dikkatli Olun: Toplama performansı için analitik açıklamaları kullanın.
  9. Code Pushdown: Veriyi uygulama sunucusuna taşımak yerine kod mantığını veritabanına itin.
  10. CDS Sorgu Performansını İzleyin: SQL izleme ve açıklama planlarını kullanarak performansı analiz edin.

8. Sonuç

ABAP CDS, veri modelleme ve erişimi için güçlü, semantik açıdan zengin bir çerçeve sunarak SAP HANA'nın tüm potansiyelini ortaya çıkarır. Doğru şekilde kullanıldığında, aşağıdaki avantajları sağlar:

  • Daha yüksek performans - Code-to-Data paradigması sayesinde
  • Daha basit bakım - SAP S/4HANA mimarisi içinde veri modelleri için merkezi tanım
  • Daha verimli geliştirme - Veri modellerinin yeniden kullanılabilirliği ve genişletilebilirliği
  • Modern UI entegrasyonu - SAP Fiori ve UI açıklamaları aracılığıyla
  • Sağlam analitik yetenekler - Yerleşik analitik fonksiyonlarla

CDS görünümleri oluştururken, öğrenilmiş en iyi uygulamaları takip etmek, modüler ve performanslı CDS görünümlerine sahip olmanıza yardımcı olacaktır. SAP S/4HANA modellerini anlamak için standart CDS görünümlerini inceleyin ve uygulamalarınızda bunları genişletin.

Yorumlar

0

Yorum yapmak için giriş yapmalısınız.

Henüz yorum bulunmamaktadır.

İlk yorumu yapan siz olun.

Emre Göçmen

Yazar & Geliştirici

SAP ABAP & Full Stack geliştirici olarak deneyimlerim, becerilerim ve kariyer yolculuğum hakkında blog yazılarım.

Kategori

SAP

SAP

Yazılardan Haberdar Olun

Yeni yazılardan ilk siz haberdar olmak için e-posta bültenime abone olun.