05 April 2009

Mengembalikan Kontrol Turunan (Inherited) pada Keadaan Semula

Delphi mendukung penuh pemrograman berorientasi obyek (Object Oriented Programming/OOP). Dengan OOP hidup bisa jauh lebih mudah. Salah satu inti dari OOP adalah inheritance, yang memungkinan suatu obyek diturunkan menjadi obyek baru. Obyek yang diturunkan mewarisi semua method dan properti yang dipunyai obyek yang menurunkan. Meski begitu banyak yang belum menyadari ini atau banyak pula yang enggan memakai fitur ini dengan alasan susah, rumit, malas belajar dan lain sebagainya. Padahal dengan mengetahui atau bahkan menguasainya, pengembangan aplikasi, terutama seiring perkembangan aplikasi yang semakin kompleks, penggunaan OOP bisa sangat membantu kita.
Sifat inheritance pada Delphi berlaku pula pada form (Visual Form Inheritance). Jika kita mempunyai form dengan nama Form1 yang mempunyai kontrol Button1, Edit1, Label1 dan mempunyai form lain dengan nama Form2 yang diturunkan dari Form1, maka pada Form2 otomatis juga akan terdapat kontrol Button1, Edit1, Label1, dengan properti yang sama pula (Left, Top, Width, Height, dan lain-lain). Intinya Form2 merupakan hasil “salinan” dari Form1 yang menurunkannya.
Mungkin suatu waktu kita pernah melakukan kesalahan secara tidak sengaja mengubah atau memindah suatu kontrol dari form turunan, dan ingin mengembalikan kontrol tersebut ke kondisi semula seperti kondisi pada form yang menurunkannya. Untungnya pada Delphi ini adalah hal mudah. Inilah langkah-langkahnya.
  1. Pada IDE Delphi, tentukan form turunan yang ingin dikembalikan dan buka form tersebut.
  2. Selanjutnya tentukan kontrol yang ingin dikembalikan kondisinya.
  3. Pada kontrol tersebut klik kanan dan pilih “Revert to Inherited”.



Baca selengkapnya...

04 April 2009

Masalah Kegemukan pada Program Delphi

Ketik sana ketik sini, compile program, ok, dan jadilah satu program aplikasi (exe) pada Delphi. Mudah, simpel, karena semua komponen, unit, form yang kita buat dilebur jadi satu menjadi sebuah file executable. File jadi berukuran besar untuk program yang kompleks dan butuh berbagai macam komponen. Memang bagi sebagian orang tidak masalah, tapi tidak dengan aku. Ukuran file yang besarnya hingga belasan MB sulit didistribusikan ke client apalagi tempatnya berjauhan, di luar kota bahkan ada yang di luar pulau. Dikirim melalui paket baru bisa sampai besoknya belum lagi biaya yang bisa melebihi penghasilan jika kirim berulang-ulang. Istilahnya lebih besar pasak dari pada tiang, bisa-bisa bukannya mendapatkan keuntungan malah ngutang melulu.
Untuk mengatasi masalah ini, biasanya aku mengirimkan file menggunakan akses internet. Inipun juga bermasalah, soal ukuran yang relatif besar jika di upload. Apalagi dengan akses internet yang “angin-anginan” dan “pas-pasan”, bisa-bisa nggak nyampai ke tujuan sampe hari kiamat. Waduh repot juga yah, sudah jadi masalah cukup lama bagi aku.


















Untungnya hal tersebut kini bisa teratasi. Program Delphi ternyata bisa dipecah. Untuk komponen pendukung tidak jadi satu dengan file executable. Jika kita pernah mendengar istilah “package” atau Borland Package Library (BPL), bisa jadi ini adalah solusi bagi anda yang mengalami masalah sama dengan aku dulunya. Semua komponen yang kita pakai di Delphi merupakan package. Jika kita memakai komponen TForm, TEdit, dan lain sebagainya, tanpa disadari kita memakai package. Jadi package ini sama seperti DLL, tapi hanya bisa diakses dari lingkungan Delphi.
Perbedaan ukuran file sebelum dan sesudah memakai cara ini sangat signifikan. Dari ukuran yang dulunya sampai belasan MB kini tidak sampai 2 MB. Package itu sendiri merupakan file terpisah yang mempunyai ekstensi .bpl dan sudah tersedia jika kita mengistall Delphi atau jika kita menginstall komponen lain. Package dari Delphi biasanya terdapat pada direktori “$(DELPHI)\Bin”.
Prakteknya kita akan mencoba membuat aplikasi baru di Delphi. Disini kita akan coba membuat aplikasi kosong dan membandingkan ukurannya jika komponen/package dijadikan satu atau terpisah dengan file executable yang kita buat. Jika kita compile aplikasi kosong tersebut dan melihat ukuran file exe yang dihasilkan, kira-kira akan berukuran sekitar 359 KB (Delphi 7). Kemudian dari menu Project->Options dari tab Packages centang pilihan “Build with runtime packages”, tekan OK dan compile ulang. Jika kita lihat ukuran file exe yang dihasilkan akan menjadi sekitar 16,5 KB!
Proses compile pertama yang menghasilkan file exe yang besar itu dinamakan static linking, dimana semua kode-kode program yang dibutuhkan aplikasi dijadikan satu oleh proses linking menjadi satu file dan ini yang menjadi pilihan default waktu kita membuat aplikasi baru. Proses kedua yang menghasilkan file exe yang lebih kecil dinamakan dynamic linking yang mirip dengan DLL standar. Pada dynamic linking, package yang diperlukan akan diload pada saat diperlukan. Dan perlu kita ketahui proses dynamic linking tersebut dijalankan secara otomatis tanpa diperlukan tambahan kode program. Proses distribusi aplikasi dengan dynamic linking perlu menyertakan file package (*.bpl) yang diperlukan secara terpisah dan diletakkan pada suatu direktori yang terdaftar pada environment variables.

