Exporter CSV Pasarkode

[KPPDI] Kelompok Penggemar Pemrograman Delphi Indonesia

Membuat Exporter
Database ke CSV/TXT
Program ini dibuat berdasarkan kasus nyata
ANO

15 Februari 2014
Kelompok Penggemar Pemrograman Delphi Indonesia

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 ,
https://plus.google.com/u/0/117633752696401844295, http://www.youtube.com/user/MrAnomaxi

© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

1

Alur Program
Berikut ini adalah flowcart alur program exporter

© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014


2

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

Name

sBitBtn1

Glyph

Icon txt

Name

buk


Glyph

Icon folder

Name

Form1

Caption

Exporter PK

Name

Koneksi

Provider

Microsoft.Jet.OLEDB.4.0


LoginPrompt

False

Name

Query1

Connection

koneksi

BitBtn
BitBtn
Form
ADOConnection

ADOQuery

© KPPDI, 2014

Author: Ano Van

Issue Date: 15 Februari 2014

3

ADOQuery

Name

Query

Connection

koneksi

Name

banyakdata


Caption

0 data diproses

Label

Name

Label1

Label

Name

Label2

Label

Name


Label3

ProgressBar

Name

proses

Statusbar

Name

statusbar

Label

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.
2.
3.
4.
5.
6.

Fungsi membaca database dan pengambilan nilai dari database [dalam sBitBtn1 dan sBitBtn2]
Fungsi menentukan folder tempat menyimpan [dalam sBitBtn1 dan sBitBtn2]
Fungsi membuat file CSV [dalam sBitBtn1 dan sBitBtn2]
Fungsi membuat file zip [dalam sBitBtn2]

Fungsi membuka folder [dalam buk]
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.Clear;
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

4

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
while not Query1.Eof do
begin

OutLine := '';

for i := 0 to Query1.FieldCount - 1 do
begin
proses.Position:=i;
sTemp := Query1.Fields[i].AsString;

OutLine := OutLine +'"'+ sTemp + '"|';

end;
SetLength(OutLine, Length(OutLine) - 1);

Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
Stream.Write(sLineBreak, Length(sLineBreak));

Query1.Next;
end;

finally

Stream.Free;

© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

5

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');
end;
except
on E: Exception do
begin
Writeln('Exception: ', E.Message);
Readln;
end;

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,
nil,
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

6

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','http://facebook.com/anovanmaximuz','','',SW_SHOWNORMAL);
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

7

shellexecute(0,'open','https://twitter.com/PasarKode','','',SW_SHOWNORMAL);
shellexecute(0,'open','mailto:anovanmaximuz@gmail.com','','',SW_SHOWNORMAL);
shellexecute(0,'open','http://linkedin.com/in/anovan','','',SW_SHOWNORMAL);
shellexecute(0,'open','http://pasarkode.com/rss.xml','','',SW_SHOWNORMAL);

shellexecute(0,'open','https://plus.google.com/+Pasarkode-box-of-code','','',SW_SHOWNORMAL);

shellexecute(0,'open',' http://www.pinterest.com/pasarkode/','','',SW_SHOWNORMAL);
shellexecute(0,'open',' https://plus.google.com/u/0/117633752696401844295','','',SW_SHOWNORMAL);
shellexecute(0,'open','http://www.flickr.com/photos/101627059@N03/','','',SW_SHOWNORMAL);
end
else begin
//akhir lock
//fungsi
//fungsi

// 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;
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

8

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

while not Query1.Eof do
begin

// You'll need to add your special handling here where OutLine is built
OutLine := '';
for i := 0 to Query1.FieldCount - 1 do
begin

proses.Position:=i;
sTemp := Query1.Fields[i].AsString;

// Special handling to sTemp here
OutLine := OutLine +'"'+ sTemp + '"|';

end;

// Remove final unnecessary ','

SetLength(OutLine, Length(OutLine) - 1);
// Write line to file

Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
// Write line ending
Stream.Write(sLineBreak, Length(sLineBreak));
Query1.Next;

end;
finally

Stream.Free;

koneksi.Close;
query.Active:=false;

Query1.Active:=false;

// Saves the file

statusbar.Panels[0].Text:='T1068904100004_'+FormatDateTime('yyyymmdd',
tanggal.Date)+'000000.txt';
banyakdata.Caption:=inttostr(Cnt)+' Data diproses, disimpan di '+label1.Caption;
//fungis

archiver := TZipForge.Create(nil);
try
with archiver do
begin

// Set the name of the archive file we want to create

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();
DeleteFile(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd',
tanggal.Date)+'000000.txt');
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

9

end;
except

on E: Exception do
begin

Writeln('Exception: ', E.Message);
// Wait for the key to be pressed
Readln;

end;end;
//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;

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://facebook.com/anovanmaximuz','','',SW_SHOWNORMAL);
shellexecute(0,'open','https://twitter.com/PasarKode','','',SW_SHOWNORMAL);

shellexecute(0,'open','mailto:anovanmaximuz@gmail.com','','',SW_SHOWNORMAL);
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

10

shellexecute(0,'open','http://linkedin.com/in/anovan','','',SW_SHOWNORMAL);
shellexecute(0,'open','http://pasarkode.com/rss.xml','','',SW_SHOWNORMAL);

shellexecute(0,'open','https://plus.google.com/+Pasarkode-box-of-code','','',SW_SHOWNORMAL);
shellexecute(0,'open',' http://www.pinterest.com/pasarkode/','','',SW_SHOWNORMAL);

shellexecute(0,'open',' https://plus.google.com/u/0/117633752696401844295','','',SW_SHOWNORMAL);
shellexecute(0,'open','http://www.flickr.com/photos/101627059@N03/','','',SW_SHOWNORMAL);
end

else begin
//akhir lock
//fungsi
//fungsi

// 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
//mulai

© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

11

Stream := TFileStream.Create(foldersimpan+'\T1068904100004_'+FormatDateTime('yyyymmdd',
tanggal.Date)+'000000.txt', fmCreate);
proses.Max:=Query1.FieldCount-1;
try

while not Query1.Eof do
begin

// You'll need to add your special handling here where OutLine is built
OutLine := '';
for i := 0 to Query1.FieldCount - 1 do
begin
proses.Position:=i;

sTemp := Query1.Fields[i].AsString;
// Special handling to sTemp here

OutLine := OutLine +'"'+ sTemp + '"|';
end;
// Remove final unnecessary ','
SetLength(OutLine, Length(OutLine) - 1);
// Write line to file

Stream.Write(OutLine[1], Length(OutLine) * SizeOf(Char));
// Write line ending
Stream.Write(sLineBreak, Length(sLineBreak));

Query1.Next;
end;

finally
Stream.Free;

koneksi.Close;
query.Active:=false;

Query1.Active:=false;

// Saves the file

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;

Source Code Buk
procedure TForm1.bukClick(Sender: TObject);
begin
ShellExecute(Application.Handle,
PChar('explore'),
© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

12

PChar(label1.Caption+''),
nil,
nil,
SW_SHOWNORMAL);
end;

Tampilan Program

Selesai...
Untuk source code lengkap anda bias mendownloadnya di http://pasarkode.com/all-download.code dengan nama
Full Source Code Exporter Pasarkode.
Terima Kasih,
Ano Van
Founder www.pasarkode.com

© KPPDI, 2014
Author: Ano Van

Issue Date: 15 Februari 2014

13