Belajar ABAP Part 12: CDS View & AMDP — Core Data Services dan ABAP Managed DB Procedures
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
Aspek | CDS View | AMDP |
---|---|---|
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.
Comments
Post a Comment