Banyak cara untuk menguji apakah skrip SQL yang dieksekusi oleh client sudah benar atau tidak. Mengapa harus diuji? Karena programer juga manusia, bisa berbuat kesalahan. Teknik debugging atau tracing terkadang unik di antara para programmer. Programer bahkan menyukai menggunakan suatu teknik debugging lain yang sebenarnya sudah disediakan oleh IDE. Ide SQL debugging kali ini adalah bagaimana menampilkan skrip SQL yang di eksekusi oleh client pada saat runtime, seperti tampak pada gambar berikut:
Saya membuat 3 unit:
Unit 1: Unit SQLDebug adalah form untuk menampilkan skrip SQL yang diinginkan. Form ini hanya memiliki prosedur seperti di bawah berikut:
implementation uses fncDatabase; {$R *.dfm} procedure TfrmSQLDebug.FormActivate(Sender: TObject); begin Memo1.Clear; Memo1.Lines.Add(SQLDebugText); end; end.
Unit 2: Unit fncDatabase memiliki semacam fungsi untuk membentuk skrip SQL (SQL Generator) dan fungsi tersebut memiliki parameter yang menentukan apakah SQL debugging akan dijalankan atau tidak. Di dalam prosedur berikut terdapat prosedur lain yang tidak saya tampilkan seperti DBConnect, Transaction, dan SQLQuery agar menghemat tempat. Ini adalah contoh prosedur SQLSelect yang berguna untuk melaksanakan perintah SQL ‘Select’:
procedure SQLSelect(sTable, sField, sCriteria, Debug: String); begin DBConnect; if DB.Connected then begin try Transaction.StartTransaction; with SQLQuery do begin Close; SQL.Clear; SQL.Add('SELECT '+sField+' FROM '+sTable+' '+sCriteria); if Debug = 'Debug' then ShowSQLDebug(); Prepare; ExecQuery; { Transaction.Commit tidak diletakkan disini agar StringGrid mampu membaca semua record terlebih dahulu } end; except begin Transaction.Rollback; raise; end; end; end; end; procedure ShowSQLDebug(); begin SQlDebugText := Trim(SQLQuery.SQL.Text); frmSQLDebug.ShowModal; end;
Unit 3: Unit ini merupakan bagian dari proses bisnis, misalnya proses menampilkan record database ke dalam StringGrid dengan perintah SQL ‘Select’. Unit ini akan menjalankan prosedur SQLSelect di atas dalam sebuah event (misalnya onActivate):
sTable := 'GL_PERIODS'; sField := '*'; sCriteria := 'order by UID,GLYEAR,GLPERIOD'; SQLSelect(sTable, sField, sCriteria, 'Debug'); {Buat disini kode untuk menampilkan records ke dalam StringGrid} Transaction.Commit; { Saya menggunakan VisualTreeview sebagai StringGrid yang meminta Transaction.commit dijalankan setelah semua record telah masuk ke dalam StringGrid } DBDisconnect;
Variable sTable, sField, dan sCriteria dibuat agar fleksibel bila digunakan pada sebuah conditional statement (if, for, while, case, dsb). Perhatikan parameter terakhir dari SQLSelect, disitu tertulis ‘Debug’. Parameter ini bila diganti dengan ‘NoDebug’ maka form SQLDebug tidak muncul. Kenapa parameter terakhir tidak bertipe Boolean? Karena saya lebih suka menggunakan String yang diberi warna merah sehingga lebih mudah tertangkap mata.
Ada ide lain yang implementasinya lebih sederhana?