Tuesday, 30 September 2025

ABAP CDS View Part 8 : CDS untuk OData & Fiori

CDS untuk OData & Fiori | Ekspos Consumption View ke OData SAP

CDS untuk OData & Fiori — Ekspos Consumption View sebagai OData Service

Di episode ini kita akan membahas bagaimana membuat CDS Consumption View agar bisa diakses sebagai OData service dan digunakan oleh Fiori/UI5 (mis. Fiori Elements). Fokus praktis: anotasi penting, langkah aktivasi service di Gateway, dan cara menguji endpoint OData.

Ringkasan alur kerja

  • Buat Consumption View (CDS) yang berisi field & annotation untuk UI/OData.
  • Tambahkan anotasi publikasi OData (mis. @OData.publish: true) atau buat Service Definition + Service Binding.
  • Aktifkan / daftarkan service di transaction /IWFND/MAINT_SERVICE (SAP Gateway).
  • Uji endpoint OData via browser/Postman dan integrasikan ke Fiori/UI5 atau Fiori Elements.

1. Anotasi penting untuk OData & Fiori

Beberapa anotasi yang sering digunakan:

AnotasiFungsi singkat
@OData.publish: trueMenghasilkan (auto-generate) service OData untuk consumption view (cepat untuk dev/testing).
@UI.headerInfoInfo header untuk Fiori Elements
@UI.lineItemMenentukan kolom yang muncul di list (Fiori Elements)
@UI.selectionFieldField yang muncul di filter bar
@AccessControl.authorizationCheckBagian security — jika #CHECK, harus ada DCL

Tip: @OData.publish: true berguna untuk percepatan pengembangan, tapi di landscape production biasanya tim Basis/NetWeaver mendaftarkan service secara manual dengan Service Definition / Service Binding untuk kontrol lebih ketat.

2. Contoh CDS Consumption View dengan @OData.publish

@AbapCatalog.sqlViewName: 'ZV_CDS_MAT_CONS'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'Consumption view: Material for OData'
@OData.publish: true
@VDM.viewType: #CONSUMPTION

define view ZCDS_MATERIAL_CONS
  as select from mara as M
    inner join makt as T on M.matnr = T.matnr
{
  key M.matnr         as Material,
      T.maktx         as Description,
      M.mtart         as MaterialType,
      M.matkl         as MaterialGroup
}

Jika view di-activate dengan annotation @OData.publish: true, sistem biasanya mempersiapkan artefak service yang bisa didaftarkan/diaktifkan pada Gateway.

3. Cara mendaftarkan dan mengaktifkan OData Service (ringkasan langkah)

  1. Aktifkan CDS di ADT (Ctrl+F3).
  2. Buka transaction /IWFND/MAINT_SERVICE pada sistem Gateway (Fiori server atau system yang jadi front-end).
  3. Klik Add Service (Register Service) → pilih backend system alias / technical system → cari service yang generated (nama service biasanya bereferensi ke nama view atau prefix seperti Z*).
  4. Pilih service → klik Add Selected Services → tunggu hingga status “Active”.
  5. Jika service membutuhkan authentication atau ICF node, pastikan admin Basis sudah konfigurasi dan ICF service aktif.

Catatan penting: Nama service yang muncul di Gateway dapat berbeda-beda (tergantung konfigurasi). Jika @OData.publish tidak dipakai, Anda perlu membuat Service Definition (SEGW) atau Service Binding (RAP) secara manual.

4. Testing endpoint OData

Contoh pola URL OData (umum):

https://:/sap/opu/odata/sap//
-- Contoh resource:
https://my.sap.system:443/sap/opu/odata/sap/ZCDS_MATERIAL_CONS/MaterialSet?$top=10
  • Buka URL di browser (untuk GET collection) atau gunakan Postman untuk pengujian lebih lanjut (headers, auth).
  • Gunakan parameter query standar OData ($filter, $select, $top, $skip, $orderby).
  • Jika menggunakan Fiori Elements, service metadata harus lengkap (/sap/opu/odata/sap//$metadata).

5. Menghubungkan ke Fiori/UI5 (singkat)

  • Jika ingin Fiori Elements: buat aplikasi Fiori Elements List Report yang menunjuk ke OData service (service alias di manifest.json).
  • Gunakan annotation UI (di CDS) untuk menyesuaikan layout List, Table, Selection fields, headerInfo.
  • Untuk app custom UI5: panggil endpoint OData dari model (OData V2/V4) dan bind ke control table/list.

6. Praktik terbaik & peringatan

  • Gunakan @OData.publish untuk dev/test, tapi pertimbangkan proses registrasi service formal di landscape production.
  • Pastikan security/DCL sudah benar jika data sensitif (annotation @AccessControl dan file DCL terkait).
  • Jangan expose terlalu banyak field atau field sensitif tanpa filtering/authorization.
  • Perhatikan performa: gunakan filter pushdown, batasi result set dengan $top atau implementasi paging.
  • Selalu cek $metadata — Fiori Elements sangat bergantung pada metadata yang lengkap dan konsisten.
Ringkasan:
Mengekspos CDS Consumption View ke OData memungkinkan integrasi cepat ke Fiori/UI5. Untuk percepatan gunakan @OData.publish: true, namun di production sebaiknya service didaftarkan dan dikontrol oleh tim Basis (registrasi di /IWFND/MAINT_SERVICE, ICF, dan security). Gunakan annotation UI untuk Fiori Elements agar tampilan lebih rapi tanpa coding UI tambahan.

➡️ Next (Episode 9): CDS Analytical — membahas konsep fact & dimension, annotation analytics, dan penggunaan CDS untuk reporting/embedded analytics.

ABAP CDS View Part 7 : Extend View & Reuse

Extend & Reuse CDS View — Extend View Entity di ABAP CDS | SAP Tutorial

Extend View & Reuse — Memperluas CDS tanpa Mengubah Base View

When projects grow, requirement berubah, atau kamu butuh custom field untuk customer/partner, kita tidak selalu ingin mengubah CDS standar yang sudah ada. CDS View extension memungkinkan developer menambah field atau association ke view yang sudah ada — tanpa memodifikasi object asli. Ini mirip konsep append structure di ABAP Dictionary, tapi untuk CDS. :contentReference[oaicite:1]{index=1}

1) Dua pendekatan utama

  • Extend View Entity (new syntax) — direkomendasikan untuk view entity modern (define view entity). Ada statement baru EXTEND VIEW ENTITY untuk extensibility. :contentReference[oaicite:2]{index=2}
  • Extend / Append style (older templates) — untuk `define view` yang lebih lama, ADT menyediakan template Extend View yang menghasilkan object extension yang menambahkan kolom/association. Banyak tutorial praktis menjelaskan alurnya. :contentReference[oaicite:3]{index=3}

2) Contoh konsep (pattern) — extend via separate data definition

Prinsipnya: kamu buat object CDS baru (extension) yang menunjuk ke CDS base, lalu tambahkan elemen yang diperlukan. Extension ini disimpan di object terpisah dan dapat dideploy/transport secara independen.

2.a — Contoh pola umum (pseudocode / template)

-- Template style (ADT: "Extend View")
@AbapCatalog.sqlViewAppendName: 'ZV_BASE_EXT'    "SQL append name (16 chars)
@EndUserText.label: 'Extension: add extra fields'
extend view ZCDS_BASE with ZCDS_BASE_EXT
{
  -- refer to original data source alias of base view, e.g. "BaseSource.field"
  BaseSource.extra_field,
  AnotherSource.more_field
}

Note: Actual template generated by ADT may use keywords like EXTEND VIEW or EXTEND VIEW ENTITY depending on whether base view is legacy DEFINE VIEW or modern DEFINE VIEW ENTITY. Selalu gunakan template ADT agar format dan atribut transport/activation benar. :contentReference[oaicite:4]{index=4}

2.b — Contoh praktis: menambah field teks ke consumption view

-- Base consumption view (example)
define view ZCDS_MATERIAL_BASE
  as select from mara as M
{
  key M.matnr,
      M.mtart,
      M.matkl
}

-- Extension (contoh)
@AbapCatalog.sqlViewAppendName: 'ZV_MAT_EXT'
@EndUserText.label: 'Extension: add material description'
extend view ZCDS_MATERIAL_BASE with ZCDS_MATERIAL_BASE_EXT
{
  M.maktx   -- refer to data source field (MAKT) via path / alias if allowed
}

Di praktik nyata, kadang kamu perlu menggunakan path expression ke association extension (mis. _Extension) atau extend the E-view dulu sebelum extend R-view (pattern SAP standar). Ini berguna terutama pada standar SAP yang membatasi sumber data ekstensi. :contentReference[oaicite:5]{index=5}

3) Extensibility Control & Annotations penting

Owner dari base view bisa mengontrol apakah view boleh di-extend, dan dari mana extension boleh mengambil data, lewat annotation seperti:

AnnotationFungsi singkat
@AbapCatalog.viewEnhancementCategoryMenentukan bagian view yang boleh di-extend (mis. PROJECTION_LIST, AGGREGATE)
@AbapCatalog.extensibilityKontrol lebih detil atas extensibility (allowNewDatasources, dataSources, elementSuffix, dsb.)
@AccessControlMasih berlaku — extension tetap mengikuti security & DCL jika ada

