
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 me
nggunakan 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:
Kedua, membuat aplikasi Delphi. Disini saya menggunakan komponen-komponen sebagai 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 implementation
uses 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 Bye
Karena
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.


Bagaimana Dengan Artikel ini....Silahkan Berkomentar Jika ada Pertanyaan Dan Masukan ^_^