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

Wednesday, 5 November 2025

SAP ABAP - Upload Count PID dengan BAPI

Upload Count PID dengan BAPI di ABAP — Contoh Program YMMC100

Upload Count PID dengan BAPI di ABAP — Program YMMC100

ABAP BAPI_MATPHYSINV_COUNT Estimated reading time: 6–8 menit

Ringkasan (TL;DR): Program YMMC100 membaca data count fisik (PID) dari file Excel, memvalidasi tiap baris (material, dokumen PID, status item), menampilkan hasil di ALV, lalu melakukan post count ke SAP lewat BAPI_MATPHYSINV_COUNT.

Outline

  1. Penjelasan singkat fungsi program
  2. Struktur source (includes & main)
  3. Penjelasan tiap bagian include
  4. Format Excel yang diharapkan
  5. Flow proses (read → validate → display → post)
  6. Best practices & troubleshooting
  7. Code (lengkap)
  8. Kesimpulan & CTA

1. Fungsi singkat program

Program YMMC100 otomatis mengunggah hasil count PID dari Excel ke SAP. Alur utamanya:

  • Upload file Excel (.xls) ke internal table dengan ALSM_EXCEL_TO_INTERNAL_TABLE.
  • Mapping kolom Excel ke struktur lt_data.
  • Validasi master data (material, dokumen PID, status already-counted).
  • Tampilkan hasil di ALV untuk review user.
  • Jika OK, panggil BAPI_MATPHYSINV_COUNT untuk post count.

2. Struktur source

Program utama memanggil beberapa include:

  • YMMC100_TOP : type, data deklarasi, GUI objects
  • YMMC100_SEL : selection screen & F4
  • YMMC100_F01 : status screen & user command
  • YMMC100_F02 : read excel & validation
  • YMMC100_F03 : ALV display setup
  • YMMC100_F04 : posting ke BAPI

3. Penjelasan tiap include

Catatan teknis singkat: Kode ini menggunakan ALSM_EXCEL_TO_INTERNAL_TABLE sehingga cocok untuk file .xls klasik. Untuk .xlsx gunakan cl_fdt_xl_spreadsheet atau sejenis.

4. Format Excel yang diharapkan

Kolom (mulai dari kolom A) minimal:

  • IBLNR (Physical Inv Doc)
  • GJAHR (Fiscal year)
  • XLDAT (Count date) — format: DD-MM-YYYY atau sesuai parsing di kode
  • ZEILI (Item)
  • MATNR (Material)
  • CHARG (Batch)
  • MENGE (Entry count)
  • MEINS (UoM)
  • XNULL (Zero-count indicator — optional)

Header di baris 1, data mulai baris 2 (default p_line = 2).

5. Alur proses (detail)

  1. User pilih file → tekan READ.
  2. Program baca Excel → mapping ke ls_data.
  3. Validasi material (MAKT), dokumen PID (IKPF), dan status item (ISEG-xzael).
  4. Jika ada error, diberi ikon error dan message di ALV.
  5. User review di ALV → tekan POST untuk upload tiap dokumen via BAPI.

6. Best practices & troubleshooting

  • Jika user pakai .xlsx, migrasi ke cl_fdt_xl_spreadsheet.
  • Pastikan conversion ALPHA sesuai untuk material dan dokumen.
  • Tampilkan semua pesan BAPI saat error untuk debug yang lengkap.
  • Test di sandbox/QAS sebelum produksi.

7. Code (lengkap — copy-paste ready)

Paste semua block di bawah ke program & include sesuai nama.

Program utama: YMMC100

&*&---------------------------------------------------------------------*&
&*& Report YMMC100
&*&---------------------------------------------------------------------*&
&*&---------------------------------------------------------------------*&
REPORT ymmc100.

INCLUDE ymmc100_top.
INCLUDE ymmc100_sel.
INCLUDE ymmc100_f01.
INCLUDE ymmc100_f02.
INCLUDE ymmc100_f03.
INCLUDE ymmc100_f04.

START-OF-SELECTION.
  CALL SCREEN 100.

