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 -pSelanjutnya menyiapkan file Excel yang berisi data-data yang akan dimasukkan ke dalam tabel anggota. Misalkan data-datanya seperti pada gambar berikut:
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)
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
typeJangan lupa untuk menambahkan unit ComObj dan Excel2000 pada bagian implementation
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;
uses ComObj, Excel2000;Kemudian di bagian impelementation, lengkapi fungsi-fungsi dan prosedur tersebut:
procedure TForm1.DisplayException(Sender: TObject; E: Exception);Selanjutnya adalah proses menginject database. Double click tombol InjectDB, kemudian lengkapi procedure OnClick milik tombol tersebut:
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;
procedure TForm1.Button1Click(Sender: TObject);Terakhir, menghubungkan koneksi Query. Double click area kosong form1, ketikkan script berikut:
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;
procedure TForm1.FormCreate(Sender: TObject);Dan selesai sudah. Jika, tidak ada masalah berarti, ketika dijalankan kemudian klik ‘InjectDB’, hasinya seperti ini:
begin
Memo1.Lines.Clear;
ADOQuery1.Connection := ADOConnection1;
Application.OnException := DisplayException;
end;
Untuk memastikan bahwa data-data tersebut berhasil disimpan ke MySQL, kita cek saja lewat console tadi (belum di tutup kan?)
mysql> SELECT * FROM anggota;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.
+--------------+-----------------+----------------------------------------------
-+
| 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
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.
Posting Komentar