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 9: ALV (ABAP List Viewer) — Tutorial dan Contoh Lengkap

Belajar ABAP Part 9: ALV (ABAP List Viewer) — Tutorial & Contoh Lengkap

Belajar ABAP Part 9: ALV (ABAP List Viewer)

ALV (ABAP List Viewer) adalah toolkit standar SAP untuk menampilkan data tabel secara rapi dan interaktif — lengkap dengan fitur sorting, filtering, layout, export, dan event handling. Di artikel ini kita bahas tipe ALV yang sering dipakai, contoh kode, cara menambahkan tombol custom, field catalog manual, dan demo embed-ready.

Field Catalog di ALV

Field catalog berfungsi sebagai “peta” kolom ALV: menentukan label, panjang kolom, alignment, apakah kolom bisa disortir, dll. Field catalog ini wajib di REUSE_ALV_GRID_DISPLAY dan CL_GUI_ALV_GRID, sedangkan CL_SALV_TABLE otomatis membangun dari struktur.

Contoh Lengkap Field Catalog Manual


REPORT z_alv_fieldcat.

TABLES: mara.

DATA: gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gt_data     TYPE TABLE OF mara.

START-OF-SELECTION.
  SELECT * FROM mara INTO TABLE gt_data UP TO 20 ROWS.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MATNR'.
  gs_fieldcat-coltext   = 'Material'.
  gs_fieldcat-outputlen = 18.
  gs_fieldcat-key       = abap_true.
  APPEND gs_fieldcat TO gt_fieldcat.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MTART'.
  gs_fieldcat-coltext   = 'Material Type'.
  gs_fieldcat-outputlen = 10.
  APPEND gs_fieldcat TO gt_fieldcat.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MATKL'.
  gs_fieldcat-coltext   = 'Material Group'.
  gs_fieldcat-outputlen = 12.
  APPEND gs_fieldcat TO gt_fieldcat.

  " ALV grid display dengan field catalog manual
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
    TABLES
      t_outtab    = gt_data.
    

Demo ALV Embed-Ready

Supaya pembaca bisa coba step by step, berikut demo ALV ditampilkan dengan kombinasi <details> di Blogspot. Klik untuk expand:

🔽 Demo ALV dengan CL_SALV_TABLE (Klik untuk expand)

Preview: Program ini menampilkan data MARA ke ALV dengan CL_SALV_TABLE.


REPORT z_demo_alv_salv.

DATA: lt_data TYPE TABLE OF mara,
      lo_alv  TYPE REF TO cl_salv_table.

START-OF-SELECTION.
  SELECT * FROM mara INTO TABLE lt_data UP TO 30 ROWS.

  cl_salv_table=>factory(
    IMPORTING r_salv_table = lo_alv
    CHANGING  t_table      = lt_data ).

  lo_alv->display( ).
      
🔽 Demo ALV dengan Field Catalog + REUSE_ALV_GRID_DISPLAY

Preview: Program ini menampilkan MARA dengan custom kolom (MATNR, MTART, MATKL).


REPORT z_demo_alv_fcat.

TYPES: BEGIN OF ty_data,
         matnr TYPE mara-matnr,
         mtart TYPE mara-mtart,
         matkl TYPE mara-matkl,
       END OF ty_data.

DATA: gt_data TYPE TABLE OF ty_data,
      gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat.

START-OF-SELECTION.
  SELECT matnr mtart matkl
    FROM mara
    INTO TABLE gt_data
    UP TO 50 ROWS.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MATNR'.
  gs_fieldcat-coltext   = 'Material'.
  APPEND gs_fieldcat TO gt_fieldcat.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MTART'.
  gs_fieldcat-coltext   = 'Material Type'.
  APPEND gs_fieldcat TO gt_fieldcat.

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = 'MATKL'.
  gs_fieldcat-coltext   = 'Material Group'.
  APPEND gs_fieldcat TO gt_fieldcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
    TABLES
      t_outtab    = gt_data.
      

Kesimpulan

Dengan Field Catalog, kita bisa kontrol penuh tampilan ALV. Sementara itu, demo embed-ready memudahkan pembaca coba langsung script pendek. Untuk program baru, gunakan CL_SALV_TABLE bila kebutuhan sederhana; gunakan Field Catalog + ALV Grid bila butuh customisasi lanjut.

👉 Lanjut ke: Belajar ABAP Part 10: OOP di ABAP — Class, Object, Inheritance, Exception