Dengan pengaturan ini, pemilik object mengatur batasan yang aman untuk ekstensi (mis. tidak membiarkan membaca sembarang tabel baru tanpa izin). :contentReference[oaicite:6]{index=6}

4) Best Practice untuk Reuse & Extension

  • Jangan ubah base view langsung — buat extension object terpisah agar upgrade-safe.
  • Gunakan E-views (extension includes) — SAP sering menyediakan E_* views sebagai target extension; tambah field ke E-view lalu expose ke R-view. Ini pattern aman untuk standard SAP. :contentReference[oaicite:7]{index=7}
  • Limit sumber data — jika owner men-set allowNewDatasources=false, extension hanya boleh membaca dari dataSources yang diizinkan.
  • Dokumentasikan extension — jelaskan kenapa field ditambah, mapping tabel asal, dan impact ke OData/UI.
  • Test data preview & OData exposure setelah aktivasi—pastikan tidak merusak binding ke Fiori Elements atau service metadata.

5) Kapan pakai extension vs membuat view baru?

  • Pakai extension jika: butuh menambah field ke view existing yang banyak dipakai, dan kamu ingin preserve konsistensi nama service/object.
  • Buat view baru jika: requirement berbeda total (struktur output berubah), atau kamu butuh behavior/aggregation berbeda.
Summary:
CDS View extension adalah cara upgrade-safe untuk menambah field atau association tanpa memodifikasi base view. Gunakan template ADT (Extend View / Extend View Entity), perhatikan annotation extensibility yang di-set oleh owner, dan ikuti best practice SAP (pakai E-view pattern bila tersedia). Untuk referensi resmi dan panduan langkah demi langkah, cek dokumentasi SAP dan tutorial ADT. :contentReference[oaicite:8]{index=8}

➡️ Next (Episode 8): CDS untuk OData & Fiori — expose consumption view ke OData, service binding, dan testing via Gateway.

ABAP CDS View Part 6 : CDS View dengan Parameter & Filter

CDS View dengan Parameter & Filter di ABAP | Tutorial SAP S/4HANA

CDS View dengan Parameter & Filter

Di Episode 5 kita belajar JOIN. Sekarang kita fokus pada parameterized CDS View: cara menambahkan input parameters untuk kontrol filter seperti bahasa (sy-langu), rentang tanggal, atau filter optional (opsional). Contoh-contoh di bawah bisa langsung dicoba di ADT Eclipse.

1) Pattern: Parameter Bahasa (sy-langu)

Sering dipakai saat join ke MAKT (material text) agar deskripsi mengikuti bahasa user secara otomatis. Gunakan @Environment.systemField: #SYSTEM_LANGUAGE untuk binding ke sy-langu.

@AbapCatalog.sqlViewName: 'ZV_MAKT_LANG'
@EndUserText.label     : 'Material Text by Language (Param)'

define view with parameters
  p_langu : abap.lang  -- CHAR(1)
    @Environment.systemField: #SYSTEM_LANGUAGE
ZCDS_MAKT_LANG
  as select from makt
{
  key matnr,
      spras,
      maktx
}
where spras = $parameters.p_langu
Tip: Dengan annotation @Environment.systemField: #SYSTEM_LANGUAGE, banyak consumer (mis. Fiori Elements) akan otomatis mengisi parameter sesuai bahasa user, tanpa kamu isi manual.

2) Pattern: Date Range (FROM–TO)

Memfilter data berdasarkan tanggal pembuatan (ERSDA) pada MARA.

@AbapCatalog.sqlViewName: 'ZV_MARA_DATER'
@EndUserText.label     : 'Material by Created Date Range'

define view with parameters
  p_date_from : abap.dats,
  p_date_to   : abap.dats
ZCDS_MARA_DATE_RANGE
  as select from mara
{
  key matnr,
      ersda,
      mtart,
      matkl
}
where ersda between $parameters.p_date_from and $parameters.p_date_to

3) Pattern: Optional Filter (Param Boleh Kosong)

CDS parameter wajib ada, tapi kamu bisa membuatnya “opsional” secara logika—misal, jika parameter kosong maka semua data diambil. Untuk tipe CHAR gunakan perbandingan dengan literal kosong ''.

@AbapCatalog.sqlViewName: 'ZV_MARA_OPT'
@EndUserText.label     : 'Optional Filter by MATNR'

define view with parameters
  p_matnr : abap.char(18)
ZCDS_MARA_OPT
  as select from mara
{
  key matnr,
      mtart,
      matkl
}
where ( $parameters.p_matnr = '' or matnr = $parameters.p_matnr )
Catatan: Untuk tipe tanggal/num, pakai nilai sentinel (mis. '00000000') atau range luas sebagai “mode all”.

4) Konsumsi di ABAP Open SQL

Cara memanggil CDS ber-parameter di ABAP (perhatikan sintaks kurung dan @ escape host variable).

DATA(lv_from) = '20240101'.
DATA(lv_to)   = '20241231'.

" Contoh 1: Date range
SELECT * FROM ZCDS_MARA_DATE_RANGE( p_date_from = @lv_from, p_date_to = @lv_to )
  INTO TABLE @DATA(lt_mara).

" Contoh 2: Language-bound (pakai sy-langu otomatis)
SELECT * FROM ZCDS_MAKT_LANG( p_langu = @sy-langu )
  INTO TABLE @DATA(lt_makt).

" Contoh 3: Optional filter
DATA(lv_matnr) = ''. " kosong = ambil semua
SELECT * FROM ZCDS_MARA_OPT( p_matnr = @lv_matnr )
  INTO TABLE @DATA(lt_opt)
  UP TO 100 ROWS. " limit di ABAP, bukan di CDS

5) Aktivasi & Data Preview di ADT

  • Activate (Ctrl + F3) data definition-nya
  • Klik kanan → Open Data Preview
  • Dialog akan minta nilai parameter → isi sesuai kebutuhan

6) Best Practices & Batasan

  • Gunakan tipe ABAP (mis. abap.lang, abap.dats) agar interoperabilitas lebih mudah
  • Hindari logika kompleks di WHERE—pindahkan ke Table Function bila perlu
  • Parameter bukan field—tidak muncul di output
  • Batasi jumlah parameter agar konsumsi OData/UI tetap simpel
Summary:
Parameter membuat CDS lebih fleksibel: bisa lock ke bahasa user, batasi data dengan date range, atau sediakan filter opsional. Konsumsi di ABAP sangat straightforward dengan sintaks VIEW_NAME( param = @var ).

➡️ Next (Episode 7): Extend View & Reuse — memperluas CDS tanpa modifikasi objek asli, strategi enhancement yang aman untuk upgrade.

ABAP CDS View Part 5 : CDS View dengan Join (Multi Table)

CDS View dengan Join di SAP ABAP | Tutorial SAP S/4HANA

CDS View dengan Join (Multi Table)

Kalau di Episode 4 kita main di single table CDS, sekarang kita naik level. Episode 5 fokus pada JOIN – fitur penting untuk gabung data dari beberapa tabel sekaligus, mirip SELECT JOIN di SQL, tapi lebih elegan dan reusable.

1. Tipe Join dalam CDS

  • Inner Join – hanya data yang cocok di kedua tabel
  • Left Outer Join – semua dari tabel utama + matching dari tabel kedua
  • Right Join jarang dipakai (direkomendasikan hindari)

2. Contoh Join: MARA + MAKT

Contoh umum: Material Master (MARA) dengan Deskripsi Material (MAKT).

@AbapCatalog.sqlViewName: 'ZV_JOIN_MARA'
@EndUserText.label     : 'CDS Join MARA dan MAKT'

define view ZCDS_JOIN_MARA
  as select from mara as A
    inner join makt as B
      on A.matnr = B.matnr
{
  key A.matnr,
      A.mtart,
      A.matkl,
      B.maktx,
      B.spras
}

Alias A dan B membantu membaca struktur dengan lebih jelas.

3. Contoh Left Outer Join

Kalau mau semua material muncul walaupun tidak ada translation:

define view ZCDS_JOIN_LEFT
  as select from mara as A
    left outer join makt as B
      on A.matnr = B.matnr
{
  key A.matnr,
      B.maktx,
      B.spras
}

4. Data Preview & Aktivasi

  • Tekan Ctrl + F3 untuk aktivasi
  • Klik kanan → Open Data Preview
  • Cek hasil join langsung dari Eclipse

5. Contoh Join di Modul SD (Header + Item)

@AbapCatalog.sqlViewName: 'ZV_VBAK_VBAP'
@EndUserText.label     : 'CDS Join VBAP dan VBAK'

define view ZCDS_JOIN_SALES
  as select from vbak as H
    inner join vbap as I
      on H.vbeln = I.vbeln
{
  key H.vbeln,
      H.auart,
      I.posnr,
      I.matnr,
      I.netwr
}

Struktur header–item ini sering dipakai untuk laporan atau OData.

6. Tips & Best Practice

  • Gunakan alias A, B, H, I biar kode clean
  • Hindari wildcard (*)
  • Selalu pakai key field untuk identifikasi
  • Join secukupnya (hindari join 7–8 tabel sekaligus)
Summary:
Join adalah fitur penting dalam CDS untuk gabung data dari beberapa tabel. Gunakan inner atau left join sesuai kebutuhan. Dengan struktur rapi dan alias, CDS View kamu siap dipakai untuk OData, analitik, atau laporan Fiori.

➡️ Next (Episode 6): CDS View dengan Filter & Parameter (misal p_langu, date filter, top N data).

ABAP CDS View Part 4 : Membuat CDS View Basic (Single Table)

Cara Membuat Basic CDS View di ABAP | Panduan SAP S/4HANA

Membuat CDS View Basic (Single Table)

Kalau di Episode 1–3 kita bahas konsep, struktur, dan annotation, sekarang kita langsung masuk ke praktik teknik real. Fokus Episode 4 adalah membuat CDS View basic dari satu tabel saja, misalnya MARA. Cocok untuk pemula dan jadi pondasi sebelum masuk ke join.

1. Lokasi & Naming Pattern

  • Buat di ADT (Eclipse)
  • Folder: core data services → data definitions
  • Prefix object misal ZCDS_*
  • SQL View Name max 16 karakter, huruf kapital

2. Contoh CDS View Basic

@AbapCatalog.sqlViewName: 'ZVBASIC_MARA'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'CDS View Basic dari Tabel MARA'

define view ZCDS_BASIC_MARA
  as select from mara
{
  key matnr,
      ersda,
      mtart,
      matkl,
      meins
}

Struktur ini adalah pondasi minimal:

  • Annotation untuk nama DB & label
  • define view + nama object
  • select from (tabel utama)
  • daftar field

3. Aktivasi View

Setelah selesai coding:

  • Tekan Ctrl + F3 atau klik Activate
  • View .hdbdip dibuat otomatis di DB
  • Pastikan tidak ada error syntax

4. Data Preview

Untuk cek data:

  • Klik kanan nama view → Open Data Preview
  • Bisa filter langsung dari Eclipse
  • Tampilkan hasil table view

5. Query via ABAP (Optional)

SELECT * FROM ZCDS_BASIC_MARA
  INTO TABLE @DATA(lt_data).

IF lt_data IS NOT INITIAL.
  WRITE / |Total: { lines( lt_data ) }|.
ENDIF.

6. Contoh Lain (But000)

Kalau mau ambil data business partner:

@AbapCatalog.sqlViewName: 'ZVBASIC_BP'
@EndUserText.label     : 'CDS Basic from BUT000'

define view ZCDS_BASIC_BP
  as select from but000
{
  key partner,
      type,
      name_first,
      name_last
}
Summary:
CDS Basic View adalah langkah pertama yang wajib dikuasai. Dengan struktur sederhana (single table), kamu bisa latihan aktivasi, preview data, dan mulai membangun fondasi untuk episode lanjutan seperti join, annotation lanjutan, dan exposure ke OData.

➡️ Next (Episode 5): CDS View dengan Join Antar Tabel (misal MARA + MAKT atau VBAK + VBAP).

ABAP CDS View Part 3 : Annotation dalam CDS View

Annotation Lengkap dalam ABAP CDS View | Panduan SAP S/4HANA

Annotation dalam CDS View

Di Episode 2 kita sudah lihat struktur dasar CDS View. Nah, di Episode 3 ini kita fokus pada annotation — elemen krusial yang bikin CDS powerful. Annotation digunakan untuk memberi metadata tambahan, mengontrol behavior, ekspos data, UI, security, sampai analytic integration.

1. Kategori Annotation Utama

Kategori Fungsi Contoh
Catalog Pengaturan DB View dan compiler @AbapCatalog.sqlViewName
Text/Documentation Label, deskripsi object @EndUserText.label
OData/Exposure Publish sebagai OData Service @OData.publish
Authorization Check akses user @AccessControl.authorizationCheck
UI Annotation Integrasi Fiori/UI5 @UI.lineItem
Analytics OLAP, cube, dimension @Analytics.query

2. Contoh Annotation Dasar

@AbapCatalog.sqlViewName: 'ZV_MARA_ANN'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'CDS with Annotation Example'
@AccessControl.authorizationCheck: #CHECK
@OData.publish: true

define view ZCDS_MARA_ANN
  as select from mara
{
  key matnr,
      ersda,
      mtart,
      matkl
}
  • @OData.publish: true → otomatis generate service
  • @AccessControl.authorizationCheck: #CHECK → integrasi ke DCL
  • @AbapCatalog.sqlViewName → nama di database

3. Contoh UI Annotation

@UI.lineItem: [
  {
    position: 10,
    label: 'Material',
    value: matnr
  },
  {
    position: 20,
    label: 'Material Type',
    value: mtart
  }
]
define view ZCDS_UI_DEMO
  as select from mara
{
  key matnr,
      mtart,
      matkl
}

Annotation ini sering dipakai kalau CDS akan dihubungkan ke Fiori Elements tanpa perlu coding tambahan.

4. Authorization Annotation

@AccessControl.authorizationCheck: #NOT_REQUIRED
-- atau
@AccessControl.authorizationCheck: #CHECK

Kalau pakai #CHECK, maka harus ada DCL (Data Control Language) yang mengatur role-based access.

5. Contoh Analytic Annotation (Singkat)

@Analytics.query: true
@VDM.viewType: #CONSUMPTION

Biasanya dipakai untuk reporting (misalnya embedded analytics).

Summary:
Annotation adalah “superpower”-nya CDS View. Dengan anotasi, satu object bisa sekaligus jadi source OData, UI Fiori, analytic cube, atau dilindungi security.

➡️ Next Episode (4): Praktik Membuat CDS Basic View
(dari tabel MARA, join sederhana, dan aktivasi).

Monday, 29 September 2025

ABAP CDS View Part 2 : Struktur & Sintaks Dasar ABAP CDS View

Struktur & Sintaks Dasar ABAP CDS View | Tutorial SAP S/4HANA

Struktur & Sintaks Dasar ABAP CDS View

Setelah memahami konsep CDS di Episode 1, sekarang kita lanjut ke bagian teknis: bagaimana struktur dasar CDS View, elemen pentingnya, dan contoh sederhana yang bisa langsung dicoba di ADT Eclipse.

1. Komponen Utama dalam CDS View

  • Define View — deklarasi utama
  • SQL Source — tabel / source data
  • Annotation — metadata tambahan
  • Field List — kolom yang diekspose

2. Contoh Struktur Dasar

@AbapCatalog.sqlViewName: 'ZV_MARA_DEMO'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'Contoh CDS View Sederhana'

define view ZCDS_MARA_DEMO
  as select from mara
{
  matnr,
  ersda,
  mtart,
  matkl
}

Penjelasan singkat:

  • @AbapCatalog.sqlViewName → nama view di level DB
  • @EndUserText.label → nama yang tampil di UI
  • define view → deklarasi object
  • select from → ambil data dari tabel
  • Field list → kolom yang diekspos

3. Annotation Dasar yang Wajib Diketahui

  • @AbapCatalog.sqlViewName — identifier level DB
  • @EndUserText.label — deskripsi object
  • @AccessControl.authorizationCheck — security
  • @OData.publish — expose ke OData

4. Aktivasi & Testing

Setelah kode dibuat di ADT Eclipse:

  • Tekan Ctrl + F3 atau klik Activate
  • Gunakan Data Preview untuk cek data
  • Bisa juga query via SELECT * FROM di ABAP

Contoh Preview Query di ABAP

SELECT * FROM ZCDS_MARA_DEMO
  INTO TABLE @DATA(lt_mara).
Summary:
Struktur CDS sangat sederhana: annotation, define view, select from, dan daftar field. Dengan format ini, kita bisa mulai membangun view yang reusable dan performa tinggi.

➡️ Up Next (Episode 3): Annotation lengkap CDS View (kategori teknis, UI, OData, authorization, dan contoh penerapannya).

ABAP CDS View Part 1: Introduction to ABAP CDS View (Pengenalan)

Pengenalan ABAP CDS View | SAP S/4HANA

Introduction to ABAP CDS View (Pengenalan)

Core Data Services (CDS) adalah teknologi modern di SAP yang memungkinkan kita mendefinisikan data secara semantik di database layer. In SAP S/4HANA, CDS becomes a fundamental concept karena mendukung performance tinggi, analytical capabilities, dan integrasi langsung ke OData/Fiori.

What is a CDS View?

CDS View adalah “next generation view” yang ditulis dengan sintaks deklaratif berbasis SQL, tapi diperkaya dengan annotation yang memberikan fungsi tambahan seperti UI exposure, authorization, layanan OData, sampai analitik.

Why SAP Introduced CDS?

  • Higher performance dengan HANA pushdown
  • Mendukung arsitektur service-based dan reuse
  • OData exposure langsung tanpa coding tambahan
  • Mengurangi beban di layer ABAP klasik

CDS vs SE11 Classical View

Aspect SE11 View CDS View
Creation Method GUI (SE11) Source Code via ADT Eclipse
Annotation Support No Yes (UI, OData, Auth, etc.)
Performance Standard Optimized for HANA
OData Exposure Manual & Limited Native via annotation

Main Benefits (Keunggulan)

  • Query lebih cepat untuk data besar
  • Reusable objects antar modul
  • Mudah dihubungkan dengan OData, Fiori, RAP
  • Dapat digunakan untuk reporting dan BI

Types of CDS View

  • Basic View – single source/table
  • Composite View – combine beberapa basic view
  • Consumption View – presentasi, UI, OData
  • Analytical View – laporan OLAP/BI