Baca selengkapnya...

03 April 2009

Mengganti Authentication Mode pada SQL Server dari Skrip SQL

Buat komputer lokal bisa set Authentication Mode dengan akses registry dari Delphi, terus gimana kalo akses dari komputer lain? Salah satu cara adalah dengan menggunakan extended stored procedure. Extended stored procedure yang diperlukan adalah xp_regread dan xp_regwrite yang tidak didokumentasikan tapi ada pada database master. Langkahnya sama dengan posting sebelumnya. Berikut ini adalah stored procedure untuk membaca dan mengganti nilai dari registry. Stored procedure dengan nama uspSetSQLServerAuthMode mempunyai satu parameter tipe integer. Jika parameter tersebut diisi 1 maka modenya adalah SQL Server and Windows Authentication mode, selain nilai 1 modenya adalah Windows Authentication mode.
CREATE PROCEDURE uspSetSQLServerAuthMode(@MixedMode INT)
AS
BEGIN
  DECLARE @InstanceName VARCHAR(100)
  DECLARE @Key VARCHAR(150)
  DECLARE @LoginMode INT

  EXEC master..xp_regread 'HKEY_LOCAL_MACHINE',
    'Software\Microsoft\Microsoft SQL Server\Instance Names\SQL\',
    'MSSQLSERVER', @InstanceName OUTPUT
  SET @Key = 'Software\Microsoft\Microsoft SQL Server\' + @InstanceName + '\MSSQLServer\'
  IF @MixedMode = 1
    SET @LoginMode = 2
  ELSE
    SET @LoginMode = 1
  EXEC master..xp_regwrite 'HKEY_LOCAL_MACHINE', @Key,
    'LoginMode', 'REG_DWORD', @LoginMode
END

Baca selengkapnya...

02 April 2009

Mengganti Authentication Mode pada SQL Server dari Program

Trik berikut bisa dilakukan pada SQL Server 2008 dan mungkin juga SQL Server 2005, tapi tidak pada SQL Server 2000. Kita tahu pada SQL Server terdapat dua mode untuk otentikasi, yaitu Windows Authentication dan SQL Server Authentication. Jika kita klik kanan pada SQL Server Management Studio kemudian pilih Properties dan pada bagian Security kita bisa melihat ada pilihan Server Authentication. Ada dua pilihan, Windows Authentication mode atau SQL Server and Windows Authentication mode. Dari sini jelas bahwa jika kita pilih Windows Authentication mode, maka kita hanya bisa login dengan mode Windows Authentication saja. Jika kita pilih SQL Server and Windows Authentication mode, kita bisa memilih salah satu dari mode login tersebut.
Mungkin masih banyak dari kita yang memilih menggunakan SQL Server Authentication untuk koneksi ke SQL Server. Masalah timbul jika kita mengembangkan aplikasi dengan SQL Server dan memakai SQL Server Authentication, sedangkan instalasi SQL Server secara default pilihannya hanya Windows Authentication mode. Kita juga tidak mau merepotkan user dengan meminta user untuk mengubah mode tersebut secara manual. Bisa-bisa nanti user ngomel atau malah tidak mau menggunakan program kita. Apalagi jika pada komputer target/server hanya menggunakan Windows Authentication mode dan tidak ada SQL Server management studio.
Permasalahan ini bisa diatasi dengan menggantinya melalui program. Hal pertama yang perlu kita ketahui adalah apa yang perlu kita ubah, dan jawabannya adalah registry. Jika kita membuka registry (menu Start->Run, ketikkan “regedit”) pada HKEY_LOCAL_MACHINE terdapat key SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL. Didalam sini terdapat daftar nama instance yang ada pada komputer dengan key value-nya, dan isi dari key value ini yang kita butuhkan. Misal nama instance yang mau diganti modenya adalah “MSSQLSERVER”, dan key value-nya berisi “MSSQL10.MSSQLSERVER”. Pada key SOFTWARE\Microsoft\Microsoft SQL Server terdapat harusnya terdapat subkey dengan nama “MSSQL10.MSSQLSERVER” dan pada subkey tersebut terdapat lagi subkey “MSSQLServer”, jadi lengkapnya adalah SOFTWARE\Microsoft\Microsoft SQL\MSSQL10.MSSQLSERVER\MSSQLServer. Didalam key ini terdapat key dengan nama “LoginMode” dan inilah yang perlu kita ganti isinya. Set 1 untuk Windows Authentication mode atau 2 untuk SQL Server and Windows Authentication mode.