Belajar ABAP Part 8: Enhancement & BADI

Belajar ABAP Part 8: Enhancement & BADI — Customisasi Tanpa Modify SAP

Belajar ABAP Part 8: Enhancement & BADI — Customisasi Tanpa Modify SAP

Enhancement & BADI adalah cara menambahkan logic/custom behavior tanpa mengubah source code SAP standar. Hal ini sangat penting agar sistem tetap upgrade safe.

Apa itu Enhancement?

Enhancement memungkinkan menancapkan kode tambahan pada titik tertentu di program SAP.

  • User Exit — function modules siap pakai.
  • Customer Exit — menambah field/logic via CMOD.
  • Implicit Enhancement — otomatis tersedia di awal/akhir program.
  • Explicit Enhancement — titik yang ditentukan oleh SAP developer.

Apa itu BADI?

BADI adalah framework enhancement berbasis OOP. Bisa multiple implementation, scalable, cocok di S/4HANA.

Contoh Implicit Enhancement


ENHANCEMENT 1 ZENH_MIGO_LOG.  
  WRITE: / 'MIGO Posting date updated by user:', sy-uname.
ENDENHANCEMENT.
    

Contoh Implementasi BADI


METHOD if_ex_me_process_po_cust~process_item.

  DATA: ls_item TYPE mepoitem.

  CALL METHOD im_item->get_data
    RECEIVING re_data = ls_item.

  IF ls_item-matnr IS INITIAL.
    MESSAGE e001(zmsg) WITH 'Material must be filled'.
  ENDIF.

ENDMETHOD.
    

Step by Step Implementasi BADI

  1. Buka transaksi SE18 untuk melihat definisi BADI.
  2. Pelajari interface & methods yang tersedia.
  3. Buat implementasi baru di SE19.
  4. Isi logic di method yang relevan sesuai kebutuhan bisnis.
  5. Aktifkan & transport agar bisa digunakan di sistem lain.

Real Case: Validasi Nilai PO Minimal


METHOD if_ex_me_process_po_cust~process_header.

  DATA: ls_header TYPE mepoheader,
        lt_items  TYPE mepoitem_tab,
        lv_total  TYPE ekpo-netwr.

  CALL METHOD im_header->get_data RECEIVING re_data = ls_header.
  CALL METHOD im_header->get_items RECEIVING re_items = lt_items.

  LOOP AT lt_items INTO DATA(ls_item).
    lv_total = lv_total + ls_item-netwr.
  ENDLOOP.

  IF lv_total < 1000000.
    MESSAGE e001(zmsg) WITH 'PO value must be at least 1,000,000 IDR'.
  ENDIF.

ENDMETHOD.
    

ABAP Unit Test untuk BADI


CLASS ltc_badi_me_process_po_cust DEFINITION FINAL FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.

  PRIVATE SECTION.
    DATA: mo_badi TYPE REF TO zcl_impl_me_process_po.

    METHODS: setup.
    METHODS: test_valid_po FOR TESTING.
    METHODS: test_invalid_po FOR TESTING.
ENDCLASS.

CLASS ltc_badi_me_process_po_cust IMPLEMENTATION.

  METHOD setup.
    CREATE OBJECT mo_badi.
  ENDMETHOD.

  METHOD test_valid_po.
    " PO 1.500.000 harus lolos
    DATA: lt_items TYPE mepoitem_tab,
          ls_item TYPE mepoitem,
          ls_header TYPE mepoheader.

    ls_item-netwr = 1500000.
    APPEND ls_item TO lt_items.

    TRY.
        mo_badi->if_ex_me_process_po_cust~process_header(
          im_header = NEW cl_po_header( ls_header )
        ).
        cl_abap_unit_assert=>assert_true( act = abap_true ).
      CATCH cx_root INTO DATA(lx).
        cl_abap_unit_assert=>fail( msg = lx->get_text( ) ).
    ENDTRY.
  ENDMETHOD.

  METHOD test_invalid_po.
    " PO 500.000 harus gagal
    DATA: lt_items TYPE mepoitem_tab,
          ls_item TYPE mepoitem,
          ls_header TYPE mepoheader.

    ls_item-netwr = 500000.
    APPEND ls_item TO lt_items.

    TRY.
        mo_badi->if_ex_me_process_po_cust~process_header(
          im_header = NEW cl_po_header( ls_header )
        ).
        cl_abap_unit_assert=>fail( msg = 'Invalid PO should not pass' ).
      CATCH cx_sy_message_illegal_text INTO DATA(lx).
        cl_abap_unit_assert=>assert_true( act = abap_true ).
    ENDTRY.
  ENDMETHOD.