Include: YMMC100_TOP

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_TOP
&*&---------------------------------------------------------------------*&
TYPES:
  BEGIN OF ty_excel,
    iblnr TYPE ikpf-iblnr,
    gjahr TYPE ikpf-gjahr,
    xldat TYPE char30,
    zeili TYPE iseg-zeili,
    matnr TYPE matnr,
    charg TYPE charg_d,
    menge TYPE menge_d,
    meins TYPE meins,
    xnull TYPE iseg-xnull,
  END OF ty_excel,

  BEGIN OF ty_data,
    icons LIKE icon-id,
    snote TYPE char255,
    ccell TYPE lvc_t_scol,
    cstyl TYPE lvc_t_styl,
    cline TYPE char4,

    iblnr TYPE ikpf-iblnr,
    gjahr TYPE ikpf-gjahr,
    zldat TYPE ikpf-zldat,
    zeili TYPE iseg-zeili,
    matnr TYPE matnr,
    maktx TYPE maktx,
    charg TYPE charg_d,
    menge TYPE menge_d,
    meins TYPE meins,
    xnull TYPE iseg-xnull,
  END OF ty_data,

  BEGIN OF zstab,
    field TYPE char10,
  END OF zstab.

DATA:
  lt_excel TYPE TABLE OF ty_excel,
  ls_excel TYPE ty_excel,
  lt_data  TYPE TABLE OF ty_data,
  ls_data  TYPE ty_data,
  stab     TYPE TABLE OF zstab,
  itab     TYPE TABLE OF  alsmex_tabline WITH HEADER LINE.

DATA:
  ob_container TYPE REF TO cl_gui_custom_container,
  ob_grid      TYPE REF TO cl_gui_alv_grid,
  lt_fieldcat  TYPE lvc_t_fcat,
  ls_fieldcat  LIKE LINE OF lt_fieldcat,
  is_lyout     TYPE lvc_s_layo,
  lt_message   TYPE TABLE OF bdcmsgcoll,
  ls_message   LIKE LINE OF lt_message,
  ld_mode      TYPE c VALUE 'N'.

DATA:
  zz_pid   TYPE char80,
  lv_matnr TYPE matnr18.

DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.
*       messages of call transaction
DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
*       error session opened (' ' or 'X')
DATA:   e_group_opened.
*       message texts
TABLES: t100.

Include: YMMC100_SEL

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_SEL
&*&---------------------------------------------------------------------*&

"Selection Screen
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
  PARAMETERS:
*    p_bukrs  TYPE bukrs OBLIGATORY,
    filename TYPE localfile MEMORY ID zfile,
    p_line   TYPE i DEFAULT 2,
    p_total  TYPE i.

SELECTION-SCREEN END OF SCREEN 101 .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      static    = 'X'
      mask      = '*.xls'
    CHANGING
      file_name = filename.

AT SELECTION-SCREEN OUTPUT.
  GET PARAMETER ID 'ZFILE' FIELD zz_pid.

  LOOP AT SCREEN.
    IF lt_data IS NOT INITIAL AND
    ( screen-name CS 'P_LINE' OR screen-name CS 'P_BUKRS' OR screen-name CS 'FILENAME').
      screen-input = 0.
    ELSE.
      screen-input = 1.
    ENDIF.

    IF screen-name CS 'P_TOTAL'.
      screen-input = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

Include: YMMC100_F01

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_F01
&*&---------------------------------------------------------------------*&
MODULE status_0100 OUTPUT.
  REFRESH stab.
  IF lt_data IS INITIAL.
    APPEND 'POST' TO stab.
    APPEND 'CLRD'  TO stab.
  ELSE.
    APPEND 'READ' TO stab.
  ENDIF.

  SET PF-STATUS 'PF100' EXCLUDING stab.
  SET TITLEBAR  'TL100' WITH 'Upload Count PID'.

  PERFORM initial_screen.
ENDMODULE.
*&*---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&*---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CNCL'.
      LEAVE PROGRAM.
    WHEN 'READ'.
      CLEAR p_total.
      PERFORM read_excel USING filename '1' p_line '70' '65536'.
      DESCRIBE TABLE lt_data LINES p_total.
    WHEN 'CLRD'.
      REFRESH : lt_data, lt_excel.
    WHEN 'POST'.
      READ TABLE lt_data WITH KEY icons = '@0A@' TRANSPORTING NO FIELDS.
      IF sy-subrc = 0.
        MESSAGE 'Please check your input' TYPE 'S' DISPLAY LIKE 'E'.
      ELSE.
        PERFORM post_count_pid.
      ENDIF.

  ENDCASE.
