Sebuah
 kenyataan bahwa saat ini pemrograman komputer tidak lagi sebatas 
mementingkan aplikasi berjalan melainkan sudah sampai kepada bagaimana 
aplikasi tersebut ‘berinteraksi’ dengan aplikasi lain misalkan dengan 
aplikasi database. Sehingga aplikasi dapat dipasang pada beberapa 
komputer dengan menggunakan database yang sama. Tidak hanya sebatas itu,
 sesuai dengan kebutuhan dan kemampuan pengguna, maka penyediaan data 
harus dapat mendukung banyak format. Salah satunya adalah apa yang telah
 saya alami.
Saat ini saya bersama teman-teman sedang mengembangkan web based 
application untuk pengolahan data akademik, termasuk salah satu 
didalamnya adalah pengolahan data nilai. Untuk memudahkan pengguna dalam
 memasukkan nilai dan juga demi keamanan, maka saya menyusun script PHP 
yang dapat menggenerate sebuah daftar yang terdiri dari NIM, Tahun 
Akademik, Semester, Kode Matakuliah, dan Nilai dalam format file 
Microsoft Excel Worksheet. Jadi, melalui interface web dan script PHP 
yang saya buat, petugas pengisi nilai terlebih dahulu mendownload berkas
 Excel sesuai dengan matakuliah yang akan diisi nilainya. Kemudian diisi
 dan selanjutnya diupload kembali untuk dimasukkan ke dalam server. Akan
 tetapi ada beberapa masalah yang muncul. Pertama, yang jelas adalah 
masalah keamanan.
Tetapi, pada tulisan ini saya tidak akan membahas lebih jauh mengenai
 script PHP dan seluk beluknya. Mungkin pada beberapa kesempatan yang 
lain, akan saya posting tutorial PHP untuk menggenerate file Excel dari 
database, saya menggunakan database MySQL.Tulisan ini dilatarbelakangi 
oleh keinginan saya untuk memasukkan data-data yang tersimpan di dalam 
file Excel ke dalam database MySQL. Saya memilih Excel karena aplikasi 
ini paling banyak digunakan untuk menyusun daftar dalam format tabel. OK
 langsung saja pada tujuan dari tutorial kali ini. Tutorial kali ini 
bertujuan membuat aplikasi yang digunakan untuk membaca data pada file 
excel kemudian ‘memasukannya’ kedalam database MySQL menggunakan Delphi.
 Tetapi, saya akan membahasnya secara umum. Harap menyesuaikan dengan 
kebutuhan.
Pertama, saya menyiapkan sebuah database dan sebuah tabel. Saya 
asumsikan di komputer Anda sudah terinstall MySQL. Misalkan saya membuat
 database dengan nama ‘DATAKU’. Saya membuatnya melalui Console MySQL. 
Anda dapat membuatnya melalui iterface yang lain.
C:\AppServ\MySQL\bin>mysql -u root -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 6.0.4-alpha-community-log MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE DATABASE DATAKU; Query OK, 1 row affected (0.05 sec) mysql> USE DATAKU; Database changed mysql> CREATE TABLE anggota (kode_anggota varchar(10) NOT NULL default '', -> nama varchar(3) NOT NULL default '', -> alamat varchar(100) NOT NULL default '', -> PRIMARY KEY (kode_anggota)); Query OK, 0 rows affected (0.11 sec)Selanjutnya menyiapkan file Excel yang berisi data-data yang akan dimasukkan ke dalam tabel anggota. Misalkan data-datanya seperti pada gambar berikut:
- Label, dengan caption ‘Excel File’
- Edit, dengan text ‘D:\Project\Excel_To_SQL\anggota.xls’
- Memo, untuk mencatat aktivitas
- StringGrid, sebagai ‘Perantara’. Oleh karena itu, set properti Visible-nya menjadi FALSE
- Button, dengan caption ‘InjectDB’
- StatusBar
- ADOConnection, untuk melakukan koneksi
- ADOQuery, untuk mengeksekusi SQL
Sebelum membuat action ketika tombol Inject DB di klik, terlebih dahulu deklarasikan beberapa fungsi dan prosedur dibagian private declaration
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    StatusBar1: TStatusBar;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure DisplayException(Sender: TObject; E: Exception);
    function GiveRowHeader(x : Integer) : String;
    procedure LoadFromXLFile(AFileName : String; ASheetNum: Integer;
    AStringGrid:TStringGrid; var OSheetName : String);
  public
  { public declarations }
