Skip to main content

Salesforce.com Trigger : Generate Auto Running Number

Salesforce memiliki tipe data berupa autonumber, yang akan terisi otomatis dengan nilai yang selalu bertambah (auto increment). Ternyata ini tidak hanya untuk field Name, tapi kita juga bisa menambah baru. Kita juga bisa menentukan berapa jumlah karakter dari nilai autonumber yang kita inginkan. Misalnya kita ingin field itu berisi 5 karakter, maka kita cukup atur {00000} dan nilainya nanti akan menjadi 00001, 00002 dst. Kita bahkan bisa menggabungkan dengan huruf tertentu, misal X-{00}, akan menjadi X-01 dst. Atau bahkan dengan tahun, bulan dan tanggal record tersebut dibuat, misal {YYYY}/{MM}/{000} akan menghasilkan 2012/11/001 dst.

Meskipun demikian, ada beberapa kekurangan yang belum aku temukan solusinya selain dengan membuat trigger untuk menghasilkan nilai nomor urut (running number) tersebut. Berikut beberapa kasus yang sepertinya tidak bisa dihandle hanya dengan field auto number tersebut.

  1. Nomor urut yang perlu di-reset secara berkala, misal per bulan atau per tahun.
  2. Nomor urut yang unik untuk setiap data tertentu. Misal, nomor urut Account berdasar huruf awal.
  3. Nomor urut yang unik untuk setiap data terkait (lookup). Misal, nomor urut Invoice tiap Account punya urutan tersendiri.


Sebenarnya untuk setiap kasus manapun, algoritma dasarnya adalah standard.

  • Cari nomor urut terakhir
  • Increment angka
  • Format angka
  • Simpan data

Sebagai contoh, kita ingin menghasilkan nomor Invoice sendiri, tanpa menggunakan field autonumber yang standard. Object Invoice memiliki field sebagai berikut:
* Name - Text(80)
* Account__c - Lookup (Account)
* Invoice_Date__c - Date
* Invoice_Type__c - Picklist(A, B, C)
* Month_Code__c - Formula (Year-Month of Invoice Date)
* Acc_Running_No__c - Number(10,0)

Field Name akan kita gunakan sebagai nomor Invoice, dan kita tidak ingin menggunakan standard autonumber, melainkan dengan Text. Tentu saja kita tidak mau user menginput sendiri nomor invoice karena mereka akan mengeluh ketika harus mengelola nomor urut sendiri. Jadi kita bantu dengan mengisi secara otomatis. Di sini kita batasi, bahwa nomor invoice akan digerenate khusus untuk record baru (insert) saja.

Kasus 1 : Nomor Invoice reset setiap tahun, berdasar Created Date

File: https://gist.github.com/4162169

Kasus 2 : Nomor Invoice reset setiap bulan, berdasar Invoice Date

Di sini kita akan menggunakan Month_Code__c untuk memudahkan query.
File: https://gist.github.com/4176831

Kasus 3 : Nomor Invoice setiap customer/account memiliki urutan sendiri

Nah di sini, aku merasa perlu menggunakan field Acc_Running_No__c untuk menyimpan nomor terakhir, karena agak sulit saat melakukan query dalam menentukan nomor terbesar File: https://gist.github.com/4203741
Masih banyak kasus lain tentunya, tapi setidaknya contoh-contoh sederhana di atas bisa memberi ide bagaimana membuat nomor sendiri.

Comments

Popular posts from this blog

PostGreSQL :: Hitung Umur

Ternyata untuk menghitung umur dari data yang disimpan di PostGreSQL sangat gampang. PostGreSQL sendiri sudah menyediakan fungsi yang mendukung. Beberapa fungsi yang bisa dipakai adalah AGE dan EXTRACT. AGE dipakai untuk menghitung umur dari sebuah data, dibandingkan dengan hari ini, atau dengan data lain (tipenya timestamp). Misal: age(timestamp '1980-09-27'), akan menghasilkan nilai (bertipe interval) "24 years 1 mon 25 days". Nah, kalau mau mengambil nilai tahunnya saja, tinggal menggunakan EXTRACT Contoh: EXTRACT(year FROM AGE(timestamp '2001-09-27')), hasilnya akan jadi 24.

PHP :: Selisih Jam

Setelah kemarin kesulitan untuk melakukan increment ataupun decrement terhadap variabel waktu (date/time) di PHP, kali ini nemuin masalah untuk mencari selisih waktu (dari satu jam ke jam tertentu), yang perlu untuk ngitung lembur karyawan. Tadinya kepikiran untuk buat fungsi sendiri, yang flow -nya kira-kira begini: - masing-masing dipisah menjadi jam, menit, detik - bandingkan antara keduanya. - lakukan pengurangan terhadap masing-masing komponen (jam, menit dan detik) - gabungkan hasil perhitungan ... (selisih jam + selisih menit + selisih detik) Tapi waktu aku ingat kasus Next Date, ... muncul ide untuk menggunakan cara yang sama, yaitu memanfaatkan format UNIX timestamp, terus nyoba mencari selisihnya. TERNYATA BERHASIL !!! Flownya seperti ini: - masing-masing dipisah menjadi jam, menit,detik - ubah masing-masing ke format timestamp, gunakan fungsi mktime() - kurangkan kedua jam - hasilnya dibagi 60 (karena satuannya pakai menit), sementara selisih timestamp itu dalam detik Algori

Delphi :: Split String

Akhirnya ketemu juga cara untuk melakukan split string. (Terbiasa pakai PHP sih, yang sangat memanjakan dalam pengelolaan string.) Di sini memanfaatkan TStringList, unit Classes. // procedure untuk split string procedure Split (const Delimiter: Char; // delimiter charachter Input: string; // input string const Strings: TStrings) ; // list of string result begin Assert(Assigned(Strings)) ; Strings.Clear; Strings.Delimiter := Delimiter; Strings.DelimitedText := Input; end; // contoh pemakaian procedure TForm1.Button1Click(Sender: TObject) ; var A: TStringList; begin A := TStringList.Create; try Split(' ', 'your delphi guide', A) ; ShowMessage(a[0]) ; //your ShowMessage(a[1]) ; //delphi ShowMessage(a[2]) ; //guide finally A.Free; end; end; Source : http://delphi.about.com/cs/adptips2002/a/bltip1102_5.htm Wheew .. akhirnya. One step ahead!!