ENDMODULE.

Include: YMMC100_F02

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_F02
&*&---------------------------------------------------------------------*&
FORM read_excel USING p_file p_bcol p_brow p_ecol p_erow.
*  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = p_bcol
      i_begin_row             = p_brow
      i_end_col               = p_ecol
      i_end_row               = p_erow
    TABLES
      intern                  = itab[]
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  DATA lv_index TYPE i.
  FIELD-SYMBOLS <fs>.

  LOOP AT itab.
    MOVE itab-col TO lv_index.
    ASSIGN COMPONENT lv_index OF STRUCTURE ls_excel TO <fs>.
    MOVE itab-value TO <fs>.
    AT END OF row.
      CLEAR ls_data.
*      ls_data-icons = '@08@'.
      ls_data-icons = '@08@'.
      MOVE-CORRESPONDING ls_excel TO ls_data.

      ls_data-zldat = |{ ls_excel-xldat+6(4) }{ ls_excel-xldat+3(2) }{ ls_excel-xldat(2) }|.


*      CLEAR ls_check.

      PERFORM data_validation.

      APPEND ls_data TO lt_data.
      CLEAR ls_excel.
    ENDAT.
  ENDLOOP.
ENDFORM.

FORM data_validation.
  CLEAR lv_matnr.
  lv_matnr = |{ ls_data-matnr ALPHA = IN }|.
  SELECT SINGLE maktx FROM makt
    INTO ls_data-maktx
      WHERE matnr = lv_matnr AND spras = sy-langu.

  IF ls_data-maktx IS INITIAL.
    ls_data-icons = '@0A@'.
    ls_data-snote = 'Material not found'.
  ENDIF.

  ls_data-iblnr = |{ ls_data-iblnr ALPHA = IN }|.
  SELECT SINGLE iblnr FROM ikpf
    INTO @DATA(lv_iblnr)
      WHERE iblnr = @ls_data-iblnr AND gjahr = @ls_data-gjahr.
  IF lv_iblnr IS INITIAL.
    ls_data-icons = '@0A@'.
    ls_data-snote = 'PID Document not found'.
  ENDIF.



  SELECT SINGLE xzael FROM iseg
    INTO @DATA(lv_xzael)
      WHERE iblnr = @ls_data-iblnr AND gjahr = @ls_data-gjahr AND zeili = @ls_data-zeili.

  IF lv_xzael = 'X'.
    ls_data-icons = '@0A@'.
    ls_data-snote = 'PID Item already counted'.
  ENDIF.

  ls_data-iblnr = |{ ls_data-iblnr ALPHA = OUT }|.
  CLEAR: lv_iblnr, lv_xzael.
ENDFORM.

Include: YMMC100_F03

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_F03
&*&---------------------------------------------------------------------*&
FORM initial_screen.
  IF ob_container IS INITIAL.
    CREATE OBJECT ob_container
      EXPORTING
        container_name = 'CONTAINER'.

    CREATE OBJECT ob_grid
      EXPORTING
        i_parent = ob_container.
  ENDIF.

  PERFORM set_fieldcat.
  PERFORM set_lyout.
  PERFORM alv_displ_out.

  CALL METHOD ob_grid->refresh_table_display.
ENDFORM.

FORM set_fieldcat.
  REFRESH lt_fieldcat.
  PERFORM :
  append_fieldcat USING 'ICONS'    'Status'           'CHAR' '' '' '5'  '' 'X' 'LT_DATA' '1',
  append_fieldcat USING 'SNOTE'    'Message'          'CHAR' '' '' '40' '' 'X' 'LT_DATA' '1',
  append_fieldcat USING 'IBLNR'    'Phys. Inv. Doc.'  'CHAR' '' '' '10' '' 'X' 'IKPF' '1',
  append_fieldcat USING 'GJAHR'    'Year'             'NUMC' '' '' '40' '' 'X' 'IKPF' '1',
  append_fieldcat USING 'ZLDAT'    'Count Date'       'DATS' '' '' '40' '' '' 'IKPF' '1',
  append_fieldcat USING 'ZEILI'    'Item'             'NUMC' '' '' '40' '' '' 'ISEG' '1',
  append_fieldcat USING 'MATNR'    'Material'         'CHAR' '' '' '40' '' '' 'ISEG' '1',
  append_fieldcat USING 'MAKTX'    'Description'      'CHAR' '' '' '40' '' '' 'LT_DATA' '1',
  append_fieldcat USING 'CHARG'    'Batch Number'     'CHAR' '' '' '40' '' '' 'ISEG' '1',
  append_fieldcat USING 'MENGE'    'Entry Count'      'QUAN' 'MEINS' '' '40' '' '' '' '1',
  append_fieldcat USING 'MEINS'    'Entry Uom'        'UNIT' '' '' '40' '' '' '' '1',
  append_fieldcat USING 'XNULL'    'Zero Count Ind'   'CHAR' '' '' '40' '' '' '' '1'
        .

*  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
*    EXPORTING
*      i_structure_name = 'ZSFIC001'
*    CHANGING
*      ct_fieldcat      = lt_fieldcat.

ENDFORM.

FORM append_fieldcat USING p_fname p_fdesc p_dtype p_qfield p_cfield p_olen p_sum p_key p_tabname p_act.
  DATA irows TYPE i.
  CLEAR irows.

  DESCRIBE TABLE lt_fieldcat LINES irows.
  irows = irows + 1.
  CLEAR ls_fieldcat.
  IF p_fname = 'ICONS'.
    ls_fieldcat-icon = 'X'.
    ls_fieldcat-just = 'C'.
  ENDIF.
  ls_fieldcat-col_pos    = irows.
  ls_fieldcat-key        = p_key.
  ls_fieldcat-fieldname  = p_fname.
  ls_fieldcat-scrtext_l  = p_fdesc.
  ls_fieldcat-scrtext_m  = p_fdesc.
  ls_fieldcat-scrtext_s  = p_fdesc.
  ls_fieldcat-datatype   = p_dtype.
  ls_fieldcat-qfieldname = p_qfield.
  ls_fieldcat-cfieldname = p_cfield.
  ls_fieldcat-outputlen  = p_olen.
  ls_fieldcat-do_sum     = p_sum.
  ls_fieldcat-tabname    = p_tabname.

  APPEND ls_fieldcat TO lt_fieldcat.
ENDFORM.

FORM set_lyout .
  CLEAR is_lyout.
  is_lyout-zebra        = 'X'.
  is_lyout-cwidth_opt   = 'X'.
  is_lyout-box_fname    = 'ZBOX'.
*  is_lyout-no_rowins    = 'X'.
  is_lyout-stylefname   = 'CSTYL'.
  is_lyout-info_fname   = 'CLINE'.
  is_lyout-ctab_fname   = 'CCELL'.
ENDFORM.

FORM alv_displ_out.
  CALL METHOD ob_grid->set_table_for_first_display
    EXPORTING
*     is_variant                    = is_varnt      "DISVARIANT
      i_save                        = 'A'           "CHAR1 - X:Global - U:User - A:All - Space:No
      i_default                     = 'X'           "CHAR1 - X:Allowed - Space:not
      is_layout                     = is_lyout      "LVC_S_LAYO
*     is_print                      = is_print      "LVC_S_PRNT
*     it_toolbar_excluding          = it_excld      "UI_FUNCTIONS
    CHANGING
      it_outtab                     = lt_data
      it_fieldcatalog               = lt_fieldcat      "LVC_T_FCAT
*     it_sort                       = it_sort       "LVC_T_SORT
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
ENDFORM.

Include: YMMC100_F04

&*&---------------------------------------------------------------------*&
&*& Include          YMMC100_F04
&*&---------------------------------------------------------------------*&
DATA:
  physinventory	      TYPE ikpf-iblnr,
  fiscalyear          TYPE ikpf-gjahr,
  percentage_variance	TYPE iikpf-abwei,
  count_date          TYPE iikpf-zldat,

  lt_items            TYPE TABLE OF bapi_physinv_count_items,
  ls_items            TYPE bapi_physinv_count_items,
  lt_return	          TYPE TABLE OF	bapiret2,
  ls_return	          TYPE bapiret2.

