Skip to main content

Belajar ABAP Part 11: Smartforms

Belajar ABAP Part 11: Smartforms — Buat Form Cetak & Contoh Real Case (PO → PDF → Email)

Belajar ABAP Part 11: Smartforms — Buat Form Cetak & Contoh Real Case (PO → PDF → Email)

Ringkasan: Smartforms adalah tool SAP untuk membuat dokumen cetak (invoice, PO, delivery note) dengan UI desain tanpa banyak coding. Di artikel ini lo bakal belajar konsep Smartforms, komponennya, cara bind data, memanggil Smartform dari ABAP, convert OTF → PDF, dan contoh lengkap: mencetak Purchase Order (EKKO/EKPO) — simpan ke PDF & kirim via email (CL_BCS). Disertai best practice.

1. Apa itu Smartforms?

Smartforms adalah tool SAP yang menggantikan SAPscript untuk mendesain dokumen cetak. Keunggulan Smartforms:

  • Designer visual (pages, windows, nodes)
  • Mendukung table node untuk data berulang
  • Menghasilkan function module runtime otomatis
  • Mudah diekspor ke PDF/Spool

2. Komponen Utama Smartforms

Komponen penting yang harus diketahui:

  • Form Interface: deklarasi IMPORT PARAMETERS, TABLES, dan EXPORT.
  • Global Definitions: definisi struktur/variable global untuk form.
  • Pages & Windows: layout halaman (Main Window untuk body, Secondary Window untuk header/footer).
  • Nodes: Text Node, Table Node, Graphic Node.
  • Smart Styles: (SMARTSTYLE) untuk konsistensi font & style.

3. Alur Pembuatan Smartform (High level)

  1. Buka T-Code SMARTFORMS → Buat Smartform baru (mis. ZSMARTFORM_PO).
  2. Definisikan Form Interface (IMPORT params: PO number, TABLES: items table).
  3. Desain Pages → Window → letakkan Text Node (header) dan Table Node (items).
  4. Map field (binding): mis. di Text Node pakai &EKKO-EBELN&, di Table Node pakai &EKPO-MATNR&.
  5. Simpan & Activate form → generate function module runtime (gunakan SSF_FUNCTION_MODULE_NAME untuk dapatkan nama FM).
  6. Buat ABAP driver program untuk memanggil FM, convert OTF → PDF, dan/atau kirim email.
Note: Smartforms adalah dokumentasi/layout. Letakkan logic dan data retrieval di ABAP driver program; hindari coding kompleks di Smartform agar mudah dipelihara.

4. Contoh: Struktur Form Interface untuk PO

Misal kita definisikan interface Smartform ZSMARTFORM_PO seperti ini:


Import parameters:
  iv_ebeln      TYPE ekko-ebeln

Tables:
  it_ekpo       TYPE ekpo             " item table
  it_ekko       TYPE ekko OPTIONAL    " optional header (jika mau)
    

Di design, buat:

  • Header window: tampilkan data EKKO (EBELN, LIFNR, EKKO-BSART)
  • Main window / Table node: looping it_ekpo → tampilkan EKPO-EBELP, MATNR, MENGE, NETPR, nilai baris
  • Footer: subtotal, currency, signature

5. Binding Field di Smartform

Contoh dalam Text Node: &IT_EKKO-LIFNR& atau &IV_EBELN& (tergantung interface). Dalam Table Node gunakan field table: &IT_EKPO-MATNR&, &IT_EKPO-MENGE&, dst.

6. Memanggil Smartform dari ABAP — Driver Program (Contoh Lengkap)

Berikut contoh driver program lengkap untuk:

  1. Mengambil data PO header & items (EKKO/EKPO)
  2. Mengenerate Smartform menjadi OTF
  3. Mengonversi OTF → PDF (xstring)
  4. Menyimpan PDF ke folder aplikasi (opsional) dan mengirim email lampiran via CL_BCS

REPORT zsf_po_print_demo.

PARAMETERS: p_ebeln TYPE ekko-ebeln OBLIGATORY.

DATA: lv_formname   TYPE rs38l_fnam,
      lv_fm_name    TYPE rs38l_fnam,
      lt_ekpo       TYPE TABLE OF ekpo,
      ls_ekpo       TYPE ekpo,
      ls_ekko       TYPE ekko.

" 1. Ambil data header & items
SELECT SINGLE * FROM ekko INTO ls_ekko WHERE ebeln = p_ebeln.
IF sy-subrc <> 0.
  MESSAGE 'PO not found' TYPE 'E'.
  EXIT.
ENDIF.

SELECT * FROM ekpo INTO TABLE lt_ekpo WHERE ebeln = p_ebeln ORDER BY ebelp.

" 2. Dapatkan function module runtime Smartform
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
  EXPORTING
    formname = 'ZSMARTFORM_PO'
  IMPORTING
    fm_name  = lv_fm_name
  EXCEPTIONS
    OTHERS   = 1.
