Social Icons

google plustwitterfacebookinstagramlinkedinrss feedcontact me

Featured Posts

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.

Jumat, 17 Oktober 2014

Membuat Tombol Enter Seperti Tombol Tab

Dari sekian banyak yang memberikan trik tentang cara untuk membuat Tombol Enter menjadi seperti tombol Tab dalam datawindow, saya menemukan satu trik yang paling simple, yaitu disini: Make the Enter key act as TAB Key.
Memang sih untuk trik dari yang lain ada penambahan kondisi lainnya, misalnya kombinasi tombol Ctrl/Shift dengan tombol Enter, namun tentunya dengan adanya penambahan kondisi tersebut, script codenya akan bertambah panjang, walaupun ada yang tinggal di copy-paste script codenya, sehingga anda tidak perlu repot-repot mengetik ulang script code tersebut, dan jika anda melakukan itu (tinggal copy-paste scriptnya) sebenarnya hal itu akan membuat anda tidak mengetahui alur dari script code tersebut, belum lagi jika yang memberikan script code tersebut tidak sengaja lupa untuk memasukkan variable atau yang lainnya yang dibutuhkan dalam script code tersebut, sehingga ketika anda coba untuk menyimpannya, sudah pasti akan terjadi error, kalau cuma variable error sih, kita tinggal mendeklarasikan variable tersebut, namun jika yang terjadi adalah Syntax Error, tentunya hal ini akan membuat anda "sedikit" kebingungan, karena yang merancang script code tersebut bukanlah anda sendiri. Hal lain yang membuat saya sangat tidak menyarankan anda untuk hanya mengcopy-paste script code adalah, biasanya gaya penulisan script code dari masing-masing orang itu berbeda-beda, dan belum tentu gaya penulisan script code dari sumber yang anda copy-paste itu sama dengan gaya penulisan script code anda, tentunya hal ini akan semakin "memperjelas" jika program yang anda buat tidak murni buatan anda sendiri. Namun itu semua hanya pendapat saya pribadi dan bukan untuk diperdebatkan.

Balik lagi ke tulisan Membuat Tombol Enter Seperti Tombol Tab, trik yang saya dapatkan hanya membuat penekanan tombol Enter akan seperti penekanan tombol Tab dan tanpa adanya kombinasi denagn tombol yang lain, dimana defaultnya pada datawindow jika kita menejan tombol Enter maka data akan berpindah ke baris berikutnya, sedangkan jika kita menekan tombol Tab maka kursor akan berpindah ke kolom berikutnya dalam baris yang sama.

Untuk langkah-langkahnya adalah sebagai berikut:
  • Buat sebuah Event baru pada Datawindow yang anda inginkan, misalnya dengan nama dw_ue_enter
  • Pada pilihan Event ID pilih pbm_dwnprocessenter (untuk properti yang lain diabaikan saja karena secara otomatis Powerbuilder akan memasukkan properti lain yang dibutuhkan sesuai dengan Event ID tersebut).
  • Pada Code Painter masukkan script berikut ini:
Send(Handle(This), 256, 9, Long(0, 0))
Return 1

Simpan Event tersebut, lalu tes hasilnya apakah sudah sesuai atau belum (Penekanan tombol Enter akan membuat kursor berpindah kolom dan bukan berpindah data/baris)

Demikianlah trik sederhana kali 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. 
 

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