FORM post_count_pid.

  DATA(xhead) = lt_data.
  SORT xhead BY iblnr gjahr.

  DELETE ADJACENT DUPLICATES FROM xhead COMPARING iblnr gjahr.

  LOOP AT xhead INTO DATA(ls_head).
    REFRESH : lt_items, lt_return.
    CLEAR ls_data.
    LOOP AT lt_data INTO ls_data
      WHERE iblnr = ls_head-iblnr AND gjahr = ls_head-gjahr.
      CLEAR: ls_items, lv_matnr.
      lv_matnr = |{ ls_data-matnr ALPHA = IN }|.
      ls_items-item       = ls_data-zeili.
      ls_items-material   = |{ ls_data-matnr ALPHA = IN }|.
*      ls_items-material_long = |{ ls_data-matnr ALPHA = IN }|.
      ls_items-batch      = ls_data-charg.
      ls_items-entry_qnt  = ls_data-menge.
      ls_items-entry_uom  = |{ ls_data-meins ALPHA = IN }|.
      ls_items-zero_count = ls_data-xnull.
      APPEND ls_items TO lt_items.
      CLEAR ls_data.
    ENDLOOP.

*    BREAK-POINT.
    physinventory = |{ ls_head-iblnr ALPHA = IN }|.
    fiscalyear    = ls_head-gjahr.
    count_date    = ls_head-zldat.

    CALL FUNCTION 'BAPI_MATPHYSINV_COUNT'
      EXPORTING
        physinventory = physinventory
        fiscalyear    = fiscalyear
*       PERCENTAGE_VARIANCE       =
        count_date    = count_date
      TABLES
        items         = lt_items
        return        = lt_return
*       SERIALNUMBERS =
*       EXTENSIONIN   =
*       ITEMS_CWM     =
      .

    CLEAR ls_return.
    READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
    IF sy-subrc = 0.
      DELETE lt_return WHERE number = 724.
      CLEAR ls_return.
      READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
      ls_data-snote = ls_return-message.
      ls_data-icons = '@0A@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      ls_data-snote = 'PID Counted'.
      ls_data-icons = '@5Y@'.
    ENDIF.

    MODIFY lt_data FROM ls_data TRANSPORTING snote icons
      WHERE iblnr = ls_head-iblnr AND gjahr = ls_head-gjahr.
    CLEAR ls_head.
  ENDLOOP.
ENDFORM.

Output Program

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.

Wednesday, 1 October 2025

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 — Panduan Lengkap

Di episode ini kita bahas cara mengamankan hasil CDS menggunakan Data Control Language (DCL), integrasinya dengan PFCG / role-based conditions, bagaimana menggunakan annotation @AccessControl.authorizationCheck, contoh implementasi, serta langkah pengujian. Tujuannya: memastikan user hanya melihat data yang mereka berhak akses.

Ringkasan konsep

  • CDS sendiri tidak otomatis memfilter baris — untuk row-level security kita pakai DCL (define role & grant rule) bersama annotation @AccessControl.authorizationCheck: #CHECK pada CDS.
  • DCL didefinisikan di file access control (.dcl) dan berisi role yang melakukan grant select on <cds> dengan kondisi.
  • Untuk integrasi dengan PFCG (role-based conditions), DCL mendukung pemetaan kondisi yang diisi lewat PFCG sehingga admin Basis/Security bisa mengelola nilai kondisi per role/user. :contentReference[oaicite:0]{index=0}

1) Annotation di CDS — aktifkan pemeriksaan DCL

Untuk mengaktifkan DCL pada sebuah CDS view, tambahkan annotation berikut di definisi CDS:

@AccessControl.authorizationCheck: #CHECK
define view ZCDS_SALES_CONS
  as select from ...
{ ... }

Dengan #CHECK sistem akan menerapkan aturan DCL (jika ada) saat CDS diakses baik lewat ABAP Open SQL, OData, maupun Data Preview (tergantung context). Jika annotation tidak ada, nilai default biasanya #NOT_REQUIRED. :contentReference[oaicite:1]{index=1}

2) Struktur DCL — konsep & contoh (pattern)