IF sy-subrc <> 0.
  MESSAGE 'Smartform not found or error' TYPE 'E'.
  EXIT.
ENDIF.

" 3. Panggil function module Smartform untuk menghasilkan OTF data
DATA: ls_control    TYPE ssfctrlop,
      ls_output     TYPE ssfcompop,
      ls_job_output TYPE ssfcompop.

ls_control-no_dialog = 'X'. " supress dialog
ls_output-preview   = 'X'. " preview (opsional)

CALL FUNCTION lv_fm_name
  EXPORTING
    control_parameters = ls_control
    output_options     = ls_output
    iv_ebeln           = p_ebeln
  TABLES
    it_ekko            = VALUE #( ( ls_ekko ) )
    it_ekpo            = lt_ekpo
  IMPORTING
    job_output_info    = ls_job_output
  EXCEPTIONS
    OTHERS             = 1.

" 4. Ambil OTF dan convert ke PDF (xstring)
DATA: lt_otf    TYPE STANDARD TABLE OF itcoo, " tipe OTF (implementasi system bisa berbeda)
      lv_pdf    TYPE xstring.

" Banyak runtime FM mengembalikan OTF di job_output_info-otfdata
lt_otf = ls_job_output-otfdata. " pastikan struktur ini ada di sistem lo

CALL FUNCTION 'CONVERT_OTF'
  EXPORTING
    format  = 'PDF'
  IMPORTING
    bin_file = lv_pdf
  TABLES
    otf      = lt_otf
  EXCEPTIONS
    OTHERS   = 1.

IF sy-subrc <> 0.
  MESSAGE 'Error converting OTF to PDF' TYPE 'E'.
  EXIT.
ENDIF.

" 5. (Opsional) Simpan PDF ke application server / local file
" contoh menyimpan xstring ke server file (sapis)
DATA: lv_filename TYPE string VALUE '/tmp/PO_' && p_ebeln && '.pdf'.

CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING' " (placeholder — actual FS write method depends on landscape)
  EXPORTING
    directory = '/tmp'
  TABLES
    filelist  = DATA(lt_dummy).

" Untuk menyimpan di application server gunakan OPEN DATASET / TRANSFER, atau untuk frontend gunakan GUI_DOWNLOAD.
" Contoh simpan ke frontend local PC:
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename = lv_filename
    filetype = 'BIN'
  CHANGING
    data_tab = DATA(lt_bin_tab)
  EXCEPTIONS
    OTHERS = 1.

" 6. Kirim PDF via email (CL_BCS) — menggunakan xstring
DATA: lo_send_request TYPE REF TO cl_bcs,
      lo_document     TYPE REF TO cl_document_bcs,
      lo_sender       TYPE REF TO if_recipient_bcs,
      lv_subject      TYPE so_obj_des VALUE |PO { p_ebeln }|,
      lv_recipient    TYPE adr6-smtp_addr VALUE 'receipient@example.com'.

" Buat send request
lo_send_request = cl_bcs=>create_persistent( ).

" Buat document (MIME) dari xstring PDF
lo_document = cl_document_bcs=>create_document(
                i_type    = 'PDF'
                i_text    = |Purchase Order { p_ebeln }|
                i_subject = lv_subject
                i_content = lv_pdf ).

" Tambah attachment (nama file)
cl_bcs=>set_document( lo_document ).
lo_send_request->set_document( lo_document ).

" Tambah recipient
lo_send_request->add_recipient( iv_address = lv_recipient ).

" Kirim
lo_send_request->send( i_with_error_screen = 'X' ).
COMMIT WORK.
    

Catatan penting tentang driver di atas:

  • Nama parameter FM yang dihasilkan oleh Smartform bisa berbeda. Selalu cek signature FM hasil generate (SE37) atau gunakan SSF_FUNCTION_MODULE_NAME untuk mendapatkan nama FM.
  • Beberapa runtime FM mengembalikan OTF di field berbeda; contoh di atas memakai job_output_info-otfdata. Jika struktur berbeda di sistem lo, cek output FM dan ambil tabel OTF yang benar.
  • Penyimpanan file dan download ke frontend tergantung landscape (application server vs frontend). Untuk user local gunakan CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD dengan table binari hasil convert.
  • Pengiriman email via CL_BCS memerlukan konfigurasi SAPconnect (SCOT) agar email bisa terkirim ke SMTP.

7. Export ke PDF & Pengiriman (Rangkuman teknis)

  1. Panggil FM Smartform (non-dialog) dengan control_parameters-no_dialog = 'X'.
  2. Ambil OTF output dari FM (job_output_info atau parameter otf).
  3. Gunakan CONVERT_OTF untuk menghasilkan xstring PDF (bin_file).
  4. Untuk kirim email, buat document BCS dengan content type 'PDF' dan lampirkan xstring.

8. Best Practice Smartforms

  • Pisahkan logic di ABAP driver program — Smartform fokus pada layout.
  • Gunakan SMARTSTYLE untuk konsistensi font/paragraph.
  • Hindari SELECT N+1: ambil semua data header & item sekaligus (bulk select).
  • Gunakan table node dengan header/footer subtotal bila perlu.
  • Uji printing di DEV/QA environment dengan berbagai data (short/long text, special chars, multi-currency).
  • Dokumentasikan setiap Smartform (purpose, owner, transport request).

9. Troubleshooting Umum

  • Blank page / missing fields: pastikan binding field sesuai nama parameter/tables yang dikirim dari ABAP.
  • Error FM signature: periksa FM runtime yang dihasilkan (SE37) untuk melihat parameter input/output.
  • OTF empty: periksa control_parameters & output_options saat panggil FM.
  • Email tidak terkirim: cek konfigurasi SCOT dan authorizations untuk user yang menjalankan pengiriman.

10. Contoh Real Case Tambahan — Menambahkan Logo & Bahasa Dinamis

- Logo: di Smartforms gunakan Graphic Node (upload image di SE78) lalu panggil di layout. - Bahasa Dinamis: kirim kode bahasa sebagai import parameter (iv_lang) lalu pakai kondisi/texte translation di Smartforms.

Tip: untuk dokumen resmi (faktur), selalu cek persyaratan format lokal (nomor faktur, detail PPN) dan konsultasi tim accounting sebelum deploy.

Kesimpulan

Smartforms adalah solusi teruji untuk membuat dokumen cetak di SAP. Workflow umumnya: desain Smartform → generate FM → panggil dari ABAP (driver) → konversi OTF→PDF → (opsional) kirim email. Fokuskan logika pada ABAP, gunakan Smartform untuk layout, dan selalu uji output di environment yang mirip production.

👉 Lanjut ke: Belajar ABAP Part 12: Enhancement & BADI (lanjutan) / Debugging Smartforms

Comments

Popular posts from this blog

How to Create a REST API in SAP ABAP — Step-by-step Guide

How to Create a REST API in SAP ABAP — Step-by-step Guide Summary: This tutorial shows how to build a REST API in SAP ABAP by creating a handler class, configuring SICF service, registering endpoints with cl_rest_router , implementing endpoint logic (example GET method), and testing the API. Based on an internal implementation reference. Why expose REST APIs from SAP? REST APIs allow SAP systems to integrate with web, mobile, and external services using standard HTTP and JSON payloads. Implementing REST endpoints in ABAP provides secure, reusable, and maintainable integration points for modern applications. Prerequisites Access to an SAP system with authorization to create classes (SE24) and SICF services (SICF). Familiarity with ABAP object-oriented concepts and basic SAP transaction codes. ABAP classes CL_REST_RESOURCE , CL_REST_ROUTER and utilities like /UI2/CL_JSON . High-level overview (4 steps) Create an API handler class (e.g. ZCL_API_HANDLER ). R...

SAP ABAP - User Exit Set Batch Characteristic Value In MIGO Goods Receipt

Customer Exit  :  MBCFC004 ( EXIT_SAPMM07M_004) Set Up Customer Exit for Classification of User-Defined Characteristics You use SAP enhancement MBCFC004 EXIT_SAPMM07M_004, which contains function module exit EXIT_SAPMM07M_004 to classify user-defined characteristics automatically during goods movements in Inventory Management. This is only possible for characteristics which are not assigned values during quality inspection. Requirements 1. The class of the batch to be classified must be known.  This means that a class must be assigned either to the material or at least to one batch of this material. 2. The exit call must be activated for the respective movement type in activity Activate batch classification during goods movements in IM using indicator 'Extended classification' . Open tcode OMC...

IT Asset Management Dengan PHP MySQL

Pada postingan kali saya akan share sebuah aplikasi IT Asset management yang fungsinya untuk memonitoring semua Asset khusus IT, contohnya : Laptop/komputer , Printer, Router, Hardisk, dll. Dalam aplkasi ini kita bisa mengetahui Asset IT posisinya dimana dan digunakan oleh siapa. untuk data-data yang dibutuhkan antara lain : 1. data kategori asset dalam menu ini kita bisa meng-input jenis2 kategory asset : tambah kategori asset : 2. data department 3. data karyawan 4. data department per karyawan 5. data asset location  6. data satuan asset dan untuk transaksi yang ada dalam aplikasi ini adalah,  1. create asset, pada menu create asset ini kita akan mengalokasikan sebuah asset ke karyawan/personnel tampilannya seperti berikut: setelah klik tombol save akan muncul seperti dibawah : untuk melihat detail asset yang sudah dibuat tadi, kita bisa pilih...