Aplikasi Pencatat “User Online” menggunakan Firebird

June 21, 2006 at 2:21 pm | Posted in Code Samples, Database, Tutorials | 7 Comments

by: Muhammad Lulud K.

Artikel ini terinspirasi dari aplikasi pencatat jumlah user yang sedang online yang ada pada aplikasi cms php-mysql. Manfaat dari aplikasi ini diantarnya untuk melihat dan membatasi jumlah user yang sedang online. Aplikasi ini menggunakan database firebird dan client pada Delphi. Fungsi UDF datetodouble yang digunakan dalam script SP berasal dari rfunc.

Algoritma script SP firebird adalah sbb:
1. Tentukan limit waktu client terhitung online.
2. Daftarkan alamat IP (dan modul) beserta waktu terakhir aktif ke tabel.
3. Hapus dalam tabel record2 yang waktu terakhir koneksi lebih dari limit waktu yang ditentukan.
4. Hitung jumlah user client yang aktif.

Algoritma client adalah sbb:
1. Buat koneksi database ke server.
2. Eksekusi store procedure.
3. Dapatkan jumlah user online
4. dst..

Langsung aja yach. Ikuti langkah berikut:

1. Buat tabel

CREATE TABLE SYS_USER_ONLINE (
  TIME_STAMP   TIMESTAMP DEFAULT current_timestamp NOT NULL,
  IP_ADDRESS   VARCHAR(15) NOT NULL,
  FILE_SCRIPT  VARCHAR(100)
);

ALTER TABLE SYS_USER_ONLINE
  ADD CONSTRAINT PK_SYS_USER_ONLINE
  PRIMARY KEY (TIME_STAMP, IP_ADDRESS);

CREATE INDEX SYS_USER_ONLINE_IDX1 ON SYS_USER_ONLINE (IP_ADDRESS);
CREATE INDEX SYS_USER_ONLINE_IDX2 ON SYS_USER_ONLINE (FILE_SCRIPT);

2. Buat stored procedure

CREATE PROCEDURE SP_SYS_USER_ONLINE_COUNT (
  IP_ADDRESS VARCHAR(15),
  FILE_SCRIPT VARCHAR(100))
RETURNS (VAR_COUNT INTEGER)
AS
  DECLARE VARIABLE TIME_OUT_SECONDS NUMERIC(15,4);
  DECLARE VARIABLE TIME_OUT NUMERIC(15,4);
  DECLARE VARIABLE CT TIMESTAMP;
begin
  time_out_seconds = 0.004;
  time_out = datetodouble(current_timestamp) - time_out_seconds;

  delete from sys_user_online a
  where a.ip_address =:ip_address and a.file_script =:file_script;

  insert into sys_user_online (time_stamp, ip_address, file_script)
  values (current_timestamp, :ip_address, :file_script);

  delete from sys_user_online a
  where datetodouble(a.time_stamp) <:time_out;

  select count(distinct a.ip_address) from sys_user_online a
  into :var_count;

  /* alternatif lain
  bila ingin mengecek jumlah user aktif per modul
  select count(distinct a.ip_address) from sys_user_online a
  where a.file_script  = :file_script
  into :var_count; */

  suspend;
end

OK… anda siap menggunakan SP ini:

function TForm1.GetIPAddress: string;
begin
  Result := IdIPWatch.LocalIP;

  { Drop komponen IdIPWatch dari Indy ke form atau Anda gunakan
    fungsi lain untuk mendapatkan IP Address, atau gunakan unit
    winhwid.pas pada artikel sebelumnya }
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  with spUserOnlineCount do
  begin
    ParamByName('IP_ADDRESS').AsString := GetIPAddress;
    ParamByName('FILE_SCRIPT').AsString := Self.ClassName;

    // Self.ClassName adalah nama form yang aktif
    ExecProc;
    StatusBar1.Panels[0].Text := ParamByName('VAR_COUNT').AsString;
  end;
end;

Semoga bermanfaat.

7 Comments »

RSS feed for comments on this post. TrackBack URI

  1. Mas ada gak VCL buat Firebird 2 ? paling males kalau pake DLL yang diambl dari FB neeh >.

  2. @Yuniar:
    dbExpress? ODBC? Zeos? FIB? masih kurang? googling ajah. Perasaan VCL buat Firebird banyak deh.

  3. Tambahan, pakai Mercury persis seperti component Interbase bawaan Delphi

  4. wew, screenshut hasilnya donk bos,😀

  5. Mas, kalo pembahasan di atas khan untuk firebird…! Gimana kalo tentang interbase?
    Saya udah coba konek ke komputer lain dengan cara
    lewat Delphi, tapi ga konek?
    Saya konek pake…
    SERVER NAME=192.1.1.192/share/employee.GDB
    USER NAME=SYSDBA
    PASSWORD=masterkey

    Muncul warning:
    “Unknown database…Unable to complete network request to host “192.1.1.192”….


    the target machine actively refuse it”
    Gimana dong?
    Mohon penjelasan dari Mbah..eh mass?
    Thanks ya

  6. untuk mas josh
    ganti
    SERVER NAME=192.1.1.192/share/employee.GDB
    menjadi
    SERVER NAME=192.1.1.192:c:\share\employee.GDB

    c:\share\employee.GDB –> tempat menyimpan file anda

  7. kalo kita gunain database kyak oracle ato mysql bisa ga clientnya dibeda komputer mas?? misal.. oracle di komptr A,sedangkankan kita menjalankan aplikasi delphi dari komptr B melalui jaringan LAN dan terkoneksi ke database di komputer A.. mohon dibahas dunk mas:D


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: