Cara Lain dalam SQL Debugging

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:

sqldebug.JPG

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?