Kusnassriyanto

Just another WordPress.com weblog

Bug berbahaya PostgreSQL+Zeos+Delphi

leave a comment »

Kemarin satu-dua jam saya cari-cari bug yang menyebabkan objek yang saya buat tidak bisa menembus unit test. Cukup lama mencarinya karene bugnya kecil dan kejadiannya jarang sekali. Tetapi akibatnya bisa sangat berbahaya. Untung saya pakai unit test sehingga bug seperti ini bisa terekspose.

Saya menggunakan PostgreSQL sebagai databasenya, Delphi 2007 sebagai Devtool-nya, serta komponen Zeos versi 6.6.5-stable.
Problemnya ada pada sql yang bentuknya kurang lebih seperti ini

update myproduk set balance = balance-:amount where idproduk = :idproduk

Tidak ada yang aneh dari sql tersebut. Saya hanya mengurangi field balance dengan suatu nilai tertentu. Problem utamanya ada pada tanda – (minus). Perhatikan bahwa antara tanda minus dan :amount tidak diselingi spasi. Ini yang menjadi masalah.
Bila pada parameter :amount saya lewatkan nilai positif tidak jadi masalah. Tetapi bila saya lewatkan nilai negatif maka nilai balance tidak berubah. Cukup aneh!
Saya menduga (dan ternyata memang benar) bila parameter sql amount tersebut saya isi dengan -100 dan idproduk dengan 1, misalnya, maka perintah tersebut akan dianggap seperti perintah berikut ini

update myproduk set balance = balance--100 where idproduk = 1

Seperti kita tahu, dalam SQL standard, semua yang di belakang tanda -- akan dianggap sebagai comment alias tidak dijalankan. Jadi perintah tersebut sama artinya dengan

update myproduk set balance = balance

Mungkin perintah di atas tidak terlalu berbahaya karena bug berakibat tidak ada data yang berubah. Tapi bayangkan bila yang saya masukkan adalah perintah berikut

update myproduk set balance = balance+1000-:amount where idproduk = :idproduk

Akibatnya semua balance dala tabel produk tersebut takan bertambah 1000 !!!
Solusinya sebenarnya sederhana saja, yait antara tanda minus dengan parameter :amount diberi jarak (spasi). Dan masalahnya selesai.

Berikut ini screenshot eksperimen yang saya lakukan.
Sebelum tombol Test Query dijalankan.

Setelah tombol Test Query dijalankan nilai field balance untuk semua record bertambah dengan 1000

Written by kusnassriyanto

October 14, 2010 at 3:39 am

Posted in Uncategorized

TDateTime, tipe data tanggal dan waktu di Delphi

with one comment

Kalo saya cermati, secara periodik di milis Delphi lokal selalu muncul pertanyaan tentang bagaimana menghitung selisih hari dari tanggal1 ke tanggal2.
Sebenarnya bekerja dengan tanggal sangat mudah. TDateTime, tipe data tanggal dan waktu di Delphi adalah bilangan real, dimana bagian integernya adalah jumlah hari, sedangkan nilai pecahannya adalah waktu. Angka dalam tanggal mewakili berapa hari sejak tanggal 30 Des 1899.
Bila kita ingin menghitung selisih dua buah tanggal dalam satuan hari, ya tinggal kurangkan saja.
Misalkan variabel Tgl1, Tgl2, dan selisih adalah tipe TDateTime dan Tgl1 dan Tgl2 sudah terisi, maka untuk menghitung selisih waktu adalah sebagai berikut

  selisih := Tgl1-Tgl2;


Karena TDateTime adalah bilangan real, maka fungsi-fungsi yang bekerja terhadap bilangan real juga dapat bekerja terhadap variabel tipe ini. Misalnya fungsi Trunc, untuk mengambil nilai integer dari suatu bilangan real dapat bekerja terhadap TDateTime untuk mengambil hanya tanggalnya saja.
Demikian juga bila kita ingin membuang tanggalnya dan hanya mengambil waktunya saja, kita bisa menggunakan fungsi Fract yang sudah tersedia di Delphi.
Contoh lainnya misalnya function Round juga dapat digunakan untuk membulatkan hari. Sebelum jam 12 siang akan ikut hari ini dan setelah jam 12 siang akan ikut besok.