Use Case Examples

  • Laporan penjualan antar tabel SD
  • Expose material ke aplikasi Fiori
  • Mengurangi SELECT kompleks di ABAP
  • Source data dashboard atau analitik
Summary:
CDS View bukan sekadar pengganti view lama, tetapi fondasi utama pengembangan modern di SAP S/4HANA. Memahami dasar CDS akan sangat membantu sebelum masuk ke syntax, annotation, dan integrasi teknis.

➡️ Up Next (Episode 2): Basic Structure & Syntax CDS (struktur file, annotation dasar, dan contoh yang bisa langsung dicoba).

Tuesday, 23 September 2025

Belajar ABAP Summary Part 1–16

Belajar ABAP Summary Part 1–16 | Expandable Sitemap

Belajar ABAP Part 16: Security Best Practices & Authorization in ABAP/CDS

Belajar ABAP Part 16: Security Best Practices & Authorization in ABAP/CDS

Belajar ABAP Part 16: Security Best Practices & Authorization in ABAP/CDS

Security adalah aspek kritikal dalam pengembangan ABAP. Tanpa kontrol otorisasi yang baik, data sensitif bisa terekspos ke user yang tidak berhak. Di part ini kita akan membahas bagaimana Authorization bekerja di ABAP dan CDS, serta best practices untuk menulis kode yang aman.

1. Authorization Object

Authorization Object adalah komponen di SAP yang mendefinisikan izin akses berdasarkan field-field tertentu (misalnya Company Code, Activity). Authorization Object digunakan dalam role (via PFCG).

Contoh Authorization Object standar: M_BEST_BSA (untuk Purchase Requisition by Document Type).

2. Authority-Check di ABAP

Dalam ABAP, validasi otorisasi dilakukan dengan statement AUTHORITY-CHECK. Contoh sederhana:

AUTHORITY-CHECK OBJECT 'Z_SALES_AUTH'
  ID 'VKORG' FIELD lv_vkorg
  ID 'ACTVT' FIELD '03'.  "Display

IF sy-subrc <> 0.
  MESSAGE 'You are not authorized to view this Sales Org' TYPE 'E'.
ENDIF.
Gunakan sy-subrc untuk mengecek hasil: 0 = authorized, selain itu tidak berhak.

3. DCL (Data Control Language) di CDS

Di dunia CDS View, security dikelola dengan DCL (Data Control Language). DCL mengikat Authorization Object dengan CDS sehingga filter terjadi otomatis di query.

Contoh DCL untuk CDS View Sales Data:

@EndUserText.label: 'Authorization for Sales Data'
define role ZR_SALES_AUTH {
  grant select on ZC_SalesData
    where VKORG = aspect pfcg_auth(VKORG, 'Z_SALES_AUTH');
}

Dengan DCL ini, user hanya bisa melihat Sales Org sesuai otorisasi di role.

4. Best Practices Security di ABAP/CDS

  • Selalu gunakan AUTHORITY-CHECK untuk transaksi Z-report.
  • Implementasikan DCL di CDS agar query otomatis secure.
  • Hindari hardcode user dalam program.
  • Lakukan input validation (cek value kosong, tipe data, dsb).
  • Cegah SQL injection dengan parameterized query (gunakan Open SQL, jangan string concatenation).

5. Real Case: Proteksi Report Z Sales

Misal ada report Z_SALES_REPORT yang menampilkan data sales berdasarkan Sales Organization. Kita ingin supaya hanya user dengan otorisasi tertentu bisa akses.

Contoh Implementasi

REPORT z_sales_report.

PARAMETERS: p_vkorg TYPE vkorg.

" Authorization check
AUTHORITY-CHECK OBJECT 'Z_SALES_AUTH'
  ID 'VKORG' FIELD p_vkorg
  ID 'ACTVT' FIELD '03'.

IF sy-subrc <> 0.
  MESSAGE 'Not authorized for this Sales Org' TYPE 'E'.
ENDIF.

" Jika authorized, fetch data
SELECT vbeln, vkorg, netwr
  FROM vbak
  INTO TABLE @DATA(lt_sales)
  WHERE vkorg = @p_vkorg.

cl_demo_output=>display( lt_sales ).

Pada contoh di atas:

  • User input Sales Org (p_vkorg).
  • Program cek otorisasi via AUTHORITY-CHECK.
  • Jika tidak berhak → error message.
  • Jika berhak → data ditampilkan.

6. Summary

Key Takeaways Part 16:
  • Authorization Object adalah dasar kontrol akses di SAP.
  • AUTHORITY-CHECK wajib dipakai di ABAP report untuk validasi akses.
  • DCL di CDS mengikat security langsung ke level database query.
  • Selalu ikuti best practices security seperti input validation, SQL injection prevention, dan role-based access.
  • Real case: proteksi Z_SALES_REPORT dengan AUTHORITY-CHECK agar hanya user berotorisasi yang bisa lihat data.

Belajar ABAP Part 15: Performance Tuning — Teknik, Tools & Contoh Kasus

Belajar ABAP Part 15: Performance Tuning — Teknik, Tools & Contoh Kasus Z_SALES

Belajar ABAP Part 15: Performance Tuning — Teknik, Tools & Contoh Kasus Z_SALES

Ringkasan: Ini panduan praktis untuk optimasi performa program ABAP. Fokus: ukur dulu (profiling), kemudian optimasi DB access, loop, dan memory; gunakan CDS/AMDP untuk pushdown; pakai tools seperti ST05, SAT, ST12, PlanViz. Termasuk contoh real case mempercepat report Z_SALES (before/after) beserta checklist tuning.

1. Prinsip Utama

  • Measure first: gunakan trace/profiler — jangan tebak-tebak.
  • Push logic ke DB: gunakan CDS/AMDP bila operasi data besar & agregasi.
  • Avoid row-by-row: hindari SELECT di dalam loop (N+1 problem).
  • Reduce network round-trips: ambil data bulk (INTO TABLE) dan proses di memori.
  • Keep it testable: benchmark sebelum & sesudah perubahan.

2. Tools Diagnosis (kapan & bagaimana dipakai)

ToolFungsiUse-case
ST05 (SQL Trace)Trace semua SQL statementTemukan query lambat & frekuensi eksekusi
SAT / SE30Runtime breakdown (time per function/line)Profiling CPU/WALL time di ABAP
ST12Gabungan ST05 + SE30Investigasi mendalam root cause
PlanViz (HANA)Analisa execution plan HANAOptimasi CDS/AMDP/SQLScript
DBACOCKPIT / ST04DB stats & indexPeriksa statistik, locks, space

3. Open SQL Best Practices

  • Pilih field eksplisit (hindari SELECT *).
  • Gunakan INTO TABLE untuk bulk load, bukan banyak SELECT SINGLE.
  • Tambahkan filter yang mengurangi rows (key/partition filter).
  • Gunakan UP TO n ROWS saat sampling.

4. FOR ALL ENTRIES — aturan aman

Gunakan FOR ALL ENTRIES hanya bila:

  • internal table tidak kosong (`IF it_tab IS NOT INITIAL`).
  • internal table tidak berisi banyak ribuan baris; kalau besar, lebih baik masukkan ke Z-temp table / CDS / AMDP.
  • pastikan internal table sudah di-unique/di-sort untuk mencegah IN-list berlebihan.

5. Looping & Internal Table

Prefer struktur data & algoritma yang O(n) atau O(n log n), hindari O(n²) pada data volume besar.

  • Gunakan SORT + READ TABLE ... BINARY SEARCH untuk lookup cepat.
  • Pertimbangkan hashed table (HASHED TABLE) untuk lookup by key.
  • Gunakan FIELD-SYMBOLS / REFERENCE untuk akses tanpa copy.

6. Memory & Garbage

  • Free memory untuk tabel besar: FREE lt_table.
  • Gunakan REFRESH atau reassign variable bila perlu menghindari fragmentasi.
  • Pertimbangkan streaming processing (process partial chunks) untuk dataset sangat besar.

7. CDS/AMDP Pushdown

Jika calculasi heavy & aggregasi besar, pindahkan ke DB:

  • CDS bagus untuk joins & aggregations deklaratif.
  • AMDP/SQLScript untuk algoritma procedural atau window functions yang kompleks.

8. Profiling Workflow — langkah praktis

  1. Reproduce slowdown (test case & dataset representative).
  2. Jalankan ST05 untuk capture SQL; analisa query yang paling sering dan paling lambat.
  3. Jalankan SAT untuk lihat metode/line yang menghabiskan waktu.
  4. Ambil SQL & buka di PlanViz untuk analisa DB plan.
  5. Terapkan perubahan (SQL rewrite, index, CDS/AMDP, loop refactor).
  6. Benchmark ulang & dokumentasikan hasil (before/after timing).

Real Case: Tuning Report Z_SALES (Before → After)

Scenario: report Z_SALES menampilkan sales order lines dengan beberapa filter (company code, date range). User complain: laporan butuh 40–60 detik untuk load 10k rows.

Step 0 — Reproduce & Measure

Reproduksi di DEV/QA dengan dataset ~10k rows. Jalankan SAT untuk total runtime (contoh: 52s). Jalankan ST05 untuk lihat SQL calls (muncul ribuan SELECT SINGLE).