end;
Jangan lupa untuk menambahkan unit ComObj dan Excel2000 pada bagian implementationuses ComObj, Excel2000;Kemudian di bagian impelementation, lengkapi fungsi-fungsi dan prosedur tersebut:
procedure TForm1.DisplayException(Sender: TObject; E: Exception);
begin
  StatusBar1.SimpleText := E.Message;
  MessageDlg(E.Message,mtError,[MBOK],0);
end;
function TForm1.GiveRowHeader(x: Integer) : String;
begin
  if (x > 26) then
    Result := GiveRowHeader(x div 26) + GiveRowHeader(x mod 26)
  else
    Result := Chr(Ord('A') + x - 1);
end;
procedure TForm1.LoadFromXLFile
  (AFileName : String; ASheetNum: Integer; AStringGrid:TStringGrid; var OSheetName : String);
var
  ARow,
  ACol,
  i,
  j        : Integer;
  XLApp,
  XLBook,
  XLSheet  : Variant;
begin
  XLApp := CreateOLEObject('Excel.Application');
  XLApp.Visible := False;
  XLApp.Workbooks.Open(AFileName,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,0);
  XLBook := XLApp.ActiveWorkbook;
  XLSheet := XLBook.WorkSheets[ASheetNum];
  XLSheet.Activate;
  XLSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  OSheetName := XLSheet.Name;
  ARow := XLApp.ActiveCell.Row;
  AStringGrid.RowCount := ARow + 1;
  ACol := XLApp.ActiveCell.Column;
  AStringGrid.ColCount := ACol + 1;
  for i := 1 to ARow do
  begin
    AStringGrid.Cells[0, i] := IntToStr(i);
    for j := 1 to ACol do
    begin
       AStringGrid.Cells[j, 0] := GiveRowHeader(j);
       AStringGrid.Cells[j, i] := XLSheet.Cells[i, j];
    end;
  end;
  if not VarIsEmpty(XLApp) then
  begin
     XLApp.DisplayAlerts := False;
     XLApp.Quit;
     XLApp := Unassigned;
     XLBook := Unassigned;
     XLSheet := Unassigned;
   end;
end;
Selanjutnya adalah proses menginject database. Double click tombol 
InjectDB, kemudian lengkapi procedure OnClick milik tombol tersebut:procedure TForm1.Button1Click(Sender: TObject);
var
  server,
  user,
  password,
  db_name,
  SheetName : string;
  ConnStr,
  StrSQL     : WideString;
  ACol,
  ARow,
  NRows     : Integer;
