Showing posts sorted by relevance for query ABAP. Sort by date Show all posts
Showing posts sorted by relevance for query ABAP. Sort by date Show all posts

Monday, 22 September 2025

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Selamat datang di seri Belajar ABAP dari Basic sampai Advance. Pada bagian pertama ini, kita akan membahas pengenalan dasar ABAP, sejarah singkat, dan menulis program pertama di SAP menggunakan ABAP.

Apa itu ABAP?

ABAP (Advanced Business Application Programming) adalah bahasa pemrograman yang digunakan untuk mengembangkan aplikasi pada sistem SAP. ABAP mendukung pemrograman prosedural maupun object-oriented, sehingga fleksibel digunakan untuk berbagai kebutuhan bisnis.

Sejarah Singkat ABAP

ABAP pertama kali dikembangkan oleh SAP pada tahun 1980-an untuk mendukung pembuatan laporan dan program aplikasi bisnis. Hingga saat ini, ABAP masih menjadi salah satu pilar utama dalam SAP ERP maupun SAP S/4HANA.

Kenapa Belajar ABAP?

  • Digunakan secara luas di perusahaan besar yang menggunakan SAP.
  • Mudah dipelajari bagi pemula yang sudah familiar dengan bahasa pemrograman dasar.
  • Banyak peluang karir di bidang SAP Development.
  • Mendukung integrasi dengan teknologi modern (CDS View, OData, HANA, dsb).

Tools yang Dibutuhkan

Untuk mulai belajar ABAP, ada dua tools utama yang biasanya digunakan:

  1. SAP GUI: digunakan untuk akses langsung ke sistem SAP.
  2. Eclipse dengan ABAP Development Tools (ADT): IDE modern untuk coding ABAP.

Program Pertama: Hello World

Sebagai latihan pertama, mari kita buat program sederhana di ABAP:


REPORT zhello_world.

WRITE: 'Hello, ABAP World!'.

Program di atas akan menampilkan teks sederhana Hello, ABAP World! ke layar SAP. Mudah kan? 😊

Kesimpulan

Pada artikel pertama ini, kita sudah mengenal dasar apa itu ABAP, sejarah singkatnya, alasan kenapa belajar ABAP penting, tools yang dibutuhkan, dan membuat program pertama. Di seri berikutnya, kita akan membahas lebih detail tentang dasar-dasar pemrograman ABAP seperti variabel, tipe data, dan perintah dasar.

👉 Lanjut ke: Belajar ABAP Part 2: Dasar-Dasar Pemrograman ABAP

Tuesday, 9 May 2023

Apa itu SAP ABAP?

 SAP ABAP adalah salah satu bahasa pemrograman yang digunakan dalam sistem SAP untuk mengembangkan aplikasi bisnis. Jika Anda baru mengenal SAP ABAP, berikut adalah artikel untuk pemula yang dapat membantu Anda memulai:

  1. Pengenalan SAP ABAP

SAP ABAP adalah bahasa pemrograman tingkat tinggi yang digunakan dalam sistem SAP. Dengan SAP ABAP, Anda dapat membuat aplikasi bisnis yang dapat diintegrasikan dengan sistem SAP. Artikel ini akan membantu Anda memahami dasar-dasar SAP ABAP.

  1. Struktur Program SAP ABAP

Program SAP ABAP terdiri dari beberapa elemen yang harus dipahami oleh pemula. Artikel ini akan membantu Anda memahami elemen-elemen tersebut, termasuk statement, variabel, dan tipe data.

  1. Menggunakan Loop di SAP ABAP

Loop adalah salah satu fungsi yang paling sering digunakan dalam SAP ABAP. Artikel ini akan membantu Anda memahami bagaimana menggunakan loop di SAP ABAP.

  1. Menggunakan Fungsi di SAP ABAP

Fungsi adalah bagian penting dari SAP ABAP yang membantu Anda membuat kode yang lebih efisien. Artikel ini akan membantu Anda memahami bagaimana menggunakan fungsi di SAP ABAP.

  1. Debugging di SAP ABAP