ENDCLASS.
    

Kesimpulan

- Enhancement & BADI memungkinkan customisasi tanpa modify SAP standard.
- Gunakan BADI untuk sistem modern (S/4HANA).
- Tambahkan unit test agar logic bisa diuji otomatis.
- Dokumentasikan & gunakan transport request agar terkontrol.

👉 Lanjut ke: Belajar ABAP Part 9: ALV (ABAP List Viewer)

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

Monday, 22 September 2025

Belajar ABAP Part 7: ALV Report (ABAP List Viewer)

Belajar ABAP Part 7: ALV Report (ABAP List Viewer)

Belajar ABAP Part 7: ALV Report (ABAP List Viewer)

Setelah mempelajari Part 6: Open SQL, sekarang kita masuk ke tahap yang lebih keren: menampilkan data dengan ALV Report. ALV (ABAP List Viewer) adalah fitur standar SAP untuk menampilkan tabel data dengan tampilan grid yang interaktif, lengkap dengan sorting, filter, dan export Excel.

Mengapa ALV?

  • Standar tampilan SAP → konsisten di semua modul.
  • Sudah built-in fitur filter, sort, dan export.
  • Menghemat waktu developer → tidak perlu coding manual untuk UI list.

Cara Membuat ALV Report

Ada 2 cara populer untuk membuat ALV:

  1. Menggunakan function module REUSE_ALV_GRID_DISPLAY (cara klasik).
  2. Menggunakan class CL_SALV_TABLE (cara modern, OOP style).

Contoh ALV dengan REUSE_ALV_GRID_DISPLAY


REPORT zalv_classic.

TABLES: mara.

DATA: lt_mara TYPE TABLE OF mara,
      ls_mara TYPE mara.

" Ambil data material
SELECT * FROM mara UP TO 20 ROWS INTO TABLE lt_mara.

" Tampilkan pakai ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_structure_name = 'MARA'
  TABLES
    t_outtab         = lt_mara
  EXCEPTIONS
    program_error    = 1
    OTHERS           = 2.

IF sy-subrc <> 0.
  WRITE: / 'Error ALV'.
ENDIF.

Hasilnya: tabel MARA ditampilkan dalam grid interaktif ALV.

Contoh ALV dengan CL_SALV_TABLE (Modern OOP)


REPORT zalv_salv.

DATA: lt_mara TYPE TABLE OF mara.

" Ambil data material
SELECT * FROM mara UP TO 20 ROWS INTO TABLE lt_mara.

" Buat ALV pakai class SALV
DATA(lo_alv) = cl_salv_table=>factory( lt_mara ).
lo_alv->display( ).

Keunggulan CL_SALV_TABLE:

  • Lebih singkat, lebih bersih (OOP style).
  • Mudah dikembangkan (misalnya custom fungsi, filter, dll).

Fitur Tambahan ALV

  • Export ke Excel/CSV.
  • Sort dan filter otomatis.
  • Subtotals dan totals.
  • Toolbar interaktif.

Kesimpulan

ALV adalah standar SAP untuk menampilkan data tabel. Untuk kode lama biasanya dipakai REUSE_ALV_GRID_DISPLAY, tapi untuk kode baru disarankan pakai CL_SALV_TABLE yang lebih modern.

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

Belajar ABAP Part 6: Open SQL (SELECT, INSERT, UPDATE, DELETE)

Belajar ABAP Part 6: Open SQL (SELECT, INSERT, UPDATE, DELETE)

Belajar ABAP Part 6: Open SQL (SELECT, INSERT, UPDATE, DELETE)

Setelah mempelajari Part 5: Internal Table, sekarang kita masuk ke salah satu inti dari ABAP: Open SQL. Dengan Open SQL kita bisa berinteraksi dengan database SAP, misalnya membaca data master (MARA, MARC, VBAK, dsb.) atau melakukan update.

Apa itu Open SQL?

Open SQL adalah subset SQL yang dipakai di SAP ABAP agar query bisa berjalan di semua jenis database yang digunakan SAP (Oracle, HANA, MSSQL, dll).

Perintah Dasar Open SQL

  • SELECT → membaca data dari database.
  • INSERT → menambahkan data baru.
  • UPDATE → memperbarui data.
  • DELETE → menghapus data.

