Social Icons

google plustwitterfacebookinstagramlinkedinrss feedcontact me
Tampilkan postingan dengan label tips dan trik. Tampilkan semua postingan
Tampilkan postingan dengan label tips dan trik. Tampilkan semua postingan

Kamis, 23 April 2015

Mengakses Properti Kontrol Dalam Datawindow

Untuk trik kali ini adalah tentang bagaimana caranya mengakses properti dari objek/control yang ada dalam datawindow. Sebelum saya mulai, saya akan berikan sedikit gambaran tentang bagaimana caranya mengakses properti dari objek/control yang ada dalam datawindow. Untuk mengakses/merubah properti sebuah objek/control dalam datawindow, ada dua cara, yaitu dengan menggunakan syntax dot notation atau menggunakan syntax describe/modify. Misalnya jika ingin merubah properti Visible dari control yang bernama kolom1 dari True Menjadi False, maka kita akan menuliskan script berikut ini:

  1. Dengan Dot Notation: dw_1.Object.kolom1.Visible = 0
  2. Dengan Modify: dw_1.Modify("kolom1.Visible = 0")
Sedangkan jika hanya ingin mengetahui nilai properti Visible dari kolom1, kita akan menuliskan script berikut ini:

  1. Dengan Dot Notation: li_visible = dw_1.Object.kolom1.Visible
  2. Dengan Describe: ls_visible = dw_1.Describe("kolom1.Visible")
Begitupun jika kita ingin mengetahui/merubah properti yang lainnya, nah sedikit masalah akan muncul ketika jumlah objek/control yang ingin kita rubah propertinya itu jumlahnya lumayan banyak, misalnya ada 20 kolom, jika menggunakan cara standar seperti diatas, maka kita sudah pasti harus menuliskan script diatas sebanyak 20 kali juga (dengan nama object/control yang berbeda-beda). Kalau buat saya sih sebenarnya hal ini tidak masalah, cuma agak kurang sedap dipandang aja jadinya kodingan kita. Untuk itulah kali ini saya ingin bagikan sebuah trik untuk mengantisipasi masalah seperti ini. Untuk triknya saya gunakan metode looping (untungnya Datawindow punya properti Objects dan ada metode Describe dan Modify). Sehingga script/kodingan kita akan terlihat "agak" professional daripada jika menggunakan cara standar yang harus menuliskan ulang metode yang sama untuk banyak objek/control.
Sebelum saya mulai lebih jauh lagi, sedikit mengingatkan, jika Properti Objects dari Datawindow itu berupa string kumpulan objek/control dalam datawindow tersebut dengan pemisahnya berupa karakter Tab (dalam powerbuilder dapat diidentifikasi dengan simbol ~t) untuk setiap objek/control., contohnya: kolom1 kolom2 teks1 teks2 kolom3 kolom4 teks3 teks4
Oke, sekarang saya langsung ke triknya, dan berikut adalah contoh ketika saya ingin merubah properti Visible menjadi False (0) dari setiap kolom dalam datawindow yang bernama dw_1, syntaxnya adalah sebagai berikut:
String ls_objek, ls_tipe
Integer li_len, li_pos, li_start, li_end
String ls_kontrol

ls_objek = dw_1.Describe("Datawindow.Objects") + "~t"
li_len = Len(ls_objek) 
li_start = 1
li_pos = PosA(ls_objek, "~t", li_start)

DO WHILE li_pos > 0
li_end = li_pos - li_start
ls_kontrol = MidA(ls_objek, li_start, li_end ) 
IF Not IsNull(ls_kontrol) THEN
ls_tipe = dw_1.Describe(ls_kontrol + ".Type")
IF ls_tipe = "column" THEN
dw_1.Modify(ls_kontrol + ".Visible=0")
END IF
END IF
li_start = li_pos + 1
li_pos = PosA(ls_objek, "~t", li_start )
LOOP

atau jika ingin menggunakan kriteria (dalam powerbuilder menggunakan expression) yang berarti Visiblenya situasional/kondisional, misalnya tergantung nilai dikolom tersebut, maka tinggal diganti baris ke-16 dari script diatas, menjadi seperti ini:
String ls_objek, ls_tipe
Integer li_len, li_pos, li_start, li_end
String ls_kontrol

ls_objek = dw_1.Describe("Datawindow.Objects") + "~t"
li_len = Len(ls_objek) 
li_start = 1
li_pos = PosA(ls_objek, "~t", li_start)