uses Windows, Registry;

procedure SetSQLServerAuthMode(aMixedMode: Boolean);
var
  reg: TRegistry;
  s: string;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKey('SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL', False);
    s := reg.ReadString('MSSQLServer');
    reg.CloseKey;
    reg.OpenKey('SOFTWARE\Microsoft\Microsoft SQL Server\' + s + '\MSSQLServer', False);
    if aMixedMode then reg.WriteInteger('LoginMode', 2)
    else reg.WriteInteger('LoginMode', 1);
    reg.CloseKey;
  finally
    reg.Free;
  end;
end;

Baca selengkapnya...

01 April 2009

Beberapa Hal Baru pada SQL Server 2008

Beberapa hal baru dalam SQL Server 2008 yang belum lama ini aku ketahui, merupakan perbaikan pada Transact-SQL (T-SQL). Perbaikan ini bagi aku cukup berpengaruh pada produktivitas kerja yang meningkat dan akhirnya juga mengurangi waktu pengembangan aplikasi.
Pertama adalah inisialisasi variabel dimungkinkan pada saat deklarasi variabel tersebut, jadi cukup satu baris saja untuk deklarasi dan inisialisasi variabel. Fitur ini seperti yang terdapat pada kebanyakan bahasa pemrograman seperti Delphi, C++, C#. Dengan fitur ini tidak perlu menggunakan statement DECLARE dan SET secara terpisah.
DECLARE @Harga INT = 10000;
DECLARE @Jumlah INT = 5;
DECLARE @Total INT = @Harga * @Jumlah;
Kemudian bagi yang pernah menggunakan bahasa C++/C# kemungkinan pernah memakai/mengetahui sintak seperti berikut: x += 5; yang sama seperti statement x = x + 5;. Penggunaan sintak seperti yang pertama menggunakan compound operator lebih singkat yang nantinya juga berpengaruh ke efektivitas produksi. Hal yang sama juga bisa dilakukan pada SQL Server 2008. Daftar compound operator yang didukung SQL Server 2008:
  • += Plus
  • -= Minus
  • *= Kali
  • /= Bagi
  • %= Modulo (hasil bagi)
  • &= Bitwise AND
  • |= Bitwise OR
  • ^= Bitwise XOR
Bagi yang pernah menggunakan MySQL, mestinya tahu bahwa operasi INSERT bisa dilakukan dengan mengisikan nilai lebih dari satu dengan hanya satu statement INSERT, misal: INSERT INTO tabelku (a, b,) VALUES (1, ‘satu’), (2, ‘dua’), (3, ‘tiga’). Sekarang hal yang sama juga bisa dilakukan pada SQL Server 2008. Jadi lebih singkat, lebih sedikit statement yang ditulis dan akhirnya berpengaruh ke produktivitas juga. Seperti ada seorang tokoh yang sering bilang “LEBIH CEPAT, LEBIH BAIK!”.

Baca selengkapnya...

30 Maret 2009

Asynchronous Proses pada Komponen ADO (Bagian 2)

Kita telah tahu bagaimana melakukan koneksi secara asynchronous. Bagaimana jika kita mempunyai data yang besar pada suatu tabel (10.000+ record) dan menampilkan progres berapa persen/record yang telah diproses? Dengan memakai ADO itu hal yang mudah, sama mudahnya seperti melakukan koneksi secara asynchronous seperti yang sudah dijelaskan sebelumnya. Disini yang dipakai sebagai contoh adalah komponen TADODataset. Untuk komponen lainnya, TADOTable, TADOQuery, sama saja. Supaya proses ambil data bisa dilakukan secara asynchronous, pada properti ExecuteOptions set pilihan eoAsyncFetchNonBlocking = True. Kemudian ada 2 event yang penting yaitu OnFetchProgress dan OnFetchComplete. Contoh berikut akan menggambarkan proses ambil data.
var
  RecCount: Integer;

procedure TForm1.OpenData;
begin
  ADODataSet1.CommandText := ‘SELECT COUNT(*) AS RecCount FROM tabelku’;
  ADODataSet1.Open;
  RecCount := ADODataSet1.Fields[0].AsInteger;
  ADODataSet1.Close;
  ADODataSet1.OnFetchProgress := ADODataSet1FetchProgress;
  ADODataSet1.OnFetchComplete := ADODataSet1FetchComplete;
  ADODataSet1.CommandText := ‘SELECT * FROM tabelku’;
  ADODataSet1.Open;
end;

procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
  Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Label1.Caption := IntToStr(Progress) + ‘ of ‘ + IntToStr(RecCount);
end;

procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
  const Error: Error; var EventStatus: TEventStatus);