Contoh SELECT


REPORT zsql_select.

DATA: lt_mara TYPE TABLE OF mara,
      ls_mara TYPE mara.

" Ambil data material terbatas 5 row
SELECT * FROM mara UP TO 5 ROWS INTO TABLE lt_mara.

" Loop hasil
LOOP AT lt_mara INTO ls_mara.
  WRITE: / ls_mara-matnr, ls_mara-mtart, ls_mara-mbrsh.
ENDLOOP.

Contoh SELECT dengan WHERE


REPORT zsql_select_where.

DATA: lt_mara TYPE TABLE OF mara,
      ls_mara TYPE mara.

SELECT * FROM mara
  INTO TABLE lt_mara
  WHERE mtart = 'FERT'.

LOOP AT lt_mara INTO ls_mara.
  WRITE: / ls_mara-matnr, ls_mara-mtart.
ENDLOOP.

Contoh INSERT

Biasanya untuk INSERT kita pakai custom table (Z-table). Contoh berikut insert ke tabel zstudent.


REPORT zsql_insert.

DATA: ls_stu TYPE zstudent.

ls_stu-id   = '001'.
ls_stu-name = 'Andi'.
INSERT zstudent FROM ls_stu.

IF sy-subrc = 0.
  WRITE: / 'Insert berhasil'.
ELSE.
  WRITE: / 'Insert gagal'.
ENDIF.

Contoh UPDATE


REPORT zsql_update.

DATA: ls_stu TYPE zstudent.

ls_stu-id   = '001'.
ls_stu-name = 'Budi'.

UPDATE zstudent SET name = ls_stu-name
  WHERE id = ls_stu-id.

IF sy-subrc = 0.
  WRITE: / 'Update berhasil'.
ELSE.
  WRITE: / 'Update gagal'.
ENDIF.

Contoh DELETE


REPORT zsql_delete.

DELETE FROM zstudent WHERE id = '001'.

IF sy-subrc = 0.
  WRITE: / 'Delete berhasil'.
ELSE.
  WRITE: / 'Delete gagal'.
ENDIF.

Contoh JOIN

Kita bisa menggabungkan 2 tabel database, misalnya MARA dan MARC.


REPORT zsql_join.

DATA: lt_data TYPE TABLE OF mara,
      ls_data TYPE mara.

SELECT a~matnr a~mtart b~werks
  FROM mara AS a
  INNER JOIN marc AS b
    ON a~matnr = b~matnr
  INTO TABLE @DATA(lt_result)
  UP TO 10 ROWS.

LOOP AT lt_result INTO DATA(ls_result).
  WRITE: / ls_result-matnr, ls_result-mtart, ls_result-werks.
ENDLOOP.

Kesimpulan

Dengan Open SQL, kita bisa berinteraksi langsung dengan database SAP tanpa peduli apa DBMS yang digunakan. Di level lanjut, Open SQL juga mendukung fitur-fitur modern seperti INLINE DATA, FILTER, dan GROUP BY.

👉 Lanjut ke: Belajar ABAP Part 7: ALV Report

Belajar ABAP Part 5: Internal Tables Lengkap (Standard, Sorted, Hashed)

Belajar ABAP Part 5: Internal Tables Lengkap (Standard, Sorted, Hashed)

Belajar ABAP Part 5: Internal Tables Lengkap (Standard, Sorted, Hashed)

Di Part 4: Modularisasi Program kita sudah bahas modularisasi. Sekarang kita akan mendalami Internal Table, struktur data paling penting di ABAP. Ada 3 jenis utama: Standard Table, Sorted Table, dan Hashed Table. Kita bedah satu-satu dengan contoh coding.

1. Standard Table

Standard Table adalah jenis default internal table. Data disimpan berurutan sesuai urutan APPEND. Cocok digunakan jika data tidak terlalu banyak dan pencarian dilakukan dengan index.


REPORT zstandard_table.

TYPES: BEGIN OF ty_emp,
         id   TYPE i,
         name TYPE string,
       END OF ty_emp.

DATA: lt_emp TYPE STANDARD TABLE OF ty_emp WITH DEFAULT KEY,
      ls_emp TYPE ty_emp.