DCL berisi definisi role dan aturan grant. Berikut contoh pola umum (template) yang sering dipakai — sesuaikan nama object dan field dengan sistem Anda:

-- File: ZDCL_SALES.dcl
define role ZDCL_SALES {
  grant select on ZCDS_SALES_CONS
    where sales_org = $session.user_sales_org;   -- contoh placeholder
}

Catatan: variabel $session.* pada contoh di atas adalah ilustrasi. Dalam praktik yang umum, Anda dapat menggunakan pfcg_condition atau inheritance untuk memetakan kondisi dari PFCG ke DCL (lihat contoh berikut). Untuk sintaks dan opsi lengkap, rujuk dokumentasi SAP. :contentReference[oaicite:2]{index=2}

3) Contoh DCL menggunakan PFCG condition (pattern aman untuk production)

Cara populer: simpan daftar perusahaan / org unit di kondisi PFCG (role) lalu DCL memanggil kondisi itu — sehingga admin cukup assign role di PFCG tanpa ubah DCL. Contoh pattern (template):

-- File: ZDCL_SALES.dcl
define role ZDCL_SALES {
  grant select on ZCDS_SALES_CONS
    where company in pfcg_condition( 'ZCOND_COMPANY' );  -- ambil nilai dari PFCG condition 'ZCOND_COMPANY'
}

Dengan pendekatan ini, security admin membuat condition ZCOND_COMPANY di PFCG dan menetapkan nilai perusahaan (contoh: 1000,2000) ke role; DCL akan menggunakan nilai tersebut untuk memfilter baris. Ini memisahkan concern developer (kode) dan admin (data akses). :contentReference[oaicite:3]{index=3}

4) Contoh lengkap alur implementasi (step-by-step)

  1. Buat/ubah CDS Consumption View dan tambahkan annotation: @AccessControl.authorizationCheck: #CHECK.
  2. Buat DCL file (ABAP: New → Core Data Services → Access Control). Di dalamnya definisikan role dan aturan grant sebagaimana contoh di atas.
  3. Jika pakai PFCG conditions: buat condition di PFCG (Transaction PFCG → Role → Tab: Menu/Authorization → Conditions / Parameterization; admin mengisi nilai kondisi seperti daftar company codes atau plant).
  4. Transport & Activate: activate CDS & DCL (Ctrl+F3). Pastikan DCL ter-transport ke target system sesuai landscape.
  5. Assign PFCG role ke user atau ke group yang relevan.
  6. Test: login sebagai user A (yang punya company X) → query CDS (data preview / OData / ABAP SELECT) → hanya lihat baris company X. Login sebagai user B → lihat baris company Y. Lakukan juga test tanpa role untuk pastikan akses terblokir. :contentReference[oaicite:4]{index=4}

5) Testing & verifikasi

  • Data Preview di ADT: untuk DCL yang menggunakan PFCG, Data Preview di Eclipse tidak selalu menampilkan hasil sesuai user lain — gunakan user di system (atau debug session) untuk memverifikasi behavior sebenarnya.
  • ABAP SELECT: panggil CDS dari ABAP sebagai user target dan lihat apakah hasil terfilter sesuai DCL.
  • OData / Fiori: akses endpoint OData sebagai user target; cek /$metadata dan query collection (gunakan Postman atau browser) untuk memastikan row-level filtering jalan.
  • SU53 & ST01: jika akses gagal, gunakan SU53 untuk cek missing authorization/failed checks; gunakan trace jika perlu.

6) Advanced: inheritance & role composition

DCL mendukung inheritance dan komposisi role — mis. Anda dapat INHERIT kondisi dari role lain, atau membuat role yang mewarisi kondisi entitas lain sehingga mempermudah reuse aturan keamanan. Ini berguna ketika organisasi punya struktur role yang kompleks. Untuk detail syntax advanced lihat dokumentasi DCL (DEFINE ROLE variants). :contentReference[oaicite:5]{index=5}