DO WHILE li_pos > 0
li_end = li_pos - li_start
ls_kontrol = MidA(ls_objek, li_start, li_end ) 
IF Not IsNull(ls_kontrol) THEN
ls_tipe = dw_1.Describe(ls_kontrol + ".Type")
IF ls_tipe = "column" THEN
dw_1.Modify(ls_kontrol + ".Visible='0~tIf(" + ls_kolom + ">0,1,0)'")
END IF
END IF
li_start = li_pos + 1
li_pos = PosA(ls_objek, "~t", li_start )
LOOP
Script diatas, jika nilai/data pada kolom tersebut lebih dari 0 maka kolom tersebut ditampilkan, selain itu disembunyikan.
Kalau dihitung jumlah barisnya, memang script diatas jadi lebih banyak daripada jika menggunakan script standar (untuk jumlah objek/control yang ingin diubah propertinya kurang dari 20), namun meski begitu, seperti yang sudah saya katakan sebelumnya, menurut pendapat saya metode looping ini akan sedikit "menaikkan" level programming kita, he he he. Namun jika jumlah objek/kontrolnya diatas 30, tentu metode looping diatas lebih efisien, apalagi jika ternyata ada perubahan dalam desain datawindownya, dimana ada penambahan/pengurangan objek/control dalam datawindow, maka kita tidak perlu lagi merubah script yang telah kita buat, lain halnya jika kita menggunakan metode standar, tentunya jika ada pengurangan/penambahan objek/kontrol dalam datawindownya maka kita juga harus menghapus/menambahkan script sesuai dengan perubahan datawindow tersebut.

Demikianlah trik ini, semoga bermanfaat.
Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Selasa, 14 April 2015

Mengetahui Jumlah Hari Dalam Bulan

Pada postingan sebelumnya yang berjudul Menghitung Umur, saya sudah pernah memberikan trik untuk mendapatkan jumlah hari dalam satu bulan, dimana pada postingan tersebut inti dari triknya adalah dengan membuat sebuah tanggal temporer berupa tanggal 1 dari bulan berikutnya lalu menguranginya dengan 1 hari sehingga didapatkan tanggal terakhir dari bulan yang ingin kita ketahui jumlah harinya (dalam hal ini tanggal terakhir tersebut merupakan jumlah hari dalam bulan tersebut).

Pada postingan kali ini saya akan berikan trik lainnya(alternatif) untuk mengetahui jumlah hari dalam satu bulan. pada trik kali ini kita akan menggunakan array dan pengecekan tahun kabisat. Sedikit penjelasan, untuk mengecek apakah sebuah tahun itu merupakan tahun kabisat, bisa dilakukan dengan kriteria sebagai berikut:

  1. Jika tahun dibagi dengan 400 hasilnya bulat maka sudah pasti tahun tersebut adalah tahun kabisat
  2. Jika tahun dibagi 400 hasilnya tidak bulat, tetapi jika dibagi 100 hasilnya bulat maka tahun tersebut bukanlah tahun kabisat
  3. Jika tahun dibagi 400 dan dibagi 100 hasilnya tidak bulat, tetapi jika dibagi 4 hasilnya bulat maka tahun tersebut adalah tahun kabisat
  4. Jika tahun dibagi 400 dan dibagi 100 hasilnya tidak bulat, dan jika dibagi 4 hasilnya tidak bulat maka tahun tersebut bukanlah tahun kabisat

(sumber: wikipedia)
Kriteria diatas akan digunakan jika bulan yang sedang ingin kita ketahui jumlah harinya adalah bulan 2 (Februari), selain bulan Februari maka kriteria diatas akan dilewati.

Untuk lebih mudahnya trik ini akan saya buat dalam sebuah Global Function dengan strukturnya sebagai berikut:
Nama Function: gf_jumlah_hari
Return Value: Integer
Argument1: ai_bulan (Integer)
Argument2: ai_tahun (Integer)