begin
  ADOConnection1.Close;
  server := 'mysql_server';//Sesuaikan, bisa diisi IP Address Server MySQL
  user := 'mysql_username'; //Sesuaikan dengan username mysql Anda
  password := 'mysql_password'; //Sesuaikan dengan password mysql Anda
  db_name := 'DATAKU';
  ConnStr := 'Provider=MSDASQL;DRIVER={MySQL ODBC 3.51 Driver}; '
            +'SERVER='+server
            +'; UID='+user
            +'; PASSWORD='+password
            +'; DATABASE='+db_name;
  ADOConnection1.ConnectionString := ConnStr;
  try
    AdoConnection1.Open;
  except
  raise;
  end;
  if ADOConnection1.Connected then begin
    Memo1.Clear;
    Memo1.Lines.Add('Connection established to '+server+'. Logged as '
            +user+' at '+DateTimeToStr(now));
    StatusBar1.SimpleText := 'Connection established to '+server
            +'. Logged as '+user+' at '+DateTimeToStr(now);
    LoadFromXLFile(Edit1.Text,1,StringGrid1,SheetName);
    NRows := 0;
    for ARow := 2 to StringGrid1.RowCount-1 do begin
      StrSQL := 'INSERT INTO anggota (';
      for ACol := 1 to StringGrid1.ColCount-1 do
        StrSQL := StrSQL + LowerCase(StringGrid1.Cells[ACol,1])+',';
      StrSQL := copy(StrSQL,1,length(StrSQL)-1)+') VALUES (';
      for ACol := 1 to StringGrid1.ColCount-1 do
        StrSQL := StrSQL + QuotedStr(StringGrid1.Cells[ACol,ARow])+',';
      StrSQL := copy(StrSQL,1,length(StrSQL)-1)+');';
      Memo1.Lines.Add('QUERY : '+StrSQL);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(StrSQL);
      ADOQuery1.ExecSQL;
      NRows := NRows + 1;
    end;
    StatusBar1.SimpleText := 'Operation Complete. '+IntToStr(NRows)
                   +' rows inserted';
  end;
end;
Terakhir, menghubungkan koneksi Query. Double click area kosong form1, ketikkan script berikut:procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Clear; ADOQuery1.Connection := ADOConnection1; Application.OnException := DisplayException; end;Dan selesai sudah. Jika, tidak ada masalah berarti, ketika dijalankan kemudian klik ‘InjectDB’, hasinya seperti ini:
Untuk memastikan bahwa data-data tersebut berhasil disimpan ke MySQL, kita cek saja lewat console tadi (belum di tutup kan?)
mysql> SELECT * FROM anggota; +--------------+-----------------+---------------------------------------------- -+ | kode_anggota | nama | alamat | +--------------+-----------------+---------------------------------------------- -+ | 20060001 | Rokayah | Kp. Pabuaran Pengadegan Pasar Kemis Tangerang | | 20060002 | Ade Ubaidillah | Jl. Kali Maya Blok M/16 Komp. Permata Serang | | 20060003 | Maratusholihat | Kp. Gore Jaya Grogol Cilegon | | 20060004 | Enong Hifdiawat | Kp. Sedatani Kubang Baros Cinangka Serang | | 20060005 | Umyati | Jl. Keramatwatu Waringin Kurung Serang | | 20060006 | Tati Haryanti | Jl. Karya Bakti 2B Komp. KPKN Ciceri Serang | | 20060009 | Nurhanifah | Jl. Carenal Kp. Laes Nambo Kibin Serang | | 20060011 | Maryam | Jl.KH.Samu'un Ramanuju no.12 Citangkil | | 20060012 | Rena Annisa Feb | Jl.Labuan Km 17 Sodong Saketi Pandeglang | | 20060015 | Rudi Hasanuidin | Kp Puyuh Koneng Ds Kencana Harapan Pontang | | 20060016 | Ida Rosida | Kp. Winong Ds./Kec. Walantaka Kab. Serang | +--------------+-----------------+---------------------------------------------- -+ 11 rows in set (0.00 sec) mysql> quit ByeKarena saya menggunakan ADO untuk mengkoneksikan Delphi dengan MySQL, maka kita membutuhkan driver tambahan yaitu MySQL ODBC Driver yang dapat diunduh disini. Aplikasi yang saya buat tidak menggunakan ADO, melainkan menggunakan Zeos sehingga tidak membutuhkan driver tambahan. Saya menggunaka ADO karena komponen tersebut sudah ada, tidak seperti ZEOS yang harus menginstall komponen-nya terlebih dahulu. Akan tetapi, koneksi menggunakan Zeos jauh lebih cepat dan tidak membutuhkan tambahan driver apapun.
Lalu, mungkin ada yang bertanya-tanya, apa gunanya deklarasi prosedur DisplayException? Salah satu contohnya, setelah melakukan InjectDB, silahkan klik Inject DB kembali. Lihat pada StatusBar.
Demikian. Semoga bermanfaat. Jika membutuhkan source code-nya, silahkan mengunduh di sini.