Before — kode inti (inefficient)


" Z_SALES (simplified)
SELECT ebeln FROM vbak INTO TABLE lt_vbak
  WHERE bukrs = p_bukrs AND erdat BETWEEN p_from AND p_to.

LOOP AT lt_vbak INTO lv_ebeln.
  SELECT * FROM vbap INTO TABLE lt_vbap WHERE ebeln = lv_ebeln.
  " process and append to output
ENDLOOP.
    

Masalah utama:

  • SELECT di dalam LOOP → N+1 problem (banyak DB round-trips).
  • Tidak ada filter pada item select selain ebeln → data overfetching.
  • Tidak memakai JOIN atau bulk select.

Analysis (ST05 & SAT)

ST05 menunjukkan ribuan statement SELECT * FROM vbap WHERE ebeln = ... (one per header). SAT menunjukkan method yang memanggil SELECT ini menghabiskan mayoritas wall time. PlanViz tidak relevan karena terlalu banyak small queries.

Solution strategy

  1. Eliminate per-row SELECT — ambil semua item dalam 1 query (JOIN) atau gunakan FOR ALL ENTRIES.
  2. Jika join result besar, gunakan CDS consumption view yang melakukan pushdown & aggregasi, atau AMDP untuk aggregasi/summary.
  3. Reduce columns selected (select only needed fields).

After — opsi A: Single JOIN (preferred)


" Option A: single join, bulk fetch
SELECT h~ebeln h~vkorg h~vkbur i~ebelp i~matnr i~netwr
  FROM vbak AS h
  INNER JOIN vbap AS i ON h~ebeln = i~ebeln
  INTO TABLE @DATA(lt_result)
  WHERE h~bukrs = @p_bukrs
    AND h~erdat BETWEEN @p_from AND @p_to
    AND /* add item-level filters if any */;
" process lt_result in-memory
    

Hasil: satu SQL call, transport data sekali saja. Benchmark: ~1.8s (contoh), drastis turun dari 52s.

After — opsi B: CDS Consumption View (best for reuse & Fiori)


@AbapCatalog.sqlViewName: 'ZV_SALES_LIST'
@EndUserText.label: 'Sales List CDS'
define view ZCDS_SALES_LIST as select from vbak
  association [0..*] to vbap as _items on $projection.ebeln = _items.ebeln
{
  key vbak.ebeln,
      vbak.vkorg,
      vbak.erdat,
      _items.matnr,
      _items.netwr
}
where vbak.bukrs = :p_bukrs and vbak.erdat between :p_from and :p_to;
    

Konsumsi via CDS membuat DB lakukan join & pushdown; Fiori/apps bisa langsung pakai CDS.

After — opsi C: AMDP jika butuh heavy aggregation


" AMDP pseudo example: aggregate order value per material within date range
DATA(lt_agg) = zcl_amdp_sales=>get_sales_agg( iv_bukrs = p_bukrs iv_from = p_from iv_to = p_to ).
    

AMDP menghitung agregasi di HANA dan mengembalikan small resultset. Gunakan ketika logic grouping/rolling/window functions berat.

Micro-optimizations applied

  • Explicit field list (hilangkan SELECT *).
  • Dedupe input IDs sebelum FOR ALL ENTRIES.
  • Gunakan hashed internal table untuk lookup jika perlu.
  • Batch processing / paging untuk UI (limit & lazy load).

Benchmark (example)

VersiAvg Response (10k rows)Notes
Before (per-row SELECT)~52 sN+1 problem, many DB round-trips
After (Single JOIN)~1.8 sSingle query, bulk transfer
After (CDS)~2.2 sPushdown & reusable view (depends on plan)
After (AMDP Agg)~0.5 - 1.0 sBest untuk heavy aggregations (small output)
Catatan: angka di atas ilustratif — hasil sebenarnya bergantung volume data, hardware HANA, dan kondisi jaringan.

Checklist Tuning Praktis (quick)

  1. Reproduce issue & ambil baseline (SAT time, ST05 traces).
  2. Identifikasi hotspot (SQL yang sering/laman & methods terlama).
  3. Refactor: eliminate SELECT-in-loop → JOIN / FOR ALL ENTRIES (safe) / CDS / AMDP.
  4. Minimize selected columns.
  5. Gunakan hashed table / binary search untuk lookup di memory.
  6. Profiling ulang & bandingkan before/after.
  7. Deploy ke QA, lakukan load test, monitoring di production after release.

Common Anti-patterns to Avoid

  • SELECT * di report produksi
  • Nested SELECT di loop
  • FOR ALL ENTRIES tanpa check is not initial
  • Using huge internal tables without FREE
  • Long transactions holding locks during heavy writes

Penutup

Performance tuning itu iterative — ukur dulu, ubah yang paling berdampak, ukur lagi. Kolaborasi developer + DBA + BASIS itu penting. Untuk report besar, pola umum: push aggregation ke DB (AMDP) atau gunakan CDS, lalu ambil hasil kecil ke ABAP untuk render.

👉 Lanjut ke: Belajar ABAP Part 16: Security Best Practices & Authorization in ABAP/CDS


Catatan: contoh dan best practice di atas disesuaikan untuk sistem SAP S/4HANA. Selalu test perubahan performa di environment yang representatif dan libatkan DBA HANA saat melakukan tuning DB-level.

Belajar ABAP Part 14: Performance Tuning & HANA Optimization

Belajar ABAP Part 14: Performance Tuning & HANA Optimization — Tips, Tools, dan Contoh

Belajar ABAP Part 14: Performance Tuning & HANA Optimization

Ringkasan: Fokus part ini: teknik tuning ABAP + HANA untuk aplikasi S/4HANA. Intinya: push logic ke DB (code pushdown) bila relevan, hindari loop di ABAP untuk operasi data besar, gunakan CDS/AMDP dengan bijak, dan pakai alat profiling (PlanViz, ST05, SAT) untuk menemukan bottleneck. Disertai contoh before/after dan checklist tuning.

1. Prinsip Utama Tuning

  • Measure first: jangan guesstimate — profil untuk lihat hotspot.
  • Pushdown where possible: gunakan CDS/AMDP agar DB melakukan kerja berat.
  • Avoid row-by-row: minimalisasi nested loops yang baca DB di tiap iterasi.
  • Right data, right place: pilih column-store, partitioning, atau caching sesuai pola akses.

2. Tools untuk Diagnosis

ToolFungsiKapan pakai
ST05 (SQL Trace)Melacak SQL yang dijalankan oleh ABAPCari query lambat / banyak eksekusi
SAT / SE30Runtime analysis (time breakdown)Profiling performa prosedural ABAP
ST12Gabungan trace SQL+ABAP untuk root-causeInvestigasi mendalam
PlanViz (HANA)Analisa execution plan HANAOptimasi query/AMDP/SQLScript
HANA Studio / Eclipse (HANA tools)Profiling, index, partition, CDS activationDB-side tuning
ST10 / DBACOCKPIT (ST04)Analisa buffer & statistik DBOps DB/DBA checks

3. ABAP-level Best Practices

3.1 Open SQL yang efisien

  • Pakai field list explicit — SELECT matnr, mtart FROM mara bukan SELECT *.
  • Gunakan UP TO n ROWS untuk preview atau sampling.
  • Tambahkan kondisi WHERE yang mengurangi rows sebanyak mungkin (filter by key/partitions)
  • Gunakan INTO TABLE ketimbang loop + SELECT satu per satu.

3.2 FOR ALL ENTRIES vs JOIN

FOR ALL ENTRIES berguna tapi sering disalahpakai. Prinsip:

  • Gunakan hanya jika internal table tidak kosong.
  • Jangan pakai jika internal table sangat besar (ribuan baris) — lebih baik create temporary table in DB (CDS/AMDP) atau gunakan joins.


" risky: many entries => big IN-list
SELECT * FROM ekpo INTO TABLE lt_items
  FOR ALL ENTRIES IN lt_po
  WHERE ebeln = lt_po-ebeln.
    

Jika lt_po besar, buat CDS/AMDP atau insert ke Z-temp table dan JOIN di DB.

3.3 Buffering & Caching

  • Gunakan table buffering untuk small master tables (SE11 → Technical Settings → Buffering).
  • Gunakan ABAP application buffers (SET/GET) bila data jarang berubah dan dibaca sering.
  • Hati-hati: cache stale issues — set TTL/invalidasi sesuai kebutuhan.

3.4 Reduce Network Round-trips

Ambil data dalam bulk (SELECT ... INTO TABLE) daripada banyak CALL FUNCTION/remote roundtrip.

4. CDS / AMDP / Pushdown Best Practices

4.1 Gunakan CDS untuk:

  • Joins/associations dan basic aggregasi
  • Expose OData / Fiori (consumption view + annotations)
  • Parameterize queries (consumption view parameters untuk pruning)

4.2 Gunakan AMDP ketika:

  • Logika procedural/iteratif yang sulit di-express di CDS
  • Transformasi/ETL/komputasi berat di DB
  • Anda perlu kontrol SQLScript (CE functions, window functions, temporary tables)
Note: selalu cek PlanViz untuk melihat apakah CDS/AMDP benar-benar melakukan pushdown dan tidak memaksa row-by-row transfer ke ABAP layer.

5. HANA-specific Optimization

5.1 Column Store vs Row Store