7) Best practices & checklist

  • Gunakan @AccessControl.authorizationCheck: #CHECK pada CDS yang berisi data sensitif — jangan andalkan UI saja.
  • Pisahkan developer & admin tasks: definisi DCL di repo git/transport, nilai kondisi di-manage oleh admin (PFCG).
  • Dokumentasikan tiap rule: tujuan, fields yang dipakai, mapping ke PFCG condition.
  • Minimal privilege: buat rule seketat perlu (least privilege).
  • Uji di environment non-prod dengan user-role berbeda sebelum deploy ke production.
  • Perhatikan performance: kondisi kompleks di DCL dapat mempengaruhi runtime; optimalkan field index & pushdown di HANA jika perlu.
Ringkasan:
DCL adalah mekanisme standar untuk row-level security pada CDS. Gunakan @AccessControl.authorizationCheck: #CHECK pada CDS, definisikan role & grant di file DCL, dan bila perlu gunakan integrasi pfcg_condition agar admin bisa mengelola nilai kondisi lewat PFCG. Selalu test behavior dengan user nyata dan dokumentasikan aturan secara jelas.

➡️ Next (Episode 11): Performance & Best Practice untuk CDS — tips indexing, filter pushdown, menghindari pitfall, dan tools monitoring (ST05, SQL Monitor).

ABAP CDS View Part 9 : CDS Analytical — Fact, Dimension & Annotation

CDS Analytical: Fact & Dimension untuk Reporting di SAP S/4HANA

CDS Analytical — Fact, Dimension & Annotation untuk Reporting

Di episode ini kita membahas CDS Analytical: bagaimana merancang CDS sebagai sumber data analitik (fact & dimension), anotasi yang umum dipakai untuk analytical/embedded analytics, serta cara mengkonsumsi hasilnya di Fiori atau SAP Analytics Cloud (SAC).

1. Konsep: Fact vs Dimension

  • Fact: berisi ukuran (measures) numerik yang bisa di-aggregate—misalnya jumlah penjualan, quantity, revenue.
  • Dimension: konteks atau atribut untuk memotong/menyaring fact—mis. customer, material, time, region.
  • Di model CDS Analytical kita biasanya memisahkan view menjadi fact view (menampung measures) dan beberapa dimension view untuk atribut.

2. Kenapa pisah Fact & Dimension?

  • Memudahkan reuse: dimensi bisa dipakai oleh banyak faktur/kueri.
  • Performance: view analytical dapat dioptimalkan untuk agregasi dan push-down ke HANA.
  • Compatibility: memudahkan konsumsi oleh tools analitik (SAC, Fiori Analytical, atau reporting engine).

3. Annotation Analytic yang sering dipakai (konsep)

Beberapa annotation di CDS berguna untuk menandai bahwa view ini dimaksudkan untuk analytic/query dan untuk mengidentifikasi measures vs dimensions. Contoh umum (konsep, cek ADT SAP doc untuk variant lengkap):

AnotasiTujuan
@VDM.viewType: #ANALYTICALMenandai view sebagai analytical/consumption type.
@Analytics.query: trueMengindikasikan view dapat dipakai sebagai query/analytical dataset.
@DefaultAggregate / agregasiMenentukan fungsi agregasi default untuk field numeric (sum, avg).
@Semantics.amount / @Semantics.unitOfMeasureMenandakan field sebagai amount dan unit (penting untuk pemformatan/UOM).
@UI.lineItem / @UI.selectionFieldUI hints untuk Fiori Elements Analytical apps.

Catatan: detail nama annotation bisa berbeda-beda versi SAP; gunakan ADT/Help untuk memastikan nama dan parameter yang tepat.

4. Contoh Arsitektur Sederhana

Contoh pattern yang sering dipakai:

  1. Dimension Material — CDS yang expose atribut material (material id, description, group).
  2. Dimension Customer — CDS yang expose customer attributes (id, name, region).
  3. Fact Sales — CDS yang mengambil transaksi penjualan (header/item) dan menyediakan measures seperti NetValue, Quantity.
  4. Consumption / Analytical View — menggabungkan fact + dimension (via association/join) dan menandainya sebagai consumption/analytical untuk reporting.

5. Contoh CDS (pattern) — Dimension + Fact + Consumption

Berikut contoh sederhana (kode contoh; sesuaikan nama tabel/field dengan sistem Anda):

