Belajar ABAP Part 11: Smartforms — Buat Form Cetak & Contoh Real Case (PO → PDF → Email)
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)
- Buka T-Code SMARTFORMS → Buat Smartform baru (mis.
ZSMARTFORM_PO
). - Definisikan Form Interface (IMPORT params: PO number, TABLES: items table).
- Desain Pages → Window → letakkan Text Node (header) dan Table Node (items).
- Map field (binding): mis. di Text Node pakai &EKKO-EBELN&, di Table Node pakai &EKPO-MATNR&.
- Simpan & Activate form → generate function module runtime (gunakan SSF_FUNCTION_MODULE_NAME untuk dapatkan nama FM).
- Buat ABAP driver program untuk memanggil FM, convert OTF → PDF, dan/atau kirim email.
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:
- Mengambil data PO header & items (EKKO/EKPO)
- Mengenerate Smartform menjadi OTF
- Mengonversi OTF → PDF (xstring)
- 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)
- Panggil FM Smartform (non-dialog) dengan
control_parameters-no_dialog = 'X'
. - Ambil OTF output dari FM (job_output_info atau parameter otf).
- Gunakan
CONVERT_OTF
untuk menghasilkanxstring
PDF (bin_file). - 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.
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
Post a Comment