[KPPDI] Kelompok Penggemar Pemrograman Delphi Indonesia
15 Februari 2014
Membuat Exporter
Database ke CSV/TXT
Program ini dibuat berdasarkan kasus nyata
ANO
Penulis:
Ano Van
Target Pembaca:
KPPDI Lover
Kategori:
Pemrograman Aplikasi Database
Judul Tulisan :
Membuat Exporter Database ke CSV
Versi Platform:
Delphi 7
Ringkasan:
Program ini digunakan untuk mengekspor atau merubah data dari sebuah database ke dalam 2 format yaitu CSV
dan ZIP, dalam tutorial ini saya memberikan contoh dengan menggunakan database access agar mudah dibuat,
untuk pengembangan lebih lanjut KPPDI lover bisa membuatnya menggunakan database apapun, sementara
untuk koneksinya saya menggunakan koneksi ADO yang dimaenkan dengan 2 buah Query ADO, untuk ZIP sendiri
menggunakan komponen ZipForge. Fungsi yang sama saya pernah membuatnya untuk CSV ke program ESPT Pajak
Cara Kerja :
Tampilan Program
KONTAK PENULIS
Ano Van
Website :
www.pasarkode.com
,
www.penguintechno.com
,
www.sishyfahion.com
Sosial :
http://id.linkedin.com/in/anovan/
,
http://facebook.com/anovanmaximuz
,
Alur Program
Tahap 1
Buatlah sebuah form berukuran seperti gambar di bawah ini :
Setelah itu tambahkan beberapa obyek dan set propertinya:
Nama Obyek
Properti
Value
TDateTimePicker
Name
Tanggal
BitBtn
Name
sBitBtn2
Glyph
Icon zip
BitBtn
Name
sBitBtn1
Glyph
Icon txt
BitBtn
Name
buk
Glyph
Icon folder
Form
Name
Form1
Caption
Exporter PK
ADOConnection
Name
Koneksi
Provider
Microsoft.Jet.OLEDB.4.0
LoginPrompt
False
ADOQuery
Name
Query1
ADOQuery
Name
Query
Connection
koneksi
Label
Name
banyakdata
Caption
0 data diproses
Label
Name
Label1
Label
Name
Label2
Label
Name
Label3
ProgressBar
Name
proses
Statusbar
Name
statusbar
Untuk gambar dalam bitbtn anda bisa membuatnya sendiri dalam format PNG, sedangkan databasenya anda bisa
download di
http://pasarkode.com/all-download.code
dengan nama Database Tutorial Exporter.
Tahap 2
Buatlah sebuah folder dengan nama database yang berada dalam satu folder dengan program yang sedang kita
buat, simpan file database yang sudah anda download ke dalam folder database.
Tahap 3
Sekarang kita akan memulai koding untuk stiap obyeknya, Tambahkan kode di bawah ini dalam tag Uses
Uses
ExtCtrls,ShellApi, FileCtrl,ZipForge;
Ada beberapa bagian dalam fungsi disini yaitu :
1.
Fungsi membaca database dan pengambilan nilai dari database [dalam sBitBtn1 dan sBitBtn2]
2.
Fungsi menentukan folder tempat menyimpan [dalam sBitBtn1 dan sBitBtn2]
3.
Fungsi membuat file CSV [dalam sBitBtn1 dan sBitBtn2]
4.
Fungsi membuat file zip [dalam sBitBtn2]
5.
Fungsi membuka folder [dalam buk]
6.
Fungsi lock program [dalam sBitBtn1 dan sBitBtn2]
Untuk kode penjelasan fungsi-fungsi di atas adalah sebagai berikut :
Fungsi membaca database dan pengambilan nilai dari
database [dalam sBitBtn1 dan sBitBtn2]
koneksi.ConnectionString:=
'Password="";'+
'User ID=Admin;'+
'Data Source='+getcurrentdir()+'\database\Eat-Z.mdb;Persist Security Info=False';
query.SQL.Clear;
query1.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0)
,1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date));
query.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0)
,1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date));
koneksi.Open;
query.Active:=true;
Query1.Active:=true;
Keterangan :
hal pertama adalah mengisikan string konfigurasi untuk koneksi yang membaca lokasi file databse
access, dimana lokasinya dibaca berdasarkan dari pembacaan current folder, yang kemudian membaca folder
database, selanjutnya ADO query akan diisi oleh perintah query sesuai format yang saya buat anda bebas
memodifikasi query ini, sebelumnya di clear -> diisi -> dan aktifkan kembali.
Fungsi menentukan folder tempat menyimpan [dalam
sBitBtn1 dan sBitBtn2]
dir := 'C:';
if SelectDirectory('Pilih Folder Penyimpanan','', dir
) then begin foldersimpan:=dir; label1.Caption:=dir; end;
keterangan :
mencari lokasi penentu yang akan dijadikan lokasi penyimpanan dimana nantinya string yang
dihasilkan akan disimpan dalam variable foldersimpan.
Fungsi membuat file CSV [dalam sBitBtn]
Stream := TFileStream.Create(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt', fmCreate);
proses.Max:=Query1.FieldCount-1; try
Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char)); Stream.Write(sLineBreak, Length(sLineBreak));
Query1.Next; end;
koneksi.Close; query.Active:=false; Query1.Active:=false;
statusbar.Panels[0].Text:='T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt';
banyakdata.Caption:=inttostr(Cnt)+' Data diproses, disimpan di '+label1.Caption;
buk.Enabled:=true;
showmessage('Proses Selesai');
end;
keterangan :
pada posisi stream kita membuat file txt, anda bias merubahnya menjadi extensi csv karena
sebenarnya kedua file ini sama, setelah itu proses akan membaca hasil query ADO perbaris dan perkolom yang
kemudian tiap baris pembacaan table akan disimpan dalam variable sementara stemp dan outline, untuk
pemisahnya saya buat dengna tanda ( | ). Nama file dibuat dalam variable stream, dengan format penamaan
T1068904100004_tanggaldibuat.txt
Fungsi membuat file zip [dalam sBitBtn2]
archiver := TZipForge.Create(nil);
try
with archiver do
begin
FileName := foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd',
tanggal.Date)+'000000.zip';
OpenArchive(fmCreate);
BaseDir := foldersimpan+'\';
AddFiles('T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt');
CloseArchive();
DeleteFile(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd',
tanggal.Date)+'000000.txt');
keterangan :
variable archiver kita buat kosong, setelah itu akan buat nama file zip yang isinya di ambil dari file
txt/csv yang sudah dibuat dan menghapusnya. Nama file dibuat di variable FIleName.
Fungsi membuka folder [dalam buk]
ShellExecute(Application.Handle, PChar('explore'),
PChar(label1.Caption+''), nil,
SW_SHOWNORMAL);
Keterangan :
membuka folder explorer bawaan windows dimana lokasinya diambil dari variable label1.caption dari
variable foldersimpan, dimana label1 di visible false.
Fungsi lock program [dalam sBitBtn1 dan sBitBtn2]
if tanggal.Date>EncodeDate(2014,7,22) then begin
Application.MessageBox('Progam sudah melewati tanggal 22 Juli 2014, program sementara dikunci dan anda tidak mempunyai akses lagi, silahkan hubungi www.pasarkode.com jika ingin kembali menggunakan program ini.','Informasi Penguncian Program',MB_ICONSTOP);
sbitbtn2.Enabled:=false; sbitbtn1.Enabled:=false; buk.Enabled:=false; tanggal.Enabled:=false;
form1.Caption:='Exporter Pasarkode [expired]';
keterangan :
ini adalah fungsi tambahan untuk membatasi pemakaian program dari obyek tanggal dimana data
yang diproses tidak boleh lebih dari tanggal yang saya tentukan, kalau lebih tombol akan di lock dan secara
otomatis akan membuka browser dan menuju link saya.
Setelah melihat penjelasan fungsi-fungsi dalam program mari kita liat source kode lengkap untuk tiap tombol yang
ada dalam program.
Full Source code sBitBtn2
procedure TForm1.sBitBtn2Click(Sender: TObject); const
SELDIRHELP = 1000; var
Stream: TFileStream; i: Integer;
OutLine: string; sTemp: string; Cnt : Integer; dir: String;
foldersimpan:string; archiver : TZipForge; begin
//pengatur lock
if tanggal.Date>EncodeDate(2014,7,22) then begin
Application.MessageBox('Progam sudah melewati tanggal 22 Juli 2014, program sementara dikunci dan anda tidak mempunyai akses lagi, silahkan hubungi www.pasarkode.com jika ingin kembali menggunakan program ini.','Informasi Penguncian Program',MB_ICONSTOP);
sbitbtn2.Enabled:=false; sbitbtn1.Enabled:=false; buk.Enabled:=false; tanggal.Enabled:=false;
form1.Caption:='Exporter Pasarkode [expired]';
shellexecute(0,'open','https://twitter.com/PasarKode','','',SW_SHOWNORMAL);
// if DirectoryExists(getcurrentdir()+'\export') then // begin buk.Enabled:=true; end
// else // begin
// Application.MessageBox('Folder Export tidak ada!'+#13+'system akan otomatis membuatnya.','Folder Tidak Ada',MB_ICONINFORMATION);
// MkDir(getcurrentdir()+'\export'); // buk.Enabled:=true;
// end;
buk.Enabled:=false;
//memulai koneksi dan lakukan parsing koneksi.ConnectionString:=
'Password="";'+ 'User ID=Admin;'+
'Data Source='+getcurrentdir()+'\database\Eat-Z.mdb;Persist Security Info=False'; query.SQL.Clear;
query1.SQL.Clear;
query1.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0),1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date));
query.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0),1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date)); koneksi.Open;
query.Active:=true; Query1.Active:=true; //cek jumlah
Cnt := Query1.RecordCount; if Cnt>0 then begin //memilih folder simpan dir := 'C:';
if SelectDirectory('Pilih Folder Penyimpanan','', dir
label1.Caption:=dir; end; //memlih folder simpan
//mulai
Stream := TFileStream.Create(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt', fmCreate);
proses.Max:=Query1.FieldCount-1; try
Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char)); // Write line ending
Stream.Write(sLineBreak, Length(sLineBreak)); Query1.Next;
statusbar.Panels[0].Text:='T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt';
banyakdata.Caption:=inttostr(Cnt)+' Data diproses, disimpan di '+label1.Caption; //fungis
FileName := foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.zip';
// Because we create a new archive, // we set Mode to fmCreate
OpenArchive(fmCreate);
// Set base (default) directory for all archive operations BaseDir := foldersimpan+'\';
// Add file C:\test.txt the archive; wildcards can be used as well
AddFiles('T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt'); CloseArchive();
end;
showmessage('Proses Selesai'); end;
end else begin
showmessage('Tidak ada data pada tanggal '+FormatDateTime('dddddd', tanggal.Date)); koneksi.Close;
query.Active:=false; Query1.Active:=false; end; end;
end;
Full Source Code sBitBtn1
procedure TForm1.sBitBtn1Click(Sender: TObject); var
Stream: TFileStream; i: Integer;
OutLine: string; sTemp: string; Cnt : Integer; dir: String;
foldersimpan:string;
begin
//pengatur lock
if tanggal.Date>EncodeDate(2014,7,22) then begin
Application.MessageBox('Progam sudah melewati tanggal 22 Juli 2014, program sementara dikunci dan anda tidak mempunyai akses lagi, silahkan hubungi www.pasarkode.com jika ingin kembali menggunakan program ini.','Informasi Penguncian Program',MB_ICONSTOP);
sbitbtn2.Enabled:=false; sbitbtn1.Enabled:=false; buk.Enabled:=false; tanggal.Enabled:=false;
form1.Caption:='Exporter Pasarkode [expired]';
shellexecute(0,'open','http://linkedin.com/in/anovan','','',SW_SHOWNORMAL);
// if DirectoryExists(getcurrentdir()+'\export') then // begin buk.Enabled:=true; end
// else // begin
// Application.MessageBox('Folder Export tidak ada!'+#13+'system akan otomatis membuatnya.','Folder Tidak Ada',MB_ICONINFORMATION);
// MkDir(getcurrentdir()+'\export'); // buk.Enabled:=true;
// end;
buk.Enabled:=false;
//memulai koneksi dan lakukan parsing koneksi.ConnectionString:=
'Password="";'+ 'User ID=Admin;'+
'Data Source='+getcurrentdir()+'\database\Eat-Z.mdb;Persist Security Info=False'; query.SQL.Clear;
query1.SQL.Clear;
query1.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0),1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date));
query.SQL.Add('select a.posno,b.posno,c.itcac,'''+FormatDateTime('yyyymmdd',
tanggal.Date)+'''+left(a.postm,2)+right(a.postm,2)+''00'',c.itds,round(b.posam/1.21,0),1 from POSHD a,POSDET b,TBLIT c where b.posno=a.posno and b.posit=c.itcd and
a.posdt='+FormatDateTime('yyyymmdd', tanggal.Date)); koneksi.Open;
query.Active:=true; Query1.Active:=true; //cek jumlah
Cnt := Query1.RecordCount; if Cnt>0 then begin //memilih folder simpan dir := 'C:';
if SelectDirectory('Pilih Folder Penyimpanan','', dir
) then begin foldersimpan:=dir; label1.Caption:=dir; end; //memlih folder simpan
Stream := TFileStream.Create(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt', fmCreate);
proses.Max:=Query1.FieldCount-1; try
Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char)); // Write line ending
Stream.Write(sLineBreak, Length(sLineBreak)); Query1.Next;
statusbar.Panels[0].Text:='T1068904100004_'+FormatDateTime('yyyymmdd', tanggal.Date)+'000000.txt';
banyakdata.Caption:=inttostr(Cnt)+' Data diproses, disimpan di '+label1.Caption; //fungis
//fungsi
buk.Enabled:=true;
showmessage('Proses Selesai'); end;
end else begin
showmessage('Tidak ada data pada tanggal '+FormatDateTime('dddddd', tanggal.Date)); koneksi.Close;
query.Active:=false;
Query1.Active:=false; end; end; end;