Debugging adalah proses untuk menemukan kesalahan dalam kode SAP ABAP. Artikel ini akan membantu Anda memahami bagaimana melakukan debugging di SAP ABAP.

  1. Menjalankan Program SAP ABAP

Setelah Anda menulis kode SAP ABAP, Anda perlu menjalankannya untuk melihat hasilnya. Artikel ini akan membantu Anda memahami bagaimana menjalankan program SAP ABAP.

  1. Memahami Database di SAP ABAP

Database adalah bagian penting dari sistem SAP, dan SAP ABAP dapat digunakan untuk berinteraksi dengan database. Artikel ini akan membantu Anda memahami bagaimana berinteraksi dengan database di SAP ABAP.

Dengan mengikuti artikel-artikel di atas, Anda dapat memulai belajar SAP ABAP untuk membuat aplikasi bisnis di dalam sistem SAP. Selamat belajar!

Wednesday, 8 October 2025

Belajar SAP ABAP RAP

 

Belajar SAP ABAP RAP: Pengenalan dan Konsep Dasar Restful ABAP Programming Model

Kalau kamu seorang ABAPer yang mulai terjun ke dunia SAP S/4HANA atau ABAP Cloud, pasti sudah sering dengar istilah RAP — singkatan dari RESTful ABAP Programming Model.
Framework ini adalah cara modern dari SAP untuk membangun aplikasi bisnis berbasis layanan (service-based application) menggunakan prinsip REST dan OData V4, yang menjadi dasar dari aplikasi SAP Fiori.


Apa Itu ABAP RAP?

ABAP RAP (RESTful ABAP Programming Model) adalah model pemrograman modern di lingkungan ABAP Platform yang memungkinkan developer membangun aplikasi bisnis dengan arsitektur service-oriented.
RAP merupakan evolusi dari model pemrograman ABAP sebelumnya seperti BOPF (Business Object Processing Framework) dan ABAP Programming Model for Fiori.

Tujuan utama RAP adalah menyatukan cara membangun aplikasi ABAP — dari lapisan data, logika bisnis, hingga UI — agar bisa dijalankan baik di S/4HANA On-Premise maupun di SAP BTP ABAP Environment (ABAP Cloud).


Arsitektur ABAP RAP

Secara umum, RAP dibangun dengan tiga lapisan utama:

  1. Data Modeling & Behavior
    Dibangun menggunakan ABAP CDS View dan Behavior Definition. Di sini kamu mendefinisikan struktur data, hubungan antar entitas, serta bagaimana data bisa dibuat, diubah, atau dihapus.

  2. Business Logic
    Diatur melalui Behavior Implementation dalam kelas ABAP (biasanya berawalan ZBP_...). Bagian ini berisi logika bisnis dan validasi data.

  3. Service Exposure
    Lapisan terakhir yang bertugas men-expose objek bisnis sebagai OData Service melalui Service Definition dan Service Binding — supaya bisa diakses oleh aplikasi Fiori.

Dengan struktur ini, ABAP RAP membuat pengembangan aplikasi menjadi lebih modular, bersih, dan efisien.


Komponen Utama dalam ABAP RAP

1. CDS View (Data Model)

RAP menggunakan Core Data Services (CDS) untuk mendefinisikan model data. CDS memungkinkan kita membuat representasi data yang semantik, reusable, dan langsung bisa dikonsumsi oleh Fiori.

Contoh:

Contoh:

@AbapCatalog.sqlViewName: 'ZV_BOOK' @EndUserText.label: 'Book Data' define root view entity ZI_Book as select from zbook { key book_id, title, author, price, published_on }

2. Behavior Definition

File ini mendefinisikan perilaku (behavior) dari entitas CDS — misalnya apakah data bisa dibuat, diperbarui, atau dihapus.

Contoh:

managed implementation in class zbp_i_book unique; define behavior for ZI_Book alias Book persistent table zbook { create; update; delete; }

3. Behavior Implementation

Bagian ini berisi logika bisnis yang dijalankan saat entitas diproses, misalnya validasi input atau aksi tertentu.

Contoh:

CLASS zbp_i_book DEFINITION PUBLIC FINAL. PUBLIC SECTION. INTERFACES: if_abap_behavior_handler. ENDCLASS. CLASS zbp_i_book IMPLEMENTATION. METHOD create. LOOP AT entities INTO DATA(book). IF book-price < 0. failed = VALUE #( ( %cid = book-%cid reason = 'Invalid Price' ) ). ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS.

4. Service Definition dan Service Binding

Terakhir, kamu perlu men-expose entitas sebagai OData Service agar bisa digunakan oleh aplikasi Fiori Elements.

define service ZUI_BookService { expose ZI_Book; }

Setelah membuat Service Definition, kamu buat Service Binding (biasanya tipe OData V4) dan aktifkan.
SAP akan otomatis menghasilkan endpoint yang bisa diuji langsung dari browser atau Fiori preview.


Keuntungan Menggunakan ABAP RAP

Beberapa keunggulan utama RAP dibandingkan pendekatan lama:

  • Cloud-ready: bisa digunakan di SAP BTP ABAP Environment.

  • Modern architecture: berbasis REST dan OData V4.

  • Reusable: model data dan logika bisnis terpisah dengan jelas.

  • Secure: terintegrasi dengan DCL (Data Control Language) untuk otorisasi.

  • Efficient: CRUD otomatis, transaction handling, dan integrasi penuh dengan Fiori.


Perbandingan RAP vs BOPF vs ABAP Klasik

AspekClassic ABAPBOPFRAP
ArsitekturProceduralObject-OrientedService-Oriented
UI IntegrationManual (Dynpro)Fiori OData V2Fiori Elements OData V4
DeploymentOn-PremiseOn-PremiseOn-Premise & Cloud
Data ModelTransparent TableBOPF ObjectCDS View Entity

Kesimpulan

ABAP RAP adalah masa depan pengembangan aplikasi di ekosistem SAP.
Dengan pendekatan yang modular, cloud-ready, dan service-based, framework ini membuat developer lebih mudah membangun aplikasi Fiori modern tanpa banyak coding procedural.

Monday, 22 September 2025

Belajar ABAP Part 2: Dasar-Dasar Pemrograman ABAP

Belajar ABAP Part 2: Dasar-Dasar Pemrograman ABAP

Belajar ABAP Part 2: Dasar-Dasar Pemrograman ABAP

Setelah pada Part 1: Pengenalan ABAP kita mengenal apa itu ABAP dan membuat program pertama, sekarang kita akan masuk lebih dalam ke dasar pemrograman ABAP. Materi ini meliputi:

  • Deklarasi variabel
  • Tipe data di ABAP
  • Penggunaan WRITE statement

Deklarasi Variabel

Variabel digunakan untuk menyimpan data. Di ABAP, variabel biasanya dideklarasikan menggunakan keyword DATA.


REPORT zvariable_example.

DATA: gv_name TYPE string,
      gv_age  TYPE i.

gv_name = 'Andi'.
gv_age  = 25.

WRITE: / 'Nama :', gv_name,
       / 'Umur :', gv_age.

Pada contoh di atas:

  • gv_name adalah variabel bertipe string.
  • gv_age adalah variabel integer (bilangan bulat).
  • Keyword WRITE digunakan untuk menampilkan output.

Tipe Data di ABAP

ABAP memiliki berbagai tipe data yang bisa digunakan. Berikut beberapa tipe dasar:

Tipe Data Keterangan Contoh
C (Character) Teks dengan panjang tetap DATA gv_text TYPE c LENGTH 10.
N (Numeric) Angka dalam bentuk teks DATA gv_num TYPE n LENGTH 5.
I (Integer) Bilangan bulat DATA gv_int TYPE i.
D (Date) Tanggal (YYYYMMDD) DATA gv_date TYPE d.
F (Float) Bilangan desimal DATA gv_float TYPE f.
STRING Teks dengan panjang dinamis DATA gv_string TYPE string.

WRITE Statement

Perintah WRITE digunakan untuk menampilkan data ke layar. Contoh sederhana:


REPORT zwrite_example.

DATA gv_total TYPE i.

gv_total = 100 + 50.

WRITE: 'Total nilai adalah:', gv_total.

Output yang muncul di layar SAP adalah:

Total nilai adalah: 150

Kesimpulan

Di Part 2 ini kita sudah mempelajari dasar penting dalam ABAP yaitu cara mendeklarasikan variabel, mengenal tipe data, dan menampilkan data dengan WRITE. Pemahaman ini sangat penting karena akan menjadi dasar untuk materi berikutnya.

👉 Lanjut ke: Belajar ABAP Part 3: Control Statements (IF, CASE, LOOP)

Tuesday, 23 September 2025

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.

Tuesday, 30 September 2025

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.

Tuesday, 23 September 2025

Belajar ABAP Part 10: OOP Concepts in ABAP (Class, Inheritance, Polymorphism, Exception, Design Pattern)

Belajar ABAP Part 10: OOP Concepts in ABAP (Class, Inheritance, Polymorphism, Exception, Design Pattern)

Belajar ABAP Part 10: OOP Concepts in ABAP

Ringkasan: Pada bagian ini kita belajar Object-Oriented Programming (OOP) di ABAP: mulai dari class & object, visibility (PUBLIC, PROTECTED, PRIVATE), constructor, inheritance, polymorphism, hingga exception class. Disertai pula contoh design pattern populer seperti Factory dan Strategy yang sering dipakai dalam development SAP ABAP modern.

1. Pengenalan OOP di ABAP

ABAP mendukung OOP sejak SAP Basis 4.6C. Dengan paradigma ini, developer dapat membuat kode yang lebih terstruktur, reusable, dan maintainable. Konsep utama OOP di ABAP meliputi encapsulation, inheritance, polymorphism, dan abstraction.

2. Class & Object

Class adalah blueprint, sedangkan object adalah instance dari class tersebut. Public method dapat dipanggil dari luar, sementara private hanya bisa diakses dari dalam class.


CLASS zcl_hello DEFINITION.
  PUBLIC SECTION.
    METHODS: say_hello.
ENDCLASS.

CLASS zcl_hello IMPLEMENTATION.
  METHOD say_hello.
    WRITE: / 'Hello ABAP OOP!'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_hello) = NEW zcl_hello( ).
  lo_hello->say_hello( ).
  

3. Inheritance

Inheritance memungkinkan sebuah class untuk mewarisi properti dan method dari class lain. Jika method di class parent tidak sesuai, kita bisa melakukan REDEFINITION di child class.


CLASS zcl_animal DEFINITION.
  PUBLIC SECTION.
    METHODS: speak.
ENDCLASS.

CLASS zcl_animal IMPLEMENTATION.
  METHOD speak.
    WRITE: / 'Animal sound'.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_dog DEFINITION INHERITING FROM zcl_animal.
  PUBLIC SECTION.
    METHODS: speak REDEFINITION.
ENDCLASS.

CLASS zcl_dog IMPLEMENTATION.
  METHOD speak.
    WRITE: / 'Woof! Woof!'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_pet) = NEW zcl_dog( ).
  lo_pet->speak( ).
  

4. Polymorphism

Polymorphism memungkinkan object yang berbeda memberikan respon berbeda terhadap method yang sama. Dengan cara ini, kode lebih fleksibel tanpa perlu banyak IF/CASE.


CLASS zcl_cat DEFINITION INHERITING FROM zcl_animal.
  PUBLIC SECTION.
    METHODS: speak REDEFINITION.