Dan berikut adalah script codingnya:
integer li_hari[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
integer li_return

li_return = li_hari[ai_bulan]

IF ai_bulan = 2 THEN
IF Mod(ai_tahun, 400) = 0 THEN
// jika tahun habis dibagi 400 berarti tahun kabisat
li_return = 29
ELSEIF Mod(ai_tahun, 100) = 0 THEN
// jika tahun tidak habis dibagi 400 tetapi habis dibagi 100 berarti bukan tahun kabisat
li_return = li_return
ELSEIF Mod(ai_tahun, 4) = 0 THEN
// jika tahun tidak habis dibagi 400 dan tidak habis dibagi 100 tetapi habis jika dibagi 4 berarti tahun kabisat
li_return = 29
ELSE
// jika tahun tidak habis dibagi 400 dan tidak habis dibagi 100 dan tidak habis dibagi 4 berarti bukan tahun kabisat
li_return = li_return
END IF
END IF

Return li_return

Simpan function diatas, untuk memanggilnya bisa dengan cara sebagai berikut:
integer li_hari

li_hari = gf_jumlah_hari(Month(Today()), Year(Today())
atau
li_hari = gf_jumlah_hari(1, 2015) (Jumlah hari dalam bulan Januari 2015)
atau 
li_hari = gf_jumlah_hari(2, 2014) (Jumlah hari dalam bulan Februari 2014)

dan seterusnya.
Demikianlah trik ini, semoga bermanfaat.

Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Rabu, 22 Oktober 2014

Merubah Properti Control Dalam Datawindow

Pada Tutorial Membuat Program Biodata Karyawan yang lalu, ada script code yang bertujuan untuk memodifikasi properti Protect dari beberapa Column dalam datawindow, misalnya pada Tutorial Membuat Program Biodata Karyawan Part 7, disana ada script pada Event Clicked dari Command Button cb_tambah yg seperti ini (dibagian terakhirnya):
dw_karyawan.Modify("nama_karyawan.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("jenis_kelamin.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("tempat_lahir.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("tanggal_lahir.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("status_nikah.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("pendidikan.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("alamat_lengkap.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("nomor_telepon.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("nomor_handphone.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("alamat_email.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("nama_bagian.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("nama_jabatan.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("status_kerja.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("tanggal_masuk.Protect ='1~tIf(IsRowNew(),0,1)'")
dw_karyawan.Modify("keterangan.Protect ='1~tIf(IsRowNew(),0,1)'")
Script code diatas adalah script untuk memProtect Column dalam datawindow kecuali column dibaris baru (Penambahan Data). Dengan model script diatas maka kita tentunya harus mengetikkan satu persatu dari semua column yang ingin diprotect, masalahnya adalah, bagaimana jika column yang harus diatur itu ada banyak dan datawindow yang lain juga harus dilakukan hal yang sama ? tentunya akan tidak efisien jika harus mengetikkan secara berulang-ulang, atau yang paling mudahnya mengcopy paste script diatas lalu mengganti nama datawindow dan nama masing-masing columnnya, namun hal itu juga menurut saya agak kurang efisien, maka solusi dari saya adalah dengan membuat Function dengan metode Looping untuk setiap column, sehingga script codenya bisa dirampingkan.

Analisa
Sebelum membuat Function, maka kita pasti harus melakukan analisa terlebih dahulu, hal ini perlu karena dengan analisa, maka kita akan dapat menentukan Return value dan argument-argument yang dibutuhkan, sehingga Function yang kita buat dapat dipanggil dimana saja. Dari script code diatas dapat saya simpulkan jika Function yang akan kita buat tidak memerlukan Return Value, dan argument yang dibutuhkan adalah Datawindow dan String, dimana argument Datawindow untuk mendefinisikan datawindow yang akan diakses dan String adalah Properti dan nilai dari propertinya.
Setelah analisa selesai, langsung saja kita buat Function tersebut, berikut adalah langkah-langkahnya:
Buat Function baru dengan struktur sebagai berikut:
Nama Function: f_set_column
Return Type: (None)
Access: Public
Arguments:
Pass By
Argument Type
Argument Name
Value
datawindow
adw_name
Value
string
as_property
Pada Code Painter, masukkan script berikut ini:
String ls_object, ls_control, ls_delimiter = "~t", ls_type
Integer li_pos, li_start, li_end

ls_object = adw_name.Describe("Datawindow.Objects") + "~t"
li_start = 1
li_pos = PosA(ls_object, ls_delimiter, li_start)

DO WHILE li_pos > 0
li_end = li_pos - li_start
ls_control = MidA(ls_object, li_start, li_end) 
IF Not Isnull(ls_control) THEN
ls_type = adw_name.Describe(ls_control + ".Type")
IF ls_type = "column" THEN
adw_name.Modify(ls_control + "." + as_property)
END IF
END IF
li_start = li_pos + 1
li_pos = PosA(ls_object, ls_delimiter, li_start)
LOOP

Simpan Function ini.

Untuk menggunakan Function diatas, maka kita perlu memasukkan 2 argument, yakni datawindow dan string propertinya, misalnya:

f_set_column(dw_1, "Protect ='1~tIf(IsRowNew(),0,1)'")
f_set_column(dw_1, "Protect = 1")
f_set_column(dw_1, "Protect = 0")
f_set_column(dw_1, "Visible = 1")
f_set_column(dw_1, "Visible = 0")

Demikianlah trik singkat ini, semoga bermanfaat untuk anda.
Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Rabu, 15 Oktober 2014

Menghitung Umur

Membuat Function Untuk Menghitung Umur

Kali ini saya akan memberikan sebuah Function yang dapat digunakan untuk menghitung umur/usia seseorang secara detail (tahun, bulan dan harinya), selain untuk menghitung umur/usia, Function ini juga dapat diterapkan untuk menghitung selisih waktu diantara dua tanggal (tanggal dalam argument dan tanggal dalam system komputer).

Anda tidak perlu khawatir, karena dalam Function yang akan saya berikan ini akan menggunakan Function-Function standar yang saya yakin anda telah mengetahuinya, disini mungkin yang lebih berperan adalah logikanya, karena untuk menghitung umur/usia, butuh sedikit pemikiran yang lebih dalam, agar hasil yang didapatkan sesuai dengan hitungan yang sebenarnya (versi saya tentunya).

Sebelum saya mulai, sebagai gambaran, ada baiknya saya berikan konsep dari Function ini, yaitu sebagai berikut:

Misalnya tanggal lahir adalah 15 Oktober 2000
  1. Pada tanggal 14 Oktober 2014, umur/usia belum genap 14 tahun, karena masih kurang 1 hari lagi, yang berarti umur/usia adalah 13 tahun 11 bulan pada tanggal 15 September 2014, ditambah selisih hari antara tanggal 15 September 2014 dan 14 Oktober 2014 sebanyak 29 hari
  2. Pada tanggal 15 Oktober 2014, umur/usia telah genap 14 Tahun
  3. Pada tanggal 16 Oktober 2014, umur/usia telah genap 14 Tahun ditambah 1 hari
Hasil output dari Function yang akan saya berikan untuk contoh diatas adalah sebagai berikut:
  1. 13 Tahun 11 Bulan 29 Hari
  2. 14 Tahun 0 Bulan 0 Hari
  3. 14 Tahun 0 Bulan 1 Hari
Hal ini juga berlaku untuk bulan-bulan sebelum/sesudah bulan lahirnya.

Dari contoh diatas, jika tanggal lahirnya belum tercapai, maka akan ada jumlah hari yang ditambahkan, jumlah hari tersebut bisa kita dapatkan dengan cara kita harus terlebih dahulu mengetahui jumlah hari dalam bulan sebelumnya, jumlah hari ini kita butuhkan agar kita bisa membuat tanggal sesuai dengan tanggal lahir namun dibulan sebelumnya, hal ini untuk mengantisipasi jika tanggal lahir lebih besar dari tanggal terakhir dibulan sebelumnya, misalnya tanggal lahir adalah 31 Maret, kita tahu jika tanggal terakhir dibulan sebelumnya(dalam hal ini Pebruari) maksimal adalah 29 (jika tahun kabisat, jika bukan tahun kabisat maka tanggal terakhir dari bulan Pebruari adalah 28).
Sedangkan jika tanggal lahirnya telah lewat, maka kita tinggal menghitung jumlah harinya saja.

Sekarang kita lanjut ke pembuatan function, sesuai judul artikel ini yaitu Function menghitung umur, berikut adalah langkah-langkahnya:
Buat dahulu Function untuk menghitung jumlah hari dibulan sebelumnya atau bisa juga disebut sebagai Function untuk mengetahui tanggal terakhir dari bulan sebelumnya, berikut adalah langkah-langkahnya:
Dalam workspace anda, buat sebuah Function baru dengan struktur sebagai berikut:
Property
Keterangan
Access
Public
Return Type
Integer
Function Name
f_jumlah_hari_bulan_lalu
Pass By
Value
Argument Type
Date
Argument Name
ad_tanggal_sekarang
Pada painter code, masukkan script berikut ini:
// Kegunaan: untuk mendapatkan jumlah hari/tanggal terakhir dibulan sebelumnya

Integer fi_bulan, fi_tahun
Date fd_tanggal_terakhir

fi_bulan = Month(ad_tanggal_sekarang)
fi_tahun = Year(ad_tanggal_sekarang)

fd_tanggal_terakhir = RelativeDate(Date(fi_tahun, fi_bulan, 1), -1)

Return Day(fd_tanggal_terakhir)
Simpan Function tersebut.

Langkah selanjutnya adalah pembuatan Function untuk menghitung umur, berikut langkah-langkahnya:
Buat Function baru dengan struktur sebagai berikut:
 Property
Keterangan
Access
Public
Return Type
String
Function Name
f_detail_umur
Pass By
Value
Argument Type
Date
Argument Name
ad_tanggal_lahir
Pada jendela code painter, masukkan script kode berikut ini:
String fs_ret
Integer fi_tahun_lahir, fi_tahun_sekarang, fi_bulan_lahir, fi_bulan_sekarang, fi_tanggal_lahir, fi_tanggal_sekarang
Integer fi_selisih_tahun, fi_selisih_bulan, fi_selisih_hari, fi_jumlah_hari
Date fd_tanggal_lahir_bulan_lalu

SetNull(fs_ret) // set null untuk return-nya
// cek argument, null atau tidak
IF IsNull(ad_tanggal_lahir) THEN Return fs_ret
// Cek tanggal lahir melewati tanggal sekarang atau tidak
IF ad_tanggal_lahir > Today() THEN Return "Belum Lahir"
// Ambil Tahun, Bulan dan Tanggal dari tanggal lahir
fi_tahun_lahir = Year(ad_tanggal_lahir)
fi_bulan_lahir = Month(ad_tanggal_lahir)
fi_tanggal_lahir = Day(ad_tanggal_lahir)
// Ambil Tahun, Bulan dan Tanggal dari tanggal sekrang
fi_tahun_sekarang = Year(Today())
fi_bulan_sekarang = Month(Today())
fi_tanggal_sekarang = Day(Today())
// Set nilai dengan asumsi tanggal dan bulan sekarang adalah tanggal dan bulan lahirnya
fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir
fi_selisih_bulan = 0
fi_selisih_hari = 0
// kode berikut akan dieksekusi jika tanggal sekarang umur/usia belum genap atau sudah lewat tanggal, bulan dan tahunnya
IF fi_bulan_lahir = fi_bulan_sekarang THEN // bulannya sama
IF fi_tanggal_lahir > fi_tanggal_sekarang THEN // tanggal lahir belum waktunya
            fi_jumlah_hari = f_jumlah_hari_bulan_lalu (Today())
            fi_selisih_bulan = 11
fd_tanggal_lahir_bulan_lalu = RelativeDate(Date(fi_tahun_sekarang, fi_bulan_sekarang, fi_tanggal_lahir), 0 - fi_jumlah_hari)
            fi_selisih_hari = DaysAfter(fd_tanggal_lahir_bulan_lalu, Today())
            fi_selisih_tahun = (fi_tahun_sekarang - fi_tahun_lahir) - 1
ELSEIF fi_tanggal_lahir < fi_tanggal_sekarang THEN // tanggal lahir sudah lewat
            fi_selisih_hari = fi_tanggal_sekarang - fi_tanggal_lahir
            fi_selisih_bulan = 0
            fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir
END IF
ELSEIF fi_bulan_lahir > fi_bulan_sekarang THEN // bulan lahir belum waktunya
IF fi_tanggal_lahir = fi_tanggal_sekarang THEN // tanggal lahirnya sama dengan tanggal sekarang
            fi_selisih_hari = 0
            fi_selisih_bulan = 12 - (fi_bulan_lahir - fi_bulan_sekarang)
            fi_selisih_tahun = (fi_tahun_sekarang - fi_tahun_lahir) - 1
ELSEIF fi_tanggal_lahir > fi_tanggal_sekarang THEN // tanggal lahir belum waktunya
            fi_jumlah_hari = f_jumlah_hari_bulan_lalu(Today())
            fi_selisih_bulan = 12 - (fi_bulan_lahir - fi_bulan_sekarang) - 1
            fd_tanggal_lahir_bulan_lalu = RelativeDate(Date(fi_tahun_sekarang, fi_bulan_sekarang, fi_tanggal_lahir), 0 - fi_jumlah_hari)
            fi_selisih_hari = DaysAfter(fd_tanggal_lahir_bulan_lalu, Today())
            fi_selisih_tahun = (fi_tahun_sekarang - fi_tahun_lahir) - 1
ELSE // tanggal lahir sudah lewat
            fi_selisih_hari = fi_tanggal_sekarang - fi_tanggal_lahir
            fi_selisih_bulan = 12 - (fi_bulan_lahir - fi_bulan_sekarang)
            fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir - 1
END IF
ELSEIF fi_bulan_lahir < fi_bulan_sekarang THEN // bulan lahir sudah lewat
IF fi_tanggal_lahir = fi_tanggal_sekarang THEN // tanggal lahir sama dengan tanggal sekarang
            fi_selisih_hari = 0
            fi_selisih_bulan = fi_bulan_sekarang - fi_bulan_lahir
            fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir
ELSEIF fi_tanggal_lahir > fi_tanggal_sekarang THEN // tanggal lahir belum waktunya
            fi_jumlah_hari = f_jumlah_hari_bulan_lalu(Today())
            fi_selisih_bulan = fi_bulan_sekarang - fi_bulan_lahir - 1
            fd_tanggal_lahir_bulan_lalu = RelativeDate(Date(fi_tahun_sekarang, fi_bulan_sekarang, fi_tanggal_lahir), 0 - fi_jumlah_hari)
            fi_selisih_hari = DaysAfter(fd_tanggal_lahir_bulan_lalu, Today())
            fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir
ELSE // tanggal lahir sudah lewat
            fi_selisih_hari = fi_tanggal_sekarang - fi_tanggal_lahir
            fi_selisih_bulan = fi_bulan_sekarang - fi_bulan_lahir
            fi_selisih_tahun = fi_tahun_sekarang - fi_tahun_lahir
END IF
END IF
// buat string untuk hasilnya
fs_ret = String(fi_selisih_tahun) + " Tahun " + String(fi_selisih_bulan) + " Bulan " + String(fi_selisih_hari) + " Hari"
Return fs_ret
Simpan Function tersebut.

Untuk memanggil Function tersebut, kita tinggal memasukkan argument dengan tipe data date, misalnya:
Date ld_lahir
String ls_msg

em_1.GetData(ld_lahir)
ls_msg = "Untuk Tanggal Lahir " + String(ld_birth, "dd mmmm yyyy") + " detail umur pada~n"
ls_msg = ls_msg + "tanggal " + String(Today(), "dd mmmm yyyy") + " adalah sebagai berikut:~n~n"
ls_msg = ls_msg + f_detail_umur(ld_birth, lb_1.SelectedIndex())

MessageBox("Function Detail Umur", ls_msg, Information!)
Berikut adalah contoh hasil outputnya:

Demikianlah pembuatan Function untuk menghitung umur versi saya yang simple ini, untuk contoh filenya dapat anda download di laman Sample.

Akhir kata, semoga artikel ini berguna untuk anda. 

Sabtu, 20 September 2014

Comment Script


Tips kali ini, mengenai comment pada script yang kita tulis. Sering kali saya melihat source code program para programmer baik yang masih pemula ataupun yang sudah pro, tidak menyertakan comment dalam scriptnya, hal ini sebenarnya bukanlah masalah yang besar atau harus dibesar-besarkan, terlebih lagi untuk pembuatnya. Namun jika ada suatu case khusus yang terjadi maka pemecahan masalahnyapun jadi tidak semudah membalikan telapak tangan, kita semua tahu Lupa adalah hal yang sangat manusiawi, dan kadang kala kita sebagai manusia juga suka melewatkan sesuatu secara tidak sengaja karena faktor-faktor tertentu.

Balik lagi ke masalah comment, menurut saya pribadi, comment itu dibutuhkan agar jika suatu saat terjadi error atau ada perubahan dalam script, ktia bisa langsung mengetahui langkah apa yang harus dilakukan untuk memecahkan persoalannya (error atau perubahannya). Jadi bisa dikatakan untuk saya pribadi Comment itu merupakan sebuah petunjuk atau clue untuk script yang akan dijalankan.
Comment tidak akan dieksekusi oleh PowerBuilder, alias akan langsung dilewati (sepertinya hal ini juga berlaku untuk bahasa pemrograman yang lain).

Sudah banyak yang membahas masalah comment dalam script di internet, diantaranya ada yang menyebutkan bahwa comment itu merupakan salah satu hal yang membuat cara menulis script seorang programmer dikatakan rapi, namun di sisi lain ada pula yang beranggapan jika kita terlalu jelas menulis comment dalam script, maka hasil kerja kita akan dengan mudah diubah-ubah oleh programmer lain (mungkin ini salah satu penyebab secara umum seorang programmer akan agak susah untuk diminta memodifikasi program yang bukan buatannya sendiri).

Comment dalam PowerBuilder itu diawali dengan karakter 2 garis miring ( // ) atau jika comment ingin dibuat lebih dari 1 baris maka karakternya menjadi garis miring dan karakter asterik ( /* ) dan diakhir Comment dengan karakter asterik dan garis miring ( */ ), dan biasanya akan langsung berubah warna menjadi biru (lihat gambar diatas).

Contohnya:
Comment dengan 1 baris
// cek nilai yang dimasukkan dalam sle_1
codingan anda...

Comment dengan lebih dari 1 baris
/* cek nilai dalam dropdownlistbox
lalu masukkan hasilnya ke singlelineedit
*/
codingan anda...

Nah, jika memang anda tidak dikejar-kejar waktu tenggat, maka tidak ada salahnya jika anda memberikan comment dalam setiap script yang anda tulis, atau setidaknya berikan Comment pada script yang agak panjang, hal ini agar jika suatu saat terjadi masalah, anda bisa langsung mendeteksi dan bisa langsung mendapatkan solusinya.

Ini hanyalah salah satu tips untuk anda, simple memang, tapi kadang kala hal yang simple juga bisa menjadi masalah yang besar.

Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Jumat, 19 September 2014

Prefiks Variabel


Masih postingan dalam hal tips, untuk kali ini saya ingin memberikan/mengingatkan sebuah tips untuk anda, dimana tips ini sedikit banyak akan membantu kita dalam membuat variabel-variabel yang unik alias tidak bentrok dengan variabel lainnya, maksudnya setiap kali membuat variabel, kita tidak akan membuat variabel yang sama.
Untuk itu maka perlu kita tetapkan dari awal sekali, tentang prefiks variabel-variabel yang akan kita tentukan dalam setiap program yang kita buat. Hal ini juga akan membuat cara mengkoding kita akan lebih tertata rapi serta terstruktur dan jadi mudah diingat (untuk yang terakhir ini menurut saya pribadi).

Untuk lebih jelasnya dengan apa yang saya maksudkan, silahkan anda buka menu Design -> Options. Lalu anda buka Tab Prefixes 1 dan Prefixes 2.
Disana anda akan lihat prefiks-prefiks yang secara default telah ditentukan oleh PowerBuilder untuk masing-masing objek, sehingga setiap kali kita insert objek, maka namanya akan dimulai oleh prefiks yang telah ditentukan dalam menu tersebut.
Saya ambil contoh untuk Command Button, maka default prefiksnya adalah cb_ jika kita insert control Command Button kedalam window atau datawindow, maka nama command button tersebut akan menjadi cb_ ditambah angka urutan insertnya, misalnya cb_1, cb_2, cb_3 dan seterusnya.
Hal ini secara tidak kita sadari, sebenarnya telah membantu kita untuk mengingat bahwa control command button yang ada dalam window itu namanya diawali dengan cb_, sehingga kita tinggal mengingat nama lanutannya untuk keperluan coding kita, misalnya memanggil event Clickednya.
Disini alangkah lebih baik lagi jika, nama object atau control tersebut disesuaikan dengan actionnya, misalnya actionnya adalah mencetak, maka namanya lebih baik diganti, misalnya dari cb_1 menjadi cb_cetak, jika actionnya adalah menyimpan data, maka namanya menjadi cb_simpan.

Lanjut lagi ke tipsnya, dalam PowerBuilder untuk variabel itu terbagi menjadi 4:
1. Global Variable
2. Instance Variable
3. Shared Variable
4. Local Variable
Untuk pengertian masing-masing, silahkan anda buka menu Help pada PowerBuilder lalu ketikkan variable, lalu klik where to declare.

Kalau saya pribadi, untuk masing-masing variabel, saya pasti akan menggunakan prefiks-prefiks seperti dibawah ini:
1. Global Variabel: g
2. Instance Variable: i
3. Shared Variable: sh
4. Local Variable: l

Contoh deklarasi variabelnya:
Tipe data String:
1. Global Variabel: gs_
2. Instance Variable: is_
3. Shared Variable: shs_
4. Local Variable: ls_

Tipe data Integer
1. Global Variabel: gi_
2. Instance Variable: ii_
3. Shared Variable: shi_
4. Local Variable: li_

Tipe Data Long
1. Global Variabel: gl_
2. Instance Variable: il_
3. Shared Variable: shl_
4. Local Variable: ll_

dan lain sebagainya.

Dengan ditentukannya prefiks untuk masing-masing variabel, maka saat kita akan menentukan variabel local, maka kita akan yakin kalau variabel tersebut tidak ada di Global, Shared atau Instance Variabel, karena prefiksnya sudah berbeda.
Contohnya kita membutuhkan 2 variabel untuk user ID dengan tipe data string, namun variabel tersebut berbeda level aksesnya, yang satu untuk dapat diakses dalam keseluruhan program, alias dapat dipanggil oleh semua Objek atau kontrol, sedangkan variabel yang satu lagi (misalnya) untuk mendapatkan user ID yang lain dan hanya untuk keperluan satu Objek atau Kontrol.
Dalam hal ini berarti akan ada dua variabel dengan nama yang sama, namun dibedakan oleh prefiksnya, contohnya:
Untuk Global Variabel bernama gs_nama_user sedangkan untuk yang Local Variabel bernama ls_nama_user

Ini hanyalah salah satu tips untuk anda, anda boleh lakukan atau tidak, karena hal tersebut sangat tergantung pada anda secara pribadi, maksudnya kalau anda telah terbiasa dengan metode yang lain dan tidak pernah ada masalah, silahkan dilanjutkan.

Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Cek Null Atau String Kosong


Untuk kali ini, saya akan memberikan tips yang mungkin anda sudah mengetahuinya, bahkan telah atau selalu melakukannya, namun tidak sedikit juga ada diantara anda yang sudah mengetahuinya, namun tidak selalu melakukannya. Jadi mungkin tips kali ini lebih tepat untuk dikatakan sebagai pengingat untuk anda.

Alasan yang paling utama untuk saya memposting tips ini adalah, karena sering kali saya temukan ada user yang komplain atau kebingungan karena program error atau inputan yang ia masukkan tidak sesuai dengan hasilnya. Seringnya sih ternyata masalah yang timbul dikarenakan hal yang sepele, seperti user lupa menginput data sebuah kolom, namun hal yang sepele ini bisa jadi masalah yang agak besar jika kolom yang user tersebut lupa untuk diinput adalah kolom yang wajib diisi, misalnya karena kolom tersebut adalah merupakan Primary Key dari tablenya.

Nah, kembali lagi ke tips yang akan saya berikan/ingatkan, tips kali ini adalah "Selalu cek untuk null atau string kosong pada kolom yang wajib diisi".

Pertanyaannya adalah, mengapa hal tersebut harus dilakukan ?
Jawabannya simple (seperti yang telah saya uraikan diatas), hal tersebut adalah untuk menghindari error untuk script selanjutnya, apalagi script selanjutnya itu membutuhkan nilai dari kolom tersebut untuk keperluan yang lainnya.

Syntax untuk tips ini adalah menggunakan statement IF, anda bisa gunakan statement IF tunggal ataupun multi line, statement IF tunggal digunakan jika nilai suatu kondisi True tapi tidak ada yang harus dilakukan, sedangkan statement IF multi line digunakan jika nilai suatu kondisi True ada action yang dilakukan, misalnya sebuah pesan peringatan atau action yang lainnya.
Contohnya sebagai berikut (cek null atau string kosong pada singlelineedit yang bernama sle_1):

1. Statement IF tunggal
1a. Hanya cek null atau string kosong pada sle_1
IF IsNull(sle_1.Text) OR Trim(sle_1.Text, True) = "" THEN Return
1b. Nilai data dalam sle_1 itu minimal 5 karakter
IF IsNull(sle_1.Text) OR LenA(Trim(sle_1.Text, True)) < 5 THEN Return

2. Statement IF multi line
2a. Hanya cek null atau string kosong pada sle_1
IF IsNull(sle_1.Text) OR Trim(sle_1.Text, True) = "" THEN
MessageBox("Required", "Data tidak boleh kosong.", Exclamation!)
sle_1.SetFocus()
Return
END IF
2b. Nilai data dalam sle_1 itu minimal 3 karakter
IF IsNull(sle_1.Text) OR LenA(Trim(sle_1.Text, True)) < 3 THEN
MessageBox("Required", "Data tidak boleh kurang dari 3 karakter.", Exclamation!)
sle_1.SetFocus()
Return
END IF

Penjelasan:
  • Trim(sle_1.Text, True) -> Menghilangkan karakter spasi diawal dan diakhir string, True mengindikasikan semua karakter yang dianggap spasi oleh PowerBuilder, misalnya Tab
  • LenA(Trim(sle_1.Text, True)) -> Menghitung jumlah karakter dalam string, dengan terlebih dahulu menghilangkan karakter spasi diawal dan diakhir string
  • Return -> Menghentikan eksekusi script, sehingga script dibawah statement IF ini tidak akan dieksekusi.
  • 1a -> Script tersebut hanya mengecek nilai null atau string kosong, jika True maka tidak akan ada action apa-apa.
  • 1b -> Script tersebut mengecek nilai null atau string dalam sle_1 itu ada berapa karakter, jika True (null atau jumlah karakter yang diinput kurang dari 5) maka tidak akan ada action apa-apa.
  • 2a -> Script tersebut hanya mengecek nilai null atau string kosong, jika True maka akan ditampilkan pesan peringatan "Data tidak boleh kosong."
  • 2b -> Script tersebut mengecek nilai null atau string dalam sle_1 itu ada berapa karakter, jika True (null atau jumlah karakter yang diinput kurang dari 3) maka akan ditampilkan pesan peringatan "Data tidak boleh kurang dari 3 karakter."
  • Jika kondisinya bernilai False (tidak null atau kosong atau jumlah karakternya sesuai dengan yang kita inginkan), maka statement IF ini akan dilewati oleh PowerBuilder, dan langsung mengeksekusi script dibawah statement IF ini.
Untuk contoh samplenya bisa anda download di halaman Sample

Ini hanyalah salah satu tips untuk anda, yang mungkin anda sudah mengetahuinya, simple memang, tapi kalau ada yang simple mengapa harus susah payah membuat yang ribet ?

Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.

Kamis, 18 September 2014

Validasi Karakter


Dalam postingan ini, sebelum saya mulai memposting tutorial membuat program, saya ingin memberikan trik mengenai cara memvalidasi karakter yang diinput dalam SingleLineEdit.
Maksud dari trik ini adalah agar User yang menggunakan program mengetik atau memasukkan karakter yang sesuai dengan kebutuhan, misalnya untuk keperluan penginputan Username, yang biasanya username itu hanya boleh berupa Huruf dan/atau Angka saja, atau mungkin jika kita ingin disebuah kolom tidak boleh ada spasi dan lain sebagainya.

Trik ini (sesuai dengan judulnya Validasi Karakter) akan dieksekusi bukan pada saat User mengetik pada keyboardnya, melainkan pada event lainnya, misalnya pada event Clicked di command button.
Di lain kesempatan saya akan jabarkan trik yang langsung memvalidasi karakter pada saat User mengetik di keyboardnya.

Trik ini menggunakan Looping FOR... NEXT
berikut ini adalah contoh codingnya untuk validasi hanya karakter Huruf yang diperbolehkan dalam sle_1:

string ls_valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // validasi karakter
integer li_pos // looping
integer li_ok = 0 // 0 = OK, >0 = ada karakter yang tidak sesuai validasi karakter
char lc_test // karakter yang akan dicek

// cek null atau string kosong, jika true jangan lakukan apa-apa
IF IsNull(sle_1.Text) OR Trim(sle_1.Text, True) = "" THEN Return
// looping untuk mendapatkan karakter yang akan dicek
FOR li_pos = 1 TO LenA(sle_1.Text)
lc_test = Char(MidA(sle_1.Text, li_pos, LenA(sle_1.Text)))
IF PosA(ls_valid, lc_test) = 0 THEN // ada karakter yang tidak sesuai dengan validasi
li_ok ++
Exit
END IF
NEXT

IF li_ok > 0 THEN
MessageBox("Ilegal", "Ada karakter yang tidak diperbolehkan.", Exclamation!)
ELSE
MessageBox("OK", "Semua karakter sesuai dengan validasinya.")
END IF

ls_valid = Karakter yang diperbolehkan
li_pos = Untuk keperluan loop
li_ok = Status karakter, dimana selain 0 berarti ada karakter yang tidak termasuk didalam ls_valid
lc_test = Karakter-karakter yang diinput
Untuk contoh samplenya bisa anda download di halaman Sample

Ini hanyalah salah satu trik untuk anda, simple memang, tapi kalau ada yang simple mengapa harus susah payah membuat yang ribet ?

Akhir kata, semoga sukses untuk semua yang sedang dan akan anda lakukan.
 

Term Of Service

Untuk mengetahui tentang penggunaan blog ini, silahkan buka halaman Term Of Service atau klik TOS untuk langsung membuka halaman Term Of Service

Privacy Policy

Untuk mengetahui kebijakan privacy dalam blog ini, silahkan buka halaman Privacy Policy atau klik Disini untuk langsung membuka halaman Privacy Policy