begin
  ShowMessage(‘Proses selesai.’);
end;

Untuk proses INSERT, UPDATE, DELETE, pada properti ExecuteOptions set pilihan eoAsyncExecute = True dan event TADOConnection.OnExecuteComplete untuk mengetahui jika proses sudah selesai.

Baca selengkapnya...

28 Maret 2009

Asynchronous Proses pada Komponen ADO (Bagian 1)

Ini adalah salah satu fitur unik komponen ADO pada Delphi dimana proses koneksi ke SQL Server, melakukan operasi SELECT, INSERT, UPDATE, DELETE bisa dilakukan secara asynchronous. Pada proses asynchronous kita bisa melakukan proses lain pada saat operasi sedang berlangsung. Misalnya menampilkan suara/video pada saat melakukan koneksi atau menampilkan progres pada saat melakukan query data yang besar. Pada komponen ADO ada properti yang bisa diset untuk fitur ini, jadi tidak perlu repot harus pake thread yang rumit dan susah. Fitur ini bisa berjalan pada database SQL Server dan MySQL (sudah dites dan berjalan dengan baik) dan tidak menutup kemungkinan DBMS lainnya.
Untuk melakukan koneksi ke server, kita memerlukan komponen TADOConnection. Proses koneksi secara asynchronous bisa dilakukan dengan set properti ConnectOptions = coAsyncConnect (default = coConnectUnspecified). Misalkan kita ingin menampilkan video pada saat melakukan koneksi. File video berformat avi ini akan dijalankan dengan komponen TMediaPlayer “MediaPlayer1” pada panel “Panel1” selama proses koneksi berlangsung dan berhenti setelah koneksi berhasil.
procedure TForm1.ConnectToSQLServer;
begin
  ADOConnection1.OnConnectComplete := ADOConnection1ConnectComplete;
  ADOConnection1.Connected := True;
  MediaPlayer1.Filename := 'goyang_dombret.avi';
  MediaPlayer1.Display := Panel1;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;

procedure TForm1.ADOConnection1ConnectComplete(Connection: TADOConnection; const Error: Error; var EventStatus: TEventStatus);
begin
  MediaPlayer1.Stop;
end;

Baca selengkapnya...

27 Maret 2009

Copy Data ke SQL Server Menggunakan bcp

Pak Bos baru buat logo buat perusahaannya yang nantinya mau ditampilkan di laporan yang dipilihnya. Setelah sudah payah membuat file image dengan format bmp, kemudian menyuruh aku untuk menampilkan logo tersebut di laporan. Untuk menampilkan logo tersebut pada laporan, aku memutuskan untuk menyimpan file image tersebut di database (SQL Server). Untuk urusan transfer file ke database ga perlu repot. Ada utility dari SQL Server yaitu bcp. Bcp ini adalah utility untuk copy data antara SQL Server dan file data. Dalam kasus ini aku menggunakannya untuk copy data dari file image format bmp ke database SQL Server.
Pertama sebelum melakukan proses copy diperlukan file format yang mendeskripsikan suatu tabel tujuan. Isi file ini merupakan struktur field-field yang ada pada suatu tabel. File ini bisa kita buat sendiri atau bisa dengan menggunakan utility bcp bagi yang tidak ingin repot. Misal nama file image “fotohot.bmp” mau di copy ke database “master” tabel “fotoku” dan tabel ini hanya punya satu field yang bernama “data”. Untuk membuat file formatnya kita menjalankan perintah ini di command prompt.
bcp master.dbo.fotoku format nul -T -n -f bcp.fmt
Output dari perintah ini adalah file format “bcp.fmt”. Dibawah ini adalah ilustrasi penjelasan dari format file yang dihasilkan.








Langkah terakhir adalah meng-copy file ke tabel tujuan dengan format file yang barusan dibuat. Proses ini dilakukan dengan menjalankan perintah berikut.
bcp master.dbo.fotoku in "fotohot.bmp" -f"bcp.fmt" -T

Baca selengkapnya...