ENDCLASS.

CLASS zcl_cat IMPLEMENTATION.
  METHOD speak.
    WRITE: / 'Meow!'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_animal) TYPE REF TO zcl_animal.
  lo_animal = NEW zcl_dog( ).
  lo_animal->speak( ). "Output: Woof!

  lo_animal = NEW zcl_cat( ).
  lo_animal->speak( ). "Output: Meow!
  

5. Exception Class

Untuk menangani error, ABAP menyediakan exception class. Dengan cara ini, error dapat ditangani lebih terstruktur dibandingkan sekadar IF condition.


CLASS zcx_invalid_input DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.

CLASS zcl_calc DEFINITION.
  PUBLIC SECTION.
    METHODS divide IMPORTING iv_a TYPE i iv_b TYPE i
                   RETURNING VALUE(rv_res) TYPE f
                   RAISING zcx_invalid_input.
ENDCLASS.

CLASS zcl_calc IMPLEMENTATION.
  METHOD divide.
    IF iv_b = 0.
      RAISE EXCEPTION TYPE zcx_invalid_input.
    ENDIF.
    rv_res = iv_a / iv_b.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
      DATA(lo_calc) = NEW zcl_calc( ).
      WRITE: / lo_calc->divide( 10, 0 ).
    CATCH zcx_invalid_input.
      WRITE: / 'Error: Division by zero!'.
  ENDTRY.
  

6. Real Case: Sales Order Object

Implementasi nyata: membuat object untuk Sales Order. Data disimpan dalam atribut private dan hanya diakses via method.


CLASS zcl_sales_order DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor IMPORTING iv_so TYPE vbeln,
             display,
             get_total RETURNING VALUE(rv_total) TYPE netwr.
  PRIVATE SECTION.
    DATA: gv_so TYPE vbeln,
          gv_total TYPE netwr.
ENDCLASS.

CLASS zcl_sales_order IMPLEMENTATION.
  METHOD constructor.
    gv_so = iv_so.
    " Simulasi fetch SO dari DB
    gv_total = 10000.
  ENDMETHOD.

  METHOD display.
    WRITE: / 'SO:', gv_so, 'Total:', gv_total.
  ENDMETHOD.

  METHOD get_total.
    rv_total = gv_total.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_so) = NEW zcl_sales_order( '4500001234' ).
  lo_so->display( ).
  

7. Design Pattern: Factory

Factory Pattern memisahkan logika pembuatan object. Caller cukup meminta object berdasarkan tipe, tanpa tahu implementasi detailnya.


INTERFACE if_payment_method.
  METHODS pay IMPORTING iv_amount TYPE i.
ENDINTERFACE.

CLASS zcl_payment_cash DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_payment_method.
ENDCLASS.

CLASS zcl_payment_cash IMPLEMENTATION.
  METHOD if_payment_method~pay.
    WRITE: / 'Paid in CASH:', iv_amount.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_payment_card DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_payment_method.
ENDCLASS.

CLASS zcl_payment_card IMPLEMENTATION.
  METHOD if_payment_method~pay.
    WRITE: / 'Paid with CARD:', iv_amount.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_payment_factory DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS get_payment
      IMPORTING iv_type TYPE string
      RETURNING VALUE(ro_pay) TYPE REF TO if_payment_method.
ENDCLASS.

CLASS zcl_payment_factory IMPLEMENTATION.
  METHOD get_payment.
    CASE iv_type.
      WHEN 'CASH'. CREATE OBJECT ro_pay TYPE zcl_payment_cash.
      WHEN 'CARD'. CREATE OBJECT ro_pay TYPE zcl_payment_card.
      WHEN OTHERS. ro_pay = NULL.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_pay) = zcl_payment_factory=>get_payment( 'CARD' ).
  IF lo_pay IS BOUND.
    lo_pay->pay( 500000 ).
  ENDIF.
  

8. Design Pattern: Strategy