HANA column-store unggul untuk scanning, aggregation, compression. Pastikan tabel besar berada di column store (default di HANA) — hindari row-store untuk analytic workloads.

5.2 Compression & Dictionary Encoding

Column-store compresses data; gunakan low-cardinality columns as dictionary keys. Compression mengurangi I/O & memory footprint.

5.3 Partitioning

Partitioning memudahkan pruning: range partition by date, hash partition by company, dll. Partitioning membantu query hanya scan partition relevan.

5.4 Use CE Functions & Window Functions

HANA menyediakan Calculation Engine (CE) functions dan window functions (ROW_NUMBER, RANK) yang sering jauh lebih cepat dibandingkan SQL naif. Gunakan SQLScript/AMDP untuk memanfaatkan fungsi ini.

5.5 Avoid UDFs / Scalar UDFs where possible

Scalar UDFs can cause performance penalties (row-context). Prefer built-in CE functions or inline expressions.

6. Profiling HANA Queries (PlanViz)

  1. Ambil SQL dari ST05 atau gunakan CDS explain plan.
  2. Load SQL ke PlanViz (HANA Studio / Eclipse) — lihat execution steps: CE joins, table scan, column access.
  3. Perhatikan expensive operators: CE_MULTI_JOIN, CE_JOIN, CE_AGGREGATE, CE_CALCULATION.
  4. Optimisasi: add predicate pushdown, change join order, add partition pruning filters.

7. Before / After Example: Replace Loop + Select with Single SQL (ABAP)

Before (slow — many DB roundtrips):


LOOP AT lt_po INTO ls_po.
  SELECT * FROM ekpo INTO TABLE lt_items WHERE ebeln = ls_po-ebeln.
  " process lt_items
ENDLOOP.
    

After (fast — single DB call using JOIN or FOR ALL ENTRIES carefully):


" Option A: single join (preferred)
SELECT e~ebeln, e~ebelp, e~matnr, h~lifnr
  FROM ekpo AS e
  INNER JOIN ekko AS h ON e~ebeln = h~ebeln
  INTO TABLE lt_result
  FOR ALL ENTRIES IN lt_po
  WHERE e~ebeln = lt_po-ebeln.

" Option B: single select with IN-list (if lt_po small)
SELECT * FROM ekpo INTO TABLE lt_items WHERE ebeln IN @lt_po_ebeln.
    
Tip: prefer JOIN or CDS view that returns already-joined data. If using FOR ALL ENTRIES, ensure lt_po is not initial and de-duplicated.

8. Example: CDS Pushdown vs ABAP Aggregation

Prefer CDS aggregation:


-- CDS
@AbapCatalog.sqlViewName: 'ZV_SALES_SUM'
define view ZCDS_SALES_SUM as select from vbak {
  key kunnr,
  sum( netwr ) as total_sales
}
group by kunnr;
    

Instead of pulling rows then aggregate in ABAP (slow).

9. Index & Statistics

  • HANA tidak bergantung heavy pada secondary indexes seperti DB row-stores — but still check if specific secondary indexes help for point queries.
  • Pastikan table statistics up-to-date (DBA job) agar optimizer bisa memilih plan terbaik.

10. Locking & Concurrency

- Minimalkan long-running transactions. - Untuk batch jobs, gunakan smaller commit intervals (COMMIT WORK) tapi hati-hati dengan partial state. - Pelajari isolation levels jika reading while writing heavy workloads (consistent snapshot behavior in HANA).

11. Operational Checks (Checklist cepat)

  1. Profiling: jalankan ST05 / SAT untuk mendeteksi hotspot.
  2. Ambil SQL & buka PlanViz — cek apakah pushdown terjadi.
  3. Pastikan CDS/AMDP menggunakan parameters untuk pruning.
  4. Ganti nested loops yang men-trigger DB call dengan single SELECT / JOIN / CDS.
  5. Gunakan AMDP untuk heavy aggregations / CE functions.
  6. Periksa partitioning, compression, dan column-store placement.
  7. Perbarui statistik DB; cek HANA alerts/caches.
  8. Uji di environment yang mirip production (volume testing).

12. Common Anti-Patterns

  • SELECT * di aplikasi produksi.
  • Loop { SELECT ... } — row-by-row DB call (N+1 problem).
  • FOR ALL ENTRIES dengan tabel kosong (causes full scan) atau dengan very large table.
  • Scalar UDFs that execute per-row on DB side.
  • Long-running transactions holding locks during heavy writes + reads.

13. Quick Reference: Commands & Tools

  • ST05 — start/stop SQL trace, analyze slow statements
  • SAT / SE30 — runtime analysis for ABAP
  • ST12 — combined ABAP + SQL trace
  • PlanViz — analyze HANA execution plans
  • /HANA Studio / Eclipse — HANA trace, index, partition management
  • DBACOCKPIT / ST04 — DB level stats and space usage

14. Contoh Kasus Nyata (Before / After) — PO Aging

Masalah: report PO aging awalnya membaca semua EKPO & menghitung di ABAP → sangat lambat.

Before (ABAP aggregation):


SELECT * FROM ekko INTO TABLE lt_ekko WHERE bukrs = '1000'.

LOOP AT lt_ekko INTO ls_ekko.
  SELECT SUM( netwr ) INTO lv_sum FROM ekpo WHERE ebeln = ls_ekko-ebeln.
  " calculate aging in ABAP
ENDLOOP.
    

After (AMDP pushdown): gunakan AMDP/SQLScript to compute sums and buckets in DB then return small result set:


" AMDP returns aggregated buckets (small table)
DATA(lt_buckets) = zcl_amdp_po_age=>calc_po_aging( iv_days1 = 30 iv_days2 = 60 ).
    

Hasil: transfer data jauh lebih sedikit, CPU kerja HANA optimized for aggregations, report 10x+ faster tergantung volume.

15. Penutup & Praktik Rutin

Performance tuning adalah siklus: measure → optimize → verify → monitor. Buat baseline sebelum optimasi, dokumentasikan perubahan, dan lakukan regresi/performa test setelah deploy. Kolaborasi tim dev + DBA + BASIS + infra sangat penting buat hasil optimal.

👉 Lanjut ke: Belajar ABAP Part 15: Performance Tuning Lanjutan


Catatan: contoh-contoh di sini disederhanakan supaya mudah paham. Untuk optimasi production, selalu lakukan load testing di environment yang mirip production dan libatkan DBA HANA untuk rekomendasi level DB.

Belajar ABAP Part 13: CDS Consumption View (UI Annotation) & Unit Testing AMDP

Belajar ABAP Part 13: CDS Consumption View (UI Annotation) & Unit Testing AMDP

Belajar ABAP Part 13: CDS Consumption View (UI Annotation) & Unit Testing AMDP

Ringkasan: Di Part 13 ini lo bakal belajar dua hal krusial untuk ABAP modern:
  1. CDS Consumption Views + UI Annotation — bagaimana membuat CDS yang siap dipakai Fiori/OData dengan @UI.hints agar kolom muncul rapi di apps.
  2. Unit Testing AMDP — pattern dan contoh ABAP Unit untuk menguji AMDP (SQLScript) secara repeatable di development/CI pipeline.
Target: membuat data model yang consumable & procedure DB yang dapat diuji otomatis.

Bagian A — CDS Consumption View + UI Annotation

1) Tujuan dan kapan pakai Consumption View

Consumption View adalah layer CDS yang dioptimalkan untuk konsumsi (UI, OData, analytical). Pakai ini ketika lo ingin:

  • Expose data ke Fiori/Smart Template apps
  • Menyediakan field yang relevan di grid/detail view
  • Mengontrol metadata UI (label, ordering, search, filter)

2) Contoh sederhana: CDS Consumption View dengan UI Annotations

Contoh: kita punya basic view ZCDS_PO_BASE (PO header) dan mau bikin consumption view untuk Fiori list.


@AbapCatalog.sqlViewName: 'ZV_PO_BASE'
@EndUserText.label: 'PO Base View'
define view ZCDS_PO_BASE as select from ekko {
  key ebeln,
      bukrs,
      lifnr,
      bedat,
      netwr
}
    

Sekarang bikin consumption view dengan UI annotation:


@AbapCatalog.sqlViewName: 'ZV_PO_CONS'
@EndUserText.label: 'PO Consumption for Fiori'
@AccessControl.authorizationCheck: #CHECK
@OData.publish: true
define view ZCDS_PO_CONSUMPTION
  with parameters
    p_companycode : bukrs
  as select from ZCDS_PO_BASE
{
  key ebeln                                                      as PurchaseOrder,
  bukrs                                                          as CompanyCode,
  lifnr                                                          as Vendor,
  bedat                                                          as DocumentDate,
  netwr                                                          as NetValue,

  @UI.lineItem: [{ position: 10 }]
  @UI.selectionField: [{ position: 10 }]
  netwr                                                           as Amount
}
where bukrs = :p_companycode;
    

Penjelasan annotation penting:

  • @OData.publish: true → CDS akan expose service OData otomatis (aktifkan di /IWFND/MAINT_SERVICE).
  • @AccessControl.authorizationCheck: #CHECK → mengaktifkan pemeriksaan authorization (CDS-based ACL jika ada).
  • @UI.lineItem → menentukan kolom yang tampil di table/list (Fiori Smart Template).
  • @UI.selectionField → menentukan field yang tampil di filter bar (selection).

3) Men-deploy & expose OData service

  1. Activate CDS view di ADT (Eclipse) atau SE11 (jika tersedia).
  2. Buka /IWFND/MAINT_SERVICE → tambahkan service OData yang dibuat (service name biasanya autogen dari CDS).
  3. Test OData endpoint: https://{host}:443/sap/opu/odata/sap/{SERVICE_NAME}/ (SERVICE_NAME lihat di SDA atau di service registration).
  4. Gunakan Fiori Smart Template app (List Report) untuk konsumsi otomatis berdasarkan annotations.
Note: Untuk Fiori-ready UX, lengkapi juga annotation UI seperti @UI.headerInfo, @UI.lineItem dengan label, importance, dan @Search.searchable bila diperlukan.

4) Contoh annotation tambahan (headerInfo & search)


@UI.headerInfo: { typeName: 'PurchaseOrder', typeNamePlural: 'PurchaseOrders' }
@Search.searchable: true
@UI.lineItem: [{ position: 10, label: 'PO' }]
@UI.lineItem: [{ position: 20, label: 'Vendor' }]
define view ZCDS_PO_CONSUMPTION as select from ZCDS_PO_BASE { ... }
    

5) Tips praktis untuk CDS Consumption

  • Gunakan parameter pada consumption view bila perlu scoping (sebagai filter default).
  • Gunakan @ObjectModel.representativeKey bila key composite / perlu mapping ke entity.
  • Dokumentasikan mapping antara CDS field & requirement UI (label, format, currency).

Bagian B — Unit Testing AMDP (ABAP Managed Database Procedures)

1) Mengapa perlu unit test untuk AMDP?

AMDP mengeksekusi logic di database (SQLScript). Karena logic di-database berisiko (performa, hasil berbeda), kita butuh test automated agar:

  • Validasi correctness (aggregasi, bucketing, transform)
  • Mendeteksi regresi saat deploy
  • Mendukung CI/CD untuk ABAP/transport

2) Pendekatan testing untuk AMDP

Ada beberapa pattern:

  1. Integration-style ABAP Unit: buat test class ABAP Unit yang men-setup data di DB (insert ke table/temporary table), panggil AMDP, assert hasil.
  2. Mocking layer ABAP: bungkus pemanggilan AMDP di class ABAP non-AMDP yang bisa di-mock untuk unit test biasa (lebih mudah di-run tanpa DB dependency).
  3. HANA-side tests: tulis SQLScript test di HANA jika ada framework internal (lebih advanced).
Tip: untuk reliability, kombinasi approach #1 (integration tests di dev/CI) + #2 (pure unit tests untuk business logic wrapper) paling baik.

3) Contoh AMDP (kita pakai yang dari Part 12):


CLASS zcl_amdp_po_age DEFINITION
  PUBLIC
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-METHODS calc_po_aging
      IMPORTING iv_days1 TYPE i iv_days2 TYPE i
      RETURNING VALUE(rt_result) TYPE TABLE OF ty_po_aging.
ENDCLASS.

" (IMPLEMENTATION seperti Part 12 - menghasilkan rt_result)
    

4) Contoh ABAP Unit Test (Integration-style)

Keterangan pendek: test ini akan insert data test ke table EKKO/EKPO (atau ke table Z-temp jika prefer), lalu memanggil AMDP dan memeriksa hasil bucket.


CLASS ltc_amdp_po_age_test DEFINITION FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.

  PRIVATE SECTION.
    METHODS:
      setup FOR TESTING,
      teardown FOR TESTING,
      test_po_aging_basic FOR TESTING.

    DATA: mt_ekko TYPE TABLE OF ekko,
          mt_ekpo TYPE TABLE OF ekpo.
ENDCLASS.

CLASS ltc_amdp_po_age_test IMPLEMENTATION.

  METHOD setup.
    " Prepare test data: insert sample PO header & item
    " NOTE: gunakan RFC/user dengan privilege; atau gunakan Z-table test isolation
    CLEAR mt_ekko.
    CLEAR mt_ekpo.

    DATA(ls_ekko) = VALUE ekko( ebeln = 'ZTEST0001' bukrs = '1000' lifnr = '000001' bedat = '20250901' ).
    APPEND ls_ekko TO mt_ekko.

    DATA(ls_ekpo) = VALUE ekpo( ebeln = 'ZTEST0001' ebelp = '00010' netwr = '500000' ).
    APPEND ls_ekpo TO mt_ekpo.

    " Insert to DB (use transportable test data table or temporary Z-table recommended)
    INSERT ekko FROM TABLE mt_ekko.
    INSERT ekpo FROM TABLE mt_ekpo.
  ENDMETHOD.

  METHOD teardown.
    " Clean up test data
    DELETE FROM ekpo WHERE ebeln = 'ZTEST0001'.
    DELETE FROM ekko WHERE ebeln = 'ZTEST0001'.
  ENDMETHOD.

  METHOD test_po_aging_basic.
    " Call AMDP
    DATA(rt_result) = zcl_amdp_po_age=>calc_po_aging( iv_days1 = 30 iv_days2 = 60 ).

    " Assert that result contains expected bucket (e.g., '0-30' or other depending bedat)
    cl_abap_unit_assert=>assert_not_initial( act = rt_result ).
    " find row for bucket '0-30'
    READ TABLE rt_result INTO DATA(ls_row) WITH KEY bucket = '0-30'.
    cl_abap_unit_assert=>assert_true( act = sy-subrc = 0 ).
    cl_abap_unit_assert=>assert_true( act = ls_row-po_count >= 1 ).
  ENDMETHOD.

ENDCLASS.
    

Catatan penting tentang contoh di atas:

  • Penggunaan EKKO/EKPO langsung di DEV bisa berbahaya → lebih aman pakai Z-table test atau transactionally isolated test data.
  • Pastikan user yang menjalankan test punya privilege INSERT/DELETE pada table target (biasanya di DEV/CI saja).
  • Gunakan TRANSPORTABLE atau test data reset agar test idempotent (selalu bisa di-run ulang tanpa efek samping).

5) Teknik Mocking / Wrapper untuk AMDP

Untuk unit test murni (tanpa DB), bungkus pemanggilan AMDP ke class non-AMDP (interface). Di unit test, mock class wrapper tersebut untuk mengembalikan hasil yang diharapkan.


INTERFACE if_po_aging_service.
  METHODS calc_aging IMPORTING iv_d1 TYPE i iv_d2 TYPE i RETURNING VALUE(rt) TYPE TABLE OF ty_po_aging.
ENDINTERFACE.

" Prod implementation: wrapper yang memanggil AMDP
CLASS zcl_po_aging_service DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_po_aging_service.
ENDCLASS.

CLASS zcl_po_aging_service IMPLEMENTATION.
  METHOD if_po_aging_service~calc_aging.
    rt = zcl_amdp_po_age=>calc_po_aging( iv_days1 = iv_d1 iv_days2 = iv_d2 ).
  ENDMETHOD.
ENDCLASS.

" Di unit test, buat fake/mock class (atau local test double) yang implement interface dan return static data.
    

6) Best Practices untuk Testing AMDP

  • Prefer test data di Z-tables khusus test agar tidak mengotori master/transactional table.
  • Jalankan integration tests di DEV/CI environment, bukan di sandbox/production.
  • Gunakan TEARDOWN untuk selalu bersih-bersih data test (DELETE by unique key).
  • Document precondition (HANA version, schema privileges, necessary objects).
  • Gunakan mocking wrapper bila perlu rapid unit testing.

Kesimpulan — Part 13

- CDS Consumption Views + UI annotations membuat model siap konsumsi Fiori/OData dengan sedikit usaha. - AMDP harus diuji: buat integration ABAP Unit tests (setup data → panggil AMDP → assert) dan gunakan wrapper/mocking untuk pure unit tests jika ingin tanpa DB dependency. - Kombinasi CDS (untuk modelling/exposure) + AMDP (untuk logic DB-heavy) + test automation = strategy yang kuat untuk aplikasi S/4HANA yang reliable dan performa tinggi.

👉 Lanjut ke: Belajar ABAP Part 14: Performance Tuning & HANA Optimization


Catatan: snippet di atas disederhanakan untuk pembelajaran. Untuk produksi, sesuaikan naming convention, object transport, dan policy keamanan (authorizations). Pastikan selalu validasi SQLScript functions pada HANA versi target.

Belajar ABAP Part 12: CDS View & AMDP

Belajar ABAP Part 12: CDS View & AMDP — Core Data Services dan ABAP Managed DB Procedures

Belajar ABAP Part 12: CDS View & AMDP — Core Data Services dan ABAP Managed DB Procedures

Ringkasan: CDS View dan AMDP adalah komponen kunci ABAP modern (S/4HANA) untuk menerapkan code pushdown. - CDS digunakan untuk modelling data di DB (view, associations, annotation, expose OData). - AMDP (ABAP Managed Database Procedures) memungkinkan menulis prosedur SQLScript yang dieksekusi langsung di HANA. Gunakan CDS untuk data modelling & exposure, dan AMDP saat diperlukan logic DB-procedural/berat.

1. Mengapa CDS & AMDP penting?