" Isi data
ls_emp-id = 1. ls_emp-name = 'Andi'. APPEND ls_emp TO lt_emp.
ls_emp-id = 2. ls_emp-name = 'Budi'. APPEND ls_emp TO lt_emp.
ls_emp-id = 3. ls_emp-name = 'Citra'. APPEND ls_emp TO lt_emp.

" Loop data
WRITE: / '--- Standard Table ---'.
LOOP AT lt_emp INTO ls_emp.
  WRITE: / ls_emp-id, ls_emp-name.
ENDLOOP.

" Akses dengan index
READ TABLE lt_emp INTO ls_emp INDEX 2.
WRITE: / 'Index 2 adalah:', ls_emp-name.

Output: --- Standard Table --- 1 Andi 2 Budi 3 Citra Index 2 adalah: Budi

2. Sorted Table

Sorted Table otomatis menyimpan data dalam keadaan terurut berdasarkan key. Cocok untuk data besar karena pencarian lebih cepat daripada Standard Table.


REPORT zsorted_table.

TYPES: BEGIN OF ty_city,
         code TYPE i,
         name TYPE string,
       END OF ty_city.

DATA: lt_city TYPE SORTED TABLE OF ty_city
                WITH UNIQUE KEY code,
      ls_city TYPE ty_city.

" Isi data (acak urutannya)
ls_city-code = 30. ls_city-name = 'Surabaya'. APPEND ls_city TO lt_city.
ls_city-code = 10. ls_city-name = 'Jakarta'.  APPEND ls_city TO lt_city.
ls_city-code = 20. ls_city-name = 'Bandung'.  APPEND ls_city TO lt_city.

" Loop data akan otomatis urut berdasarkan KEY
WRITE: / '--- Sorted Table ---'.
LOOP AT lt_city INTO ls_city.
  WRITE: / ls_city-code, ls_city-name.
ENDLOOP.

" Akses dengan key
READ TABLE lt_city INTO ls_city WITH KEY code = 20.
WRITE: / 'Kota dengan code 20 adalah:', ls_city-name.

Output: --- Sorted Table --- 10 Jakarta 20 Bandung 30 Surabaya Kota dengan code 20 adalah: Bandung

3. Hashed Table

Hashed Table menyimpan data dengan struktur hash, mirip dictionary/map. Sangat cepat untuk pencarian berdasarkan key, tapi tidak bisa diakses dengan index.


REPORT zhashed_table.

TYPES: BEGIN OF ty_mat,
         matnr TYPE i,
         desc  TYPE string,
       END OF ty_mat.

DATA: lt_mat TYPE HASHED TABLE OF ty_mat
                WITH UNIQUE KEY matnr,
      ls_mat TYPE ty_mat.

" Isi data
ls_mat-matnr = 500. ls_mat-desc = 'Material A'. APPEND ls_mat TO lt_mat.
ls_mat-matnr = 200. ls_mat-desc = 'Material B'. APPEND ls_mat TO lt_mat.
ls_mat-matnr = 300. ls_mat-desc = 'Material C'. APPEND ls_mat TO lt_mat.

" Loop data (tidak berurutan karena sifat hash)
WRITE: / '--- Hashed Table ---'.
LOOP AT lt_mat INTO ls_mat.
  WRITE: / ls_mat-matnr, ls_mat-desc.
ENDLOOP.

" Akses dengan key
READ TABLE lt_mat INTO ls_mat WITH KEY matnr = 300.
WRITE: / 'Material 300 adalah:', ls_mat-desc.

Output (urutan bisa berbeda): --- Hashed Table --- 200 Material B 300 Material C 500 Material A Material 300 adalah: Material C

Perbandingan 3 Jenis Internal Table

Jenis Kelebihan Kekurangan Cocok untuk
Standard Table Mudah digunakan, akses via index Pencarian lambat untuk data besar Data kecil, sederhana
Sorted Table Data otomatis terurut, pencarian cepat Butuh key untuk akses efisien Data besar yang sering dicari berdasarkan key
Hashed Table Pencarian super cepat via key Tidak bisa pakai index, urutan tidak terjamin Data sangat besar, lookup by key

Kesimpulan

Internal Table adalah pondasi utama ABAP. Pilih jenis sesuai kebutuhan:

  • Pakai Standard Table untuk data kecil/sederhana.
  • Pakai Sorted Table untuk data besar yang perlu urut + pencarian cepat.
  • Pakai Hashed Table untuk pencarian super cepat berdasarkan key.

👉 Lanjut ke: Belajar ABAP Part 6: Open SQL di ABAP

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