-- Dimension: Material
@AbapCatalog.sqlViewName: 'ZV_DIM_MAT'
@EndUserText.label: 'Dimension Material'
define view ZCDS_DIM_MATERIAL
  as select from mara
{
  key matnr      as MaterialID,
      matkl      as MaterialGroup,
      mtart      as MaterialType
}

-- Dimension: Customer (contoh)
@AbapCatalog.sqlViewName: 'ZV_DIM_CUST'
@EndUserText.label: 'Dimension Customer'
define view ZCDS_DIM_CUSTOMER
  as select from kna1
{
  key kunnr     as CustomerID,
      name1     as CustomerName,
      regio     as Region
}

-- Fact: Sales (mengumpulkan measures)
@AbapCatalog.sqlViewName: 'ZV_FACT_SALES'
@EndUserText.label: 'Fact Sales'
define view ZCDS_FACT_SALES
  as select from vbap as I
    inner join vbak as H on I.vbeln = H.vbeln
{
  key H.vbeln            as SalesDoc,
      I.posnr            as ItemNo,
      I.matnr            as MaterialID,
      H.kunnr           as CustomerID,
      sum( I.netwr )     as TotalNetValue,   -- measure (aggregate)
      sum( I.kwmeng )    as TotalQuantity
}
-- Catatan: penulisan agregasi / grouping bisa membutuhkan sintaks 'group by' tergantung pada versi CDS.

Jika Anda perlu agregasi kompleks (rolling, windowing), pertimbangkan CDS Table Function/AMDP untuk logika yang lebih fleksibel.

6. Membuat Consumption / Analytical View

Setelah punya fact + dimension, biasanya dibuat consumption view yang menghubungkan keduanya dan memberikan annotation untuk analytic consumption.

@AbapCatalog.sqlViewName: 'ZV_CDS_SALES_CONS'
@EndUserText.label: 'Consumption: Sales for Analytics'
@VDM.viewType: #ANALYTICAL
@Analytics.query: true

define view ZCDS_SALES_ANALYTICS
  as select from ZCDS_FACT_SALES as F
    left outer join ZCDS_DIM_MATERIAL   as M  on F.MaterialID = M.MaterialID
    left outer join ZCDS_DIM_CUSTOMER   as C  on F.CustomerID = C.CustomerID
{
  key F.SalesDoc,
      F.ItemNo,
      M.MaterialID,
      M.MaterialGroup,
      C.CustomerID,
      C.CustomerName,
      F.TotalNetValue    as NetValue    @Semantics.amount: true,
      F.TotalQuantity    as Quantity
}

7. Aktivasi & Konsumsi Reporting

  • Aktifkan semua view di ADT (Ctrl+F3).
  • Jika pakai Fiori Analytical atau Fiori Elements, tambahkan UI annotation (@UI.lineItem, @UI.selectionField) pada consumption view agar list/filters terbentuk otomatis.
  • Untuk SAC: expose consumption view via OData (lihat Episode 8) atau buat connection langsung ke S/4HANA sebagai source (tergantung arsitektur landscape).
  • Test metadata (/…/$metadata) agar tools analitik dapat membaca measures & dimensions dengan benar.

8. Praktik Terbaik (Best Practices)

  • Pisahkan fact & dimension untuk reuse dan kejelasan model.
  • Tandai measures dengan semantic annotation (amount, currency, unit) agar tools men-format angka dengan benar.
  • Kendalikan jumlah field yang di-expose ke consumption view — hanya field yang dibutuhkan untuk analitik.
  • Uji performa pada HANA: pastikan filter pushdown dan agregasi terjadi di DB untuk skala besar.
  • Gunakan table function / AMDP untuk scenario agregasi kompleks atau perhitungan windowing.
  • Document setiap measure: definisi, sumber, dan periode (mis. net value in document currency).
Ringkasan:
CDS Analytical membantu membuat model data yang rapi untuk reporting: fact menyimpan measures, dimension menyimpan atribut, dan consumption view menggabungkan keduanya untuk consumption oleh Fiori atau tools analitik seperti SAC. Gunakan annotation analytic & semantic agar hasil konsumsi tepat, dan selalu cek performa & metadata sebelum dipakai produksi.

➡️ Next (Episode 10): Authorization & DCL — mengamankan CDS dengan Data Control Language, role-based access, dan contoh implementasi DCL.

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

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