Strategy Pattern memungkinkan algoritma dipilih secara fleksibel di runtime. Contoh: perhitungan diskon bisa berbeda untuk pelanggan biasa vs VIP.


INTERFACE if_discount_strategy.
  METHODS calc_discount IMPORTING iv_amount TYPE p DECIMALS 2
                        RETURNING VALUE(rv_disc) TYPE p DECIMALS 2.
ENDINTERFACE.

CLASS zcl_disc_normal DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_discount_strategy.
ENDCLASS.

CLASS zcl_disc_normal IMPLEMENTATION.
  METHOD if_discount_strategy~calc_discount.
    rv_disc = iv_amount * 0.05.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_disc_vip DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_discount_strategy.
ENDCLASS.

CLASS zcl_disc_vip IMPLEMENTATION.
  METHOD if_discount_strategy~calc_discount.
    rv_disc = iv_amount * 0.15.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_discount_context DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor IMPORTING io_strat TYPE REF TO if_discount_strategy,
             get_discount IMPORTING iv_amount TYPE p DECIMALS 2
                          RETURNING VALUE(rv_disc) TYPE p DECIMALS 2.
  PRIVATE SECTION.
    DATA: mo_strategy TYPE REF TO if_discount_strategy.
ENDCLASS.

CLASS zcl_discount_context IMPLEMENTATION.
  METHOD constructor.
    mo_strategy = io_strat.
  ENDMETHOD.

  METHOD get_discount.
    rv_disc = mo_strategy->calc_discount( iv_amount ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(lo_vip) = NEW zcl_discount_context( NEW zcl_disc_vip( ) ).
  WRITE: / 'VIP disc for 1,000,000 =', lo_vip->get_discount( 1000000 ).

  DATA(lo_norm) = NEW zcl_discount_context( NEW zcl_disc_normal( ) ).
  WRITE: / 'Normal disc for 1,000,000 =', lo_norm->get_discount( 1000000 ).
  

9. Kesimpulan

OOP di ABAP memberi struktur kuat untuk development modern. Dengan class, inheritance, polymorphism, dan exception handling, program menjadi lebih terstruktur. Ditambah lagi dengan design pattern seperti Factory dan Strategy, kita bisa membangun sistem yang lebih fleksibel, scalable, dan maintainable.

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 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.

Belajar ABAP: Data Dictionary (DDIC) untuk Pemula

Belajar ABAP: Data Dictionary (DDIC) untuk Pemula

Belajar ABAP: Data Dictionary (DDIC) untuk Pemula

Sebelum melanjutkan ke level advance, penting bagi pemula memahami Data Dictionary (DDIC) di SAP ABAP. Data Dictionary adalah tempat di mana semua definisi struktur data disimpan dan dikelola, sehingga developer tidak perlu mendefinisikan ulang data secara manual di program.

Apa itu Data Dictionary?

Data Dictionary di ABAP berfungsi untuk mendefinisikan, mengelola, dan memelihara objek data di SAP. Semua tabel database, field, data element, domain, view, dan search help dikelola di sini.

Fungsi Utama Data Dictionary

  • Definisi tabel database (transparent, cluster, pooled).
  • Mendefinisikan domain (tipe data dan nilai valid).
  • Mendefinisikan data element (field dengan semantic meaning).
  • Membuat view untuk kombinasi tabel.
  • Membuat search help (F4 Help).
  • Memastikan konsistensi data di seluruh sistem.

Jenis Objek di Data Dictionary

  1. Domain → menentukan tipe data teknis (char, num, length, value range).
  2. Data Element → field dengan definisi semantik (misalnya Material Number, Customer ID).
  3. Table → menyimpan data di database (transparent, pooled, cluster).
  4. View → representasi virtual dari satu atau lebih tabel.
  5. Search Help → menyediakan fasilitas pencarian (F4 help).

Hubungan Domain, Data Element, dan Table

Supaya lebih jelas, berikut ilustrasi alur Data Dictionary di ABAP:

+---------+        +--------------+        +------------+
| Domain  | -----> | Data Element | -----> |   Table    |
+---------+        +--------------+        +------------+

Contoh:
Domain: ZSTU_ID (NUMC 5)
   ↓
Data Element: ZSTU_ID (Student ID)
   ↓
Table: ZSTUDENT (Field: ID menggunakan Data Element ZSTU_ID)

Atau bisa juga digambarkan dalam bentuk tabel hierarki:

Domain Data Element Table Field
ZSTU_ID
(NUMC 5)
ZSTU_ID
(Student ID)
ID (Primary Key)
ZSTU_NAME
(CHAR 50)
ZSTU_NAME
(Student Name)
NAME
ZSTU_AGE
(NUMC 2)
ZSTU_AGE
(Age)
AGE
ZSTU_CLASS
(CHAR 10)
ZSTU_CLASS
(Class Code)
CLASS

Contoh Membuat Tabel di Data Dictionary

Misalnya kita ingin membuat tabel ZSTUDENT untuk menyimpan data mahasiswa:


Tabel: ZSTUDENT
-----------------------------------------
Field        Data Element   Domain   Key
-----------------------------------------
ID           ZSTU_ID        NUMC(5)  X
NAME         ZSTU_NAME      CHAR(50)
AGE          ZSTU_AGE       NUMC(2)
CLASS        ZSTU_CLASS     CHAR(10)

Contoh Query ABAP dengan Tabel ZSTUDENT


REPORT zddic_example.

DATA: lt_student TYPE TABLE OF zstudent,
      ls_student TYPE zstudent.

" Ambil semua data mahasiswa
SELECT * FROM zstudent INTO TABLE lt_student.

" Tampilkan hasil
LOOP AT lt_student INTO ls_student.
  WRITE: / ls_student-id, ls_student-name, ls_student-age, ls_student-class.
ENDLOOP.

Perbandingan Tipe Table di Data Dictionary

Di SAP ABAP, ada tiga jenis tabel utama di Data Dictionary. Berikut perbandingannya:

Jenis Tabel Deskripsi Contoh Kapan Digunakan
Transparent Table 1:1 dengan tabel database fisik. Nama tabel di SAP sama dengan tabel di database. Digunakan untuk menyimpan data aplikasi. ZSTUDENT, MARA, BKPF - Data master (Material, Vendor, Customer).
- Data transaksi (Document Header, Item).
Pooled Table Banyak tabel logis di SAP digabung ke dalam satu tabel fisik di database. Cocok untuk tabel kecil dengan data administratif. ATAB, TSTC - Data konfigurasi atau kontrol.
- Tabel internal SAP yang tidak besar.
Cluster Table Beberapa tabel logis disimpan dalam satu tabel fisik berbasis cluster. Data disimpan dalam bentuk compressed. BSEG (Accounting Document Segment) - Data dengan volume besar.
- Data dengan hubungan kompleks (misalnya FI/CO).

Note: Di SAP versi terbaru (S/4HANA), Pooled dan Cluster table sudah tidak direkomendasikan lagi. Mayoritas objek disimpan sebagai Transparent Table agar lebih efisien dan kompatibel dengan HANA Database.

Keuntungan Menggunakan Data Dictionary

  • Semua developer pakai definisi data yang sama → konsistensi.
  • Mengurangi redudansi kode.
  • Integrasi otomatis dengan Open SQL.
  • Dapat digunakan di semua program ABAP.

Kesimpulan

Data Dictionary adalah pondasi utama di SAP ABAP. Tanpa pemahaman DDIC, developer akan kesulitan membuat tabel, field, maupun struktur data yang reusable di berbagai program.

👉 Lanjut ke: Belajar ABAP Part 8: Enhancement & BADI

SAP ABAP - Upload Count PID dengan BAPI

Upload Count PID dengan BAPI di ABAP — Contoh Program YMMC100 Upload Count PID dengan BAPI di ABAP — Progr...