Menginisialisasi variabel TDateTime dengan nilai jam sangatlah mudah. Malah tanpa perlu menggunakan function apapun.

// variabel X diisi dengan 1 jam
  X := 1/24;
// variabel X diisi dengan 11 jam
  X := 11/24;
// variabel X diisi dengan 15 menit (atau 1/4 jam)
  X := 1/(4*24);
// variabel X diisi dengan 1 menit
  X := 1/(24*60);


Delphi sendiri juga menyediakan banyak sekali fungsi terkait DateTime, yang di Delphi Help bisa dicari dengan kata kunci Datetime routines.

Written by kusnassriyanto

February 23, 2010 at 2:56 am

Posted in Uncategorized

Tagged with , ,

Konversi dari jam (number) menjadi format hh:mm:ss di Oracle

with 6 comments

Hari ini lagi bikin report pake tools bikinan sendiri dan dengan database oracle.
Salah satu yang dibutuhkan adalah menampilkan data jam menjadi format hh:mm:ss. Misalnya 7.5 jam harus ditampilkan menjadi 07:30:00 atau bisa juga 7 jam 30 min 0 det. Karena satu dan lain hal, saya pengen formatingnya dilakukan di level perintah SQL. Feeling saya sih bilang harusnya gak susah.
Nanya ke mbah Google belum ketemu cara yang cukup mudah. Merenung sebentar kemudian googling dikit, akhirnya ketemu :


select to_char(trunc(current_date)+10.5/24, 'hh24:mi:ss')
  from dual;

Perhatikan angka 10.5 adalah jam yang ingin dikonversi.

hasilnya adalah 10:30:00

Cara bekerjanya seperti ini : Read the rest of this entry »

Written by kusnassriyanto

February 2, 2010 at 10:11 am

Posted in Uncategorized

Tagged with , ,

Revisi buku Teknik Pemrograman Delphi

with 24 comments

Cover depan dan belakang

Cover depan dan belakang


Sebenarnya buku ini sudah dirilis sejak beberapa bulan lalu. Tetapi karena kesibukan, baru hari Senin kemarin saya sempat mengambil sample-nya dari Penerbit Informatika.

Buku ini adalah edisi revisi dari versi sebelumnya. Beberapa hal terkait tipe dan struktur data dibahas secara lebih mendalam, yaitu long string, array, termasuk array statis dan array dinamik, record serta pointer.

Delphi memperlakukan long string dan dynamic array dengan perlakuan yang sangat mirip. Keduanya disimpan dalam memory secara dynamik dan menggunakan teknik reference counting sebagai ‘garbage collection’-nya. Dalam pembahasannya dilengkapi dengan ilustrasi yang menggambarkan representasi internal mereka.

Salah satu topik dalam pemrograman yang sering merepotkan, khususnya bagi programmer pemula, adalah penggunaan pointer. Dalam buku ini, pembahasan tentang pointer juga dilengkapi dengan ilustrasi sehingga diharapkan dapat lebih mudah dipahami.

Frame dalam Delphi adalah salah cara untuk meningkatkan reusability di level aplikasi. Dengan frame, susunan suatu blok dalam form, beserta mekanisme kerjanya, dapat digunakan ulang dalam form yang lain. Bila digunakan secara tepat, frame dapat mengurangi development effort secara signifikan. Mesikipun demikian, frame juga memiliki kelemahan dan kendala dalam implementasinya. Buku ini membahas frame secara cukup mendetil.

Tambahan terbesar dalam buku ini adalah reporting yang dibahas secara khusus dalam satu Bab. Ada dua tools reporting yang dibahas, yaitu Quick Report dan Fast Report.
Pembahasan diawali dengan mendefinisikan persyaratan (requirements) report yang akan dibuat. Selanjutnya akan dibahas bagaimanan mempersiapkan dataset yang akan digunakan. Baru kemudian dibahas bagaimana membuat report-report yang sudah disebutkan, menggunakan Quick Report dan Fast Report.

Buku ini bisa diperoleh di toko-toko buku terdekat atau bisa dipesan disini toko BI-Obses. (Tapi saya belum pernah mencoba memesan secara online).

Semoga buku ini bermanfaat.

Written by kusnassriyanto

February 22, 2009 at 3:58 pm

Posted in Uncategorized

Tagged with ,

Follow

Get every new post delivered to your Inbox.