Social Icons

google plustwitterfacebookinstagramlinkedinrss feedcontact me

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.
 

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