Monthly Archiv: February, 2013

Terjadi error “Unit XXX was compiled with a different version of YYY”, bagaimana solusinya?

Pada saat mengompile contoh project Indy tiba-tiba kita mendapatkan pesan error seperti gambar diatas, bagaimana cara mengatasinya?

Hal tersebut terjadi karena unit yang dibutuhkan project tersebut ada namun dicompile dengan menggunakan versi yang berbeda.

Pada contoh diatas terjadi karena unit SockApp.dcu dicompile bergantung pada unit IdTCPServer.dcu punya Indy9,  sedangkan path IdTCPServer.dcu yang terdaftar di library delphi adalah Indy10 (ada 2 versi Indy yang terinstall).

Solusi pertama adalah merubah alamat Indy yang digunakan pada path Library.

Namun bila kita tidak ingin merubahnya dan ingin tetap menjadikan Indy10 sebagai default (versi lebih baru, lebih banyak fitur), solusinya adalah dengan menambahkan search path khusus project tersebut.

Caranya masuk menu Project-Option dan masukkan alamat Indy9 seperti pada gambar berikut.

Solusi ini bukan hanya untuk indy namun juga untuk unit/komponen lain yang kebetulan mempunyai nama yang sama namun beda versi.

 

Semoga bermanfaat.

Contoh aplikasi validasi input pada interbase

Dalam menyimpan data kedalam database ada kalanya kita perlu untuk memvalidasi dulu sebelum benar-benar menyimpannya.
Misalnya data baru disimpan setelah semua/sebagian field diisi seperti gambar dibawah ini:
Alamat belum diisi
Tanggal diluar range

Untuk membuat record tidak bisa disimpan bila field belum diisi caranya dengan menambahkan klausa NOT NULL (saya yakin tidak asing lagi).

CREATE TABLE BIODATA (
    ID               INTEGER NOT NULL,
    "Nama Lengkap"   VARCHAR(30) CHARACTER SET NONE NOT NULL,
    "Alamat"         VARCHAR(50) CHARACTER SET NONE NOT NULL,
    "Tanggal Lahir"  DATE DEFAULT CURRENT_DATE NOT NULL
);

Sedangkan untuk membatasi input Tanggal kita menggunakan Check constraint.

ALTER TABLE BIODATA ADD CONSTRAINT "mulai 01/01/1910 s/d hari ini" CHECK ("Tanggal Lahir" between '01.01.1910' and current_date);

Pada sisi Delphinya untuk keperluan tersebut diatas kita memanfaatkan event OnFIBErrorEvent pada TpFibErrorHandler (komponen FIBPlus) dan OnPostError punya DataSet.

procedure TForm1.pFibEHFIBErrorEvent(Sender: TObject; ErrorValue: EFIBError;
  KindIBError: TKindIBError; var DoRaise: Boolean);
var
   s: string;
begin
     s:=ErrorValue.IBMessage;
     case ErrorValue.IBErrorCode of
          335544347: // Not Null
            begin
                 // Validation error for column Alamat, value "*** null ***".
                 Delete(s,1,pos('column',s)+6); // hapus .. column
                 SetLength(s,pos(', value',s)-1); // ambil nama fieldnya
                 CariDBEdit(s); // fokus ke field ybs
            end;
          335544558: // Check
            begin
                 // Operation violates CHECK constraint mulai 01/01/1910 s/d hari ini on view or table BIODATA.
                 Delete(s,1,pos('constraint',s)+10); // hapus .. constraint
                 SetLength(s,pos('on view',s)-1); // ambil pesannya aja
                 DBEdit3.SetFocus; // fokus manual krn sdh pasti
                 ShowInfo(DBEdit3,s); // tampilkan pesan
            end;
     else
         ShowMessage(s);
     end;
end;
procedure TForm1.tbPostError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
     Action:=daAbort;
end;

Source Code dapat didownload di https://www.box.com/s/0mmrv8i7776ikpxul06h

Semoga bermanfaat

Two Phase Commit di Interbase

Two Phase Commit berguna untuk menjamin transaksi pada 2 database atau lebih (bisa beda server) pada status commit semua atau rollback semua.

Misalnya kita mau mengurangi saldo tabungan seseorang di database-1 kemudian dimasukkan ke database-2, berarti ada 2 proses yaitu mengurangi database-1 dan menambah database-2. Tiba-2 sebelum kedua proses selesai koneksi terputus, apa yang terjadi?

Kalo prosesnya mengurangi dulu baru menambah, jelas nasabah akan rugi dan protes karena saldonya hilang, sementara kalo prosesnya menambah dulu baru mengurangi maka nasabah akan diuntungkan dan koperasi/bank rugi.

Dengan adanya fitur Two Phase Commit kejadian seperti kasus diatas dapat dihindari, hanya ada dua kondisi transfer berhasil atau gagal. Saldo pindah dari database-1 ke database-2 atau tetap pada posisi semua bila ada masalah.

Two Phase commit ini juga sangat berperan dalam proses replikasi/sinkronisasi data antar database/antar cabang, sehingga dapat dijamin akurasi datanya.

Contoh implementasi Two Phase Comit pada coding delphi menyusul.