S/4HANA mendorong code pushdown — memindahkan pemrosesan berat dari ABAP stack ke database (HANA). Ini meningkatkan performa (in-memory processing, parallelization). CDS menyediakan cara semantik memodel data; AMDP mengeksekusi logic procedural di DB.

2. Apa itu CDS View?

Core Data Services (CDS) adalah bahasa deklaratif untuk membuat view level database dengan semantik bisnis. CDS mendukung annotation untuk authorization, OData exposure, dan UI hints (Fiori).

Contoh CDS View (basic)


@AbapCatalog.sqlViewName: 'ZV_MARA_MAT'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CDS View Material Master'
define view ZCDS_MATERIAL as select from mara {
  key matnr,
      ersda,
      matkl,
      mtart
}
    

Penjelasan:

  • @AbapCatalog.sqlViewName → nama SQL view fisik di DB (maks 16 char).
  • @EndUserText.label → label untuk dokumentasi / UI.
  • key → kolom kunci pada CDS (required untuk beberapa use-case).

3. Association di CDS (pengganti JOIN manual)

Association memungkinkan mendefinisikan relasi antara entity/view sehingga bisa navigasi secara deklaratif.


@AbapCatalog.sqlViewName: 'ZV_PO_HDR'
define view ZCDS_PO as select from ekko
  association [0..*] to ekpo as _items on $projection.ebeln = _items.ebeln
{
  key ebeln,
      bukrs,
      lifnr,
      _items
}
    

Cara pakai association di query:


select from ZCDS_PO as po
  inner join po._items as item
  on po.ebeln = item.ebeln
  { po.ebeln, item.matnr } 
  where po.bukrs = '1000';
      

4. Jenis CDS View

  • Basic View — representasi satu tabel atau view dasar.
  • Composite View — gabungan dari basic view via join/association.
  • Consumption View — view yang dioptimalkan untuk konsumsi (Fiori, OData, analytical), berisi annotation khusus consumption.

Contoh Consumption View (OData exposure)


@AbapCatalog.sqlViewName: 'ZV_PO_CONS'
@OData.publish: true
@EndUserText.label: 'PO Consumption View for Fiori'
define view ZCDS_PO_CONSUMPTION as select from ZCDS_PO {
  key ebeln         as PurchaseOrder,
      lifnr         as Vendor,
      bukrs         as CompanyCode,
      _items         /* association: will be consumed */
}
    

@OData.publish: true membuat OData service otomatis tersedia (aktifkan service di /IWFND/MAINT_SERVICE).

5. Annotation Penting di CDS

  • @AccessControl.authorizationCheck — authorization di level CDS (#CHECK / #NOT_REQUIRED).
  • @Search.searchable — menandai field agar bisa dicari (Fiori).
  • @UI.lineItem, @UI.selectionField — hints untuk Fiori UI.
  • @ObjectModel — behaviour seperti aggregations, composition, dll.

6. Apa itu AMDP?

AMDP (ABAP Managed Database Procedures) memungkinkan developer menulis procedures/fungsi yang dieksekusi di DB (HANA) menggunakan SQLScript. Implementasinya berada di method ABAP class dengan keyword khusus `BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT`.

Contoh AMDP Class (simple)


CLASS zcl_amdp_sales DEFINITION
  PUBLIC
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES: if_amdp_marker_hdb.
    CLASS-METHODS get_top_customers
      IMPORTING iv_year TYPE gjahr
      RETURNING VALUE(rt_result) TYPE TABLE OF ty_cust_sales.
ENDCLASS.

CLASS zcl_amdp_sales IMPLEMENTATION.
  METHOD get_top_customers BY DATABASE PROCEDURE FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING vbak vbap kna1.

    rt_result =
      SELECT v~kunnr   AS kunnr,
             k~name1   AS name1,
             SUM( v~netwr ) AS total_sales
      FROM vbak AS v
      JOIN kna1 AS k ON v.kunnr = k.kunnr
      WHERE v.gjahr = :iv_year
      GROUP BY v.kunnr, k.name1
      ORDER BY total_sales DESC
      LIMIT 10;

  ENDMETHOD.
ENDCLASS.
    

Penjelasan singkat:

  • if_amdp_marker_hdb — marker interface untuk HANA AMDP.
  • BY DATABASE PROCEDURE FOR HDB — menandakan body method adalah SQLScript yang dijalankan di HANA.
  • USING — deklarasi tabel yang dipakai (optimisasi dependency).
  • Variabel ABAP di SQLScript dipanggil dengan prefix : (contoh :iv_year).

7. Memanggil AMDP dari ABAP


DATA(lt_top) = zcl_amdp_sales=>get_top_customers( iv_year = '2024' ).

LOOP AT lt_top INTO DATA(ls_row).
  WRITE: / ls_row-kunnr, ls_row-name1, ls_row-total_sales.
ENDLOOP.
    

8. Real Case: CDS + AMDP untuk Report PO Aging

Use-case: ingin laporan aging purchase order — hitung jumlah PO dan total value grouped by aging bucket. CDS bisa dipakai untuk struktur dasar, tapi jika logika bucketing kompleks atau heavy aggregation, gunakan AMDP.

CDS untuk PO dasar


@AbapCatalog.sqlViewName: 'ZV_PO_BASE'
@EndUserText.label: 'PO Base View'
define view ZCDS_PO_BASE as select from ekko {
  key ebeln,
      bukrs,
      lifnr,
      aedat,   -- last change date
      bedat    -- document date
}
    

AMDP untuk hitung aging buckets (SQLScript)


CLASS zcl_amdp_po_age DEFINITION
  PUBLIC
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-METHODS calc_po_aging
      IMPORTING iv_days1 TYPE i iv_days2 TYPE i
      RETURNING VALUE(rt_result) TYPE TABLE OF ty_po_aging.
ENDCLASS.

CLASS zcl_amdp_po_age IMPLEMENTATION.
  METHOD calc_po_aging BY DATABASE PROCEDURE FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING ekko ekpo.

    -- contoh sederhana: bucket 0-30,31-60,>60 berdasarkan bedat
    rt_result =
      SELECT bucket,
             COUNT(*) AS po_count,
             SUM(total_value) AS po_total
      FROM (
        SELECT e.ebeln,
               e.bedat,
               ( SELECT SUM( p.netwr ) FROM ekpo AS p WHERE p.ebeln = e.ebeln ) AS total_value,
               CASE
                 WHEN DATEDIFF( day, e.bedat, CURRENT_DATE ) <= :iv_days1 THEN '0-30'
                 WHEN DATEDIFF( day, e.bedat, CURRENT_DATE ) <= :iv_days2 THEN '31-60'
                 ELSE '>60'
               END AS bucket
        FROM ekko AS e
      ) AS sub
      GROUP BY bucket;

  ENDMETHOD.
ENDCLASS.
    

Catatan: fungsi tanggal & DATEDIFF tergantung versi SQLScript/HANA; sesuaikan dengan environment kalian.

9. Perbandingan Singkat CDS vs AMDP

AspekCDS ViewAMDP
Tujuan Data modelling, expose (OData, Fiori), semantik Prosedur/algoritma kompleks & perhitungan heavy di DB
Kemudahan Declarative, mudah dipakai & direuse Butuh knowledge SQLScript, lebih teknis
Performansi Sangat baik untuk join/aggregasi DB Sangat baik untuk logic procedural & ETL di DB
Integrasi Mudah expose OData, Fiori Bisa dipanggil dari ABAP / batch, kurang langsung expose OData

10. Best Practice

  • Start with CDS: pakai CDS untuk modelling & expose API ke UI.
  • Pakai AMDP hanya saat CDS tidak memadai (complex procedural logic, performance-critical).
  • Gunakan @AccessControl & authorization di CDS untuk security.
  • Tulis unit/integration tests untuk AMDP (test data di HANA).
  • Dokumentasikan dependency (USING clause) pada AMDP untuk maintainability.
  • Profiling: gunakan HANA PlanViz untuk optimisasi query/AMDP.

11. Troubleshooting & Tips

  • CDS not activated: activate CDS view di ADT/SE11 dan periksa error compiler.
  • OData not showing: check @OData.publish dan activate service di /IWFND/MAINT_SERVICE.
  • AMDP syntax error: edit body SQLScript di ADT, cek HANA SQLScript reference.
  • Performance issues: profile execution plan di HANA Studio / Eclipse DB explorer.

12. Kesimpulan

CDS & AMDP adalah dua alat penting di ABAP modern: CDS memberikan layer semantik & exposure untuk data, sementara AMDP menyediakan kekuatan SQLScript untuk logika yang lebih procedural atau compute-heavy. Kombinasikan keduanya sesuai kebutuhan — mulai dari modelling di CDS, dan turun ke AMDP bila perlu.

👉 Lanjut ke: Belajar ABAP Part 13: CDS Consumption View (UI Annotation) & Unit Testing AMDP


Catatan: contoh-contoh SQLScript/SQL function (DATEDIFF, CURRENT_DATE, dsb.) dapat berbeda antar HANA versi. Selalu cek dokumentasi HANA SQLScript di environment kalian.

ABAP CDS View Part 10 : Authorization & DCL untuk ABAP CDS

Authorization & DCL di ABAP CDS | Panduan Lengkap (PFCG, @AccessControl, DCL) Authorization & DCL untuk ABAP CDS — Pandua...