Transform Map

ETL Transform Map mendefinisikan bagaimana data yang diekstrak ditransformasi dan dimuat ke dalam DocType target. Ini mencakup pemetaan kolom, transformasi nilai, script logika bisnis, dan aturan upsert.

Referensi Kolom

Konfigurasi Dasar

Kolom Tipe Wajib Deskripsi
Transform Name Data Ya Pengenal unik untuk transform map ini
Target DocType Link Ya DocType untuk membuat/memperbarui record
Application Link Ya Aplikasi tempat transform map ini berada
Active Check Tidak Aktifkan/nonaktifkan transform ini (default: tidak dicentang)

Kontrol Operasi

Kolom Tipe Wajib Deskripsi
Allow Insert Check Tidak Izinkan pembuatan record baru
Allow Update Check Tidak Izinkan pembaruan record yang sudah ada
Skip Business Logic Check Tidak Abaikan document event dan trigger
Update Modified Fields Check Tidak Perbarui timestamp modified (ketika Skip Business Logic diaktifkan)

Catatan: Salah satu dari Allow Insert atau Allow Update harus diaktifkan.

Pemetaan Kolom

Tabel Field Map mendefinisikan bagaimana kolom sumber dipetakan ke kolom target DocType:

Kolom Tipe Wajib Deskripsi
Source Path Data Ya Nama kolom sumber atau ekspresi JSONPath
Target Field Data Ya Nama kolom DocType target
Coalesce Check Tidak Gunakan kolom ini untuk pencocokan record (upsert)
Default Value Data Tidak Nilai fallback jika kolom sumber kosong

Pemetaan Nilai

Tabel Value Map mentransformasi nilai sumber ke nilai target:

Kolom Tipe Wajib Deskripsi
Source Field Data Ya Kolom sumber yang akan diperiksa
Source Value Data Ya Nilai sumber yang akan dicocokkan
Target Field Data Ya Kolom target yang akan diatur
Target Value Data Ya Nilai yang akan diatur dalam kolom target

Script Transform

Script transform adalah potongan kode Python yang berjalan pada tahap-tahap berbeda dari proses transformasi. Semua script memiliki akses ke objek result untuk mengembalikan nilai dan mengatur flag.

On Start Script

Tujuan: Berjalan sekali sebelum seluruh proses transformasi dimulai.

Variabel yang Tersedia:

  • transform_map (dict): Konfigurasi transform map lengkap
  • import_batch (dict): Detail batch impor

Kemampuan Script:

  • Atur result['skip'] = True untuk melewati seluruh transformasi
  • Inisialisasi counter atau setup struktur data
  • Validasi batch sebelum pemrosesan

Contoh:

# Skip transformation if too many records
if import_batch['rows'] > 10000:
    result['skip'] = True
    result['skip_reason'] = 'Batch too large for processing'

mantera.log_info("ETL", f"Starting transform for {import_batch['rows']} rows")

On Before Script

Tujuan: Berjalan sebelum setiap baris ditransformasi.

Variabel yang Tersedia:

  • source_record (dict): Data sumber mentah untuk baris saat ini
  • result (dict): Objek hasil yang dapat diubah

Kemampuan Script:

  • Atur result['skip'] = True untuk melewati baris saat ini
  • Tambah/modifikasi kolom melalui result['set_values']
  • Terapkan logika kondisional dan pembersihan data

Contoh:

# Skip rows with invalid email
if not source_record.get('email') or '@' not in source_record.get('email', ''):
    result['skip'] = True
    result['skip_reason'] = 'Invalid email address'
else:
    # Set values for field mapping
    result['set_values'] = {}
    result['set_values']['status'] = 'Active' if source_record.get('active') else 'Inactive'
    result['set_values']['full_name'] = f"{source_record.get('first_name', '')} {source_record.get('last_name', '')}"

On After Script

Tujuan: Berjalan setelah setiap baris berhasil ditransformasi dan disimpan.

Variabel yang Tersedia:

  • source_record (dict): Data sumber asli
  • doc_values (dict): Nilai akhir yang disimpan
  • doc_name (str): Nama dokumen yang dibuat/diperbarui
  • action (str): "insert", "update", atau "skip"

Contoh:

# Log successful operations
if action == "insert":
    mantera.log_info("ETL Success", f"Created new customer: {doc_name}")
elif action == "update":
    mantera.log_info("ETL Success", f"Updated customer: {doc_name}")

On Complete Script

Tujuan: Berjalan sekali setelah seluruh proses transformasi selesai.

Variabel yang Tersedia:

  • stats (dict): Statistik akhir dengan kunci: inserts, updates, skipped, errors

Contoh:

total_processed = stats['inserts'] + stats['updates']
result['summary'] = f"Processed {total_processed} records, {stats['errors']} errors"

# Send notification for high error rates
if stats['errors'] > total_processed * 0.1:
    frappe.sendmail(
        recipients=['admin@company.com'],
        subject='ETL High Error Rate',
        message=f"ETL job completed with {stats['errors']} errors out of {total_processed + stats['errors']} records"
    )

Logika Upsert

Record dicocokkan untuk update menggunakan kolom Coalesce dari Field Map:

  1. Insert: Jika tidak ada record yang cocok ditemukan dan Allow Insert diaktifkan
  2. Update: Jika record yang cocok ditemukan dan Allow Update diaktifkan
  3. Skip: Jika tidak ada operasi yang diizinkan atau kedua flag dinonaktifkan

Aksi

Run Transform

Meluncurkan dialog untuk memilih ETL Import Batch untuk transformasi. Membuat ETL Transform Run dengan pencatatan event yang detail.

Contoh Penggunaan

Contoh Impor Customer

Transform Name: Customer Data Import
Target DocType: Customer
Allow Insert: ✓
Allow Update: ✓

Field Map:
- Source: customer_id → Target: customer_code (Coalesce: ✓)
- Source: company_name → Target: customer_name
- Source: email → Target: email_id
- Source: phone → Target: mobile_no

Value Map:
- Source Field: status, Source Value: A → Target Field: disabled, Target Value: 0
- Source Field: status, Source Value: I → Target Field: disabled, Target Value: 1

Validasi Script

Script transform divalidasi untuk memastikan keamanan:

  • Statement import tidak diizinkan
  • Tidak ada definisi fungsi def
  • Tidak ada statement return
  • Akses hanya ke method script yang disetujui
  • Harus menggunakan objek result untuk output

Discard
Save

On this page

Review Changes ← Back to Content
Message Status Space Raised By Last update on