Skip to main content

Posts

Showing posts with the label Apex

Salesforce : Debug Log untuk user System Terkait Email-to-Case

Belum lama ini ada proyek cukup intensif berkaitan dengan Case Management di platform Salesforce.com. Salesforce sendiri sudah memiliki fitur ini, yang masuk dalam produk Service Cloud, dan cukup banyak fasilitas yang tersedia. Salah satunya adalah Email-to-case, yang memungkinkan kita menerima keluhan/saran melalui email, dan secara otomatis system akan membuat record di object Case (standard object). Aku membuat trigger untuk object Case, yang akan mengupdate field tertentu berdasar data yang diinput. Ternyata, trigger yang aku buat tidak berfungsi dengan baik jika record Case dibuat dari Email-to-case. Padahal kalau dibuat secara manual (data entry), atau dibuat dari fitur Web-to-case, triggernya bisa berfungsi dengan baik.  Nah, aku coba debug, gak muncul di Debug Log. Ternyata yang user yang menjalankan peran saat proses Email-to-case adalah user "System", bukan user yang aku pakai. Pantas saja debug log gak ada isinya, karena bukan userku yang melakukannya. Pengaturan t...

Soal Test Class di Salesforce.com

Sumber gambar: force.com Aku adalah penganut falsafah "learning by doing", artinya lebih suka untuk praktek langsung daripada repot baca teori. Ini berlaku juga saat membeli barang baru, langsung utak-atik tanpa mau repot-repot membaca buku petunjuk penggunaan. Termasuk saat belajar pengembangan aplikasi di Salesforce.com (force.com). Seminggu pertama baca-baca dan mengikuti tutorial sangatlah membosankan, dan baru semangat ketika terjun langsung dalam proyek, dan belajar dengan mencontek hasil kerjaan orang lain. Akibatnya, tidak memiliki dasar yang mendalam. Termasuk dalam hal membuat testclass. Selama ini aku anggap testclass hanya sebagai basa-basi, formalitas agar aplikasi bisa di-deploy ke production. Soalnya system mewajibkan minimal code coverage 75%, baru bisa di-deploy. Tentu saja ini hal yang menjengkelkan dan membuat frustrasi. Hal ini diperparah dengan kebiasaanku yang tidak pernah membaca teori tentang test class ataupun cara yang benar untuk membuat test ...

Menampilkan Angka dengan Format Ribuan dan Pecahan

Masalah sepele : ingin menampilkan angka seperti 12345.57 jadi 123,45.57 (untuk saat ini dibatasi hanya 2 desimal). Karena masalahnya sepele, algoritmanya juga harusnya sepele. Tapi sering lupa, jadi mending aku tulis di sini sekedar jadi pengingat. PHP Kalau di php simple, cukup pakai sintaks number_format(Angka, Jumlah Decimal) Lengkapnya bisa dilihat di sini  http://php.net/number_format JAVASCRIPT Sepertinya di javascript belum ada fungsi bawaan yang standard, jadi terpaksa bikin sendiri. Agak gak efektif memang, tapi biarlah. function currFormat(decAmount)   {     strSymbol = (decAmount < 0) ? '-' : '';     decAmount = Math.abs(decAmount);     decAmount = Math.round(decAmount * 100);     dec1 = Math.floor(decAmount / 100);     dec2 = decAmount - (dec1 * 100);          str1 = dec1.toString();     str2 = dec2.toString();        ...

Visual Force Page : Create List With Hyperlink Column

Apex code sederhana, untuk membuat table berisi daftar record suatu object, dengan menampilkan hyperlink ke record tersebut. Soalnya kalau hanya menampilkan field Name (sebagai primary key), ternyata gak ada hyperlink. Contohnya ingin menampilkan list Lead seperti berikut. Nah, potongan programnya cukup seperti ini Dengan asumsi, listLead adalah List , yang merupakan list berisi record dari standard object Lead. Sekedar pengingat saja.

Apex Controller - New Button Override with Autotext for Name

Field Name di Salesforce ada dua jenis : Autonumber atau Text(80). Jika kita pilih Autonumber, kita gak bisa mengubah nilainya. Tapi jika kita pilih Text, field ini jadi wajib. Kadangkala kita ingin punya Autonumber sendiri, tidak memakai autonumber standard dari salesforce. Ini bisa ditangani dengan membuat trigger. Masalahnya, field Name itu wajib diisi dan user tidak bisa menyimpan sebuah record tanpa memberi isi pada field tersebut, padahal field tersebut nantinya akan ditimpa (replace) dengan trigger. Jadi terkesan user harus mengisi dengan sesuatu yang tidak berguna, hanya sekedar agar record bisa disimpan. Salah satu solusi mengatasi ini adalah dengan memberi nilai default ke field Name tersebut, sehingga nilainya sudah otomatis ada, dan user tidak perlu repot-repot mengisinya. Ini bisa dilakukan dengan membuat sebuah VF Page sederhana, yang akan meng-override New button dan isinya cuma meredirect ke halaman New. Berikut contoh code Controllernya. Sengaja malas mengubah de...

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. Nomor urut yang perlu di-reset secara berkala, misal per bulan atau per tah...

Mengatasi Jumlah Tab di Salesforce

Secara default, Salesforce hanya menyediakan 25 tab. Jika kita ingin membuat tab melebihi itu, kita harus membayar lagi. Konsep tab di salesforce mirip dengan menu, bisa dibilang menggantikan menu, karena tidak banyak pilihan navigasi lain selain lewat tab. Pada dasarnya, untuk tab dibutuhkan jika kita ingin mengakses data (termasuk membuat record baru, menghapus record yang ada ataupun mengeditnya) dalam sebuah object tertentu. Sedikit merepotkan saat kita membuat object baru, kita harus membuat tab baru untuk melakukan testing atau agar object itu bisa aktif, karena membuat object baru tidak secara otomatis menghasilkan tab untuk mengakses menu itu. Untuk proyek yang sekelas ERP misalnya, tentu tidak cukup hanya memiliki 25 tab, dan kami pernah dapat complaint  dari customer karena hal itu. Makanya dulu kepikiran, pasti ada cara untuk mengatasi hal ini. Mungkin bisa dengan membuat visualforce page yang bermanfaat untuk mengakses object tertentu, tanpa harus membuat tab baru. Ak...

Apex Salesforce Limitation

Geregetan juga saat coding di Salesforce.com dengan Apex, ternyata cukup banyak keterbatasan yang diterapkan di sana. Memang sih, tujuannya untuk optimalisasi proses dan mencegah server berantakan gara-gara terlalu banyak proses yang berjalan secara simultan. Bosku bilang ke client "ini adalah konsekuensi menggunakan sistem multi-tenant ". Awalnya aku penasaran, apa saja sih yang dibatasi oleh Salesforce.com ini. Eh, ternyata di debug log ada penjelasannya. Berikut daftar (mungkin belum semua) batasan yang diberikan oleh Salesforce, sekedar untuk pengingat: Number of SOQL queries: 100 Number of query rows: 50000 Number of SOSL queries: 20 Number of DML statements: 150 Number of DML rows: 10000 Number of script statements: 200000 Maximum heap size: 3000000 Number of callouts: 10 Number of Email Invocations: 10 Number of fields describes: 100 Number of record type describes: 100 Number of child relationships describes: 100 Number of picklist describes: 100 Nu...

Salesforce Data Connection with PHP

Sekedar untuk mengingat aja, contoh kelas untuk koneksi PHP ke Salesforce dengan API/SOAP. /** Class to handle connection to salesforce */ require_once("soapclient/SforcePartnerClient.php"); require_once("soapclient/BulkApiClient.php"); define('SOAP_PATH', "soapclient"); define('WSDL_XML_PARTNER', "partner.wsdl.xml"); define('WSDL_XML_ENTERPRISE', "enterprise.wsdl.xml"); define('WSDL_XML_METADATA', "metadata.wsdl.xml"); class SFConnectionClass { public $connection; public $server = 'sand'; // option (sand or prod) public $username = ''; public $password = ''; public $token = ''; public $sfSessionID = ''; public $sfLocation = ''; /* constructor // if parameter empty, use default */ public function SFConnectionClass($server = 'sand', $username = '', $password = '', $token = ...

Decimal vs Integer : Sedikit Masalah Di Apex

Aku buat program dengan menggunakan Map di Apex. Map mapData = new Map (); mapData.put('01', 10000); mapData.put('02',5000000000); Waktu di-save, gagal dengan error berikut : Error: Compile Error: Invalid Integer: 5000000000 at line ... Loh? Masak decimal gak bisa menampung data 5M? Gimana bisa buat program akunting di Indonesia kalau gini. Penasaran, aku tanya ke senior. Dia mencoba menawarkan menambahkan .00 di belakang angka 5M. mapData.put('02',5000000000.00); Dan berhasil!!! Aneh. Bahkan seniorkupun merasa heran kok solusi yang diberikan dia bisa berhasil. Dugaanku, apex menganggap angka itu sebagai Integer (sesuai pesan errornya), meskipun tipe datanya sudah kuberi Decimal. Akibatnya error karena 5M melebih batas untuk integer. Mungkin paling tepat adalah menggunakan casting data : Decimal.valueOf(5000000000). Tapi kan merepotkan :(