Menyimpan Quick Report dengan Format PDF pada Delphi

Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Setelah sekian lama akhirnya codegratis kembali lagi aktiv, maaaaaaf yaa karena kesibukan admin dalam mencari nafkah akhirnya ada waktu dan ada ide lagi dalam mengisi blog yang sederhana  ini. Mohon maaaaaaf ya pemirsa, karena sudah sekian lama tidak ada posting. Ok baiklah  langsung aja kita membahas mengenai tutorial Delphi yang cukup jarang dan cukup sulit mencari versi Bahasa Indonesia dan tokcer jika dicoba langsung diaplikasikan. Kali ini kita akan membahas tentang “Menyimpan Quick Report dengan Format PDF pada Delphi”, bahan-bahan yang harus dipersiapkan……halah koyok Master Chef aja.

  1. Uses QRPDFFilt
  2. Variabel lokal (biasa ditempatkan di tombol cetak) dr : string; aPDF : TQRPDFDocumentfilter;

Script-nya so simple langsung aja ya :

Di awal procedure isi variabel dr dengan lokasi dan nama penyimpanan hasil export Quick Report ke PDF

dr:=ExtractFilePath(Application.ExeName)+'struk\'++'.pdf';

Script untuk mengekpor Quick Report ke PDF, sedikit sekali diletakkan setelah Quick Report dipersiapkan atau query untuk menampilkan data pada report sudah dijalankan, ini script nya :

QuickReport1.Prepare;
aPDF := TQRPDFDocumentfilter.Create(dr);
QuickReport1.ExportToFilter( aPDF);
aPDF.free;

Nah gampang bukan, PDF dari hasil export tadi langsung akan tersimpan pada direktori yang sudah diset diawal.

Langsung di coba ya, kalo ada yang kurang jelas atau masih bingung Mongooo langsung aja dikomen yaaaaaaa

Selamat Mencobaaaaa.

Membuat Timer pada Delphi

Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Maaf lama gak ada postingan baru lagi di blog tercinta saya ini, maklum banyak kerjaan yang mesti saya selesaikan. Pada postingan saya kali ini saya akan berbagi tip mengenai membuat “Timer atau Penghitung Waktu Mundur pada Delphi”. Codingnya sangat sederhana sekali kok, hasil dari googling dan coba-coba sana-sini, dan kebetulan saya pas diminta mengerjakan projek untuk billing bilyar, yang disitu harus ada timer untuk mengitung waktu bermain bilyar.
Ok langsung saja kita siapkan bahan-bahanya, halah maksud saya komponen yang digunakan :
 photo timer1_zpsfhp9u9e2.jpg

Nama Object Nama Property Setting
TCombobox CharCase ecUpperCase
Item SIANG

25 SIANG

FREE 1 JAM

Name cpaket
TEdit Enabled False
Name Etimer
TButton1 Caption &Start
Name Bmulai
TButton2 Caption &Keluar
Name Bexit
Timer1 Enabled False
Interval 1000

Disitu saya menggunakan combobox karena pada pool bilyar sering ada paket-paket gitu kalo main bilyar. Baiklah langsung saja kita bedah codingnya…………………..pada gak sabar ya……….

  • Variabel global yang digunakan

Timeout:tdatetime;

  • Uses yang digunakan

Gunakan dateutils untuk fungsi tanggal dan waktu pada delphi

  • Function SecsToHmsStr(ASecs: integer):string;
function SecsToHmsStr(ASecs: integer):string;
begin
Result := Format('%2d:%2.2d:%2.2d',[ASecs div 3600, ASecs mod 3600 div 60, ASecs mod 3600 mod 60]);
end;
  • Procedure TForm1.bexitClick
procedure TForm1.bexitClick(Sender: TObject);
begin
if bexit.Caption='&Keluar' then
  close
else
begin
  bmulai.Caption:='&Start';
  bexit.Caption:='&Keluar';
  cpaket.Text:='';
  etimer.Clear;
end;
end;
  • Procedure TForm1.bmulaiClick
procedure TForm1.bmulaiClick(Sender: TObject);
begin
if bmulai.Caption='&Start' then
begin
  if trystrtotime(etimer.Text, timeout) then
  begin
    timeout:=now+timeout;
    timer1.Enabled:=true;
    bmulai.Caption:='&Pause';
    bexit.Caption:='&Reset';
    etimer.Text:= SecsToHmsStr(SecondsBetween(Now, TimeOut));
  end
  else
    ShowMessage('Error in time format');
end
else
begin
  bmulai.Caption:='&Start';
  bexit.Caption:='&Keluar';
  timer1.Enabled:=false;
end;
end;
  • Procedure TForm1.cpaketChange
procedure TForm1.cpaketChange(Sender: TObject);
begin
if cpaket.Text='SIANG' then
  etimer.Text:='01:00:00'
else
if cpaket.Text='25 SIANG' then
  etimer.Text:='02:00:00'
else
if cpaket.Text='FREE 1 JAM' then
  etimer.Text:='03:00:00'
else
  etimer.Text:='';
end;
  • Procedure TForm1.FormShow
procedure TForm1.FormShow(Sender: TObject);
begin
cpaket.Text:='';
etimer.Clear;
end;
  • Procedure TForm1.Timer1Timer
procedure TForm1.Timer1Timer(Sender: TObject);
begin
etimer.Text:= SecsToHmsStr(SecondsBetween(Now, TimeOut));
if Now > Timeout then Timer1.Enabled := False;
end;

Nah sedikit dan simple kan codingnya, monggo dicoba. Is everything ok maka akan running weel seperti dibawah ini :

timer2 photo timer2_zpsrubruxoo.jpg

Jika ada yang kurang pas atau mau ditambahkan monggo komen. Selamat mencoba.

Cara Backup Data MYSQL Saat Windows Error

phpmyadmin photo phpmyadmin_zpssdpf9exc.jpg

Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Backup data pada MYSQL memang mudah, tingal masuk ke phpmyadmin kalo yang pakai XAMPP terus pilih databasenya terus eksport udah beres, itu kalo Windows-nya dalam keadaan normal, tapi gimana kalo dalam keadaan Windows-nya error………….wah bisa jadi mimpi buruk tu kalo yang belum pernah ngalamin kasus kaya gini, bisa hilang semua database yang telah kita buat dengan susah payah. Seperti kasus yang saya alami kemarin, cukup puyeng sich mengatasinya, soalnya problemnya complicated banget sich n baru pertama. Nah saya uraikan dulu problem yang saya alamin kemaren tentang backup database MYSQL, barangkali Anda juga pernah dan sedang mengalaminya.

Problem pertama, OS sudah beda, OS yang saya gunakan Win 7 sementara OS klient saya Win XP, sebenarnya dulu klient saya sudah saya suruh ganti ke Win 7, tapi gak diganti-ganti mungkin dengan kejadian ini komputernya dapat diganti ke Win 7.

Problem ke dua, versi MYSQL dan XAMPP pada PC klient saya dan Laptop saya beda, kilent saya menggunakan MYSQL versi 5.5.25a maklum kan Win XP, saya instal XAMPP versi terbaru gak support, ya udah saya instalkan XAMPP versi 1.8.0 VC9 di PC klien saya, sementara saya sudah menggunakan XAMPP versi terbaru……………… Nah mari kita pecahkan satu persatu problem tersebut.

Solusi problem pertama, gunakan Hirens Boot agar kita dapat mengakses komputer yang Windows-nya sedang error, untuk yang mau belajar menggunakan Hirens Boot totorialnya ada disini. Mudah kan solusi pertama tinggal booting Hirens Boot ke Windows yang sedang error lalu ambil data MYSQL nya, na ambil datanya untuk kita gunakan pada solusi yang kedua.

Ok pada gak sabar ya sama solusi kedua, yuk mari……… Untuk XAMPP versi 1.8.0 VC9 tidak semudah dan segampang XAMPP versi terbaru dalam penanganan backup data saat Windows error.

  • Langkah pertama, copy folder XAMPP beserta seluruh isinya dari drive C komputer yang Windows-nya error dengan Hirens Boot. Amankan folder XAMPP yang telah kita copy tadi, ingat jangan di otak-atik ya, cukup copy dan amankan…………SIAP 86 ! hahahahahaha
  • Langkah ke dua, karena versi XAMPP saya dengan klien berbeda maka saya downgrade dech XAMPP nya, jadinya sekarang sementara menggunakan XAMPP versi 1.8.0 VC9.
  • Langkah ke tiga, na ini yang saya bilang seorang programer sejati harus siap sejak jauh-jauh hari……..halah sok bijak. Untungnya saya sudah instal dual boot OS di laptop tercinta saya, alias laptop saya udah terinstal Ubuntu versi 12.04 LTS. Jadi kalo ada apa-apa dengan Windows 7, Ubuntu sudah siap membackup…….hahahahahahaha. Oke lah kalo begitu, folder XAMPP yang telah kita copy dan amankan tadi kita paste ke drive C XAMPP komputer kita dengan bantuan OS Ubuntu, kenapa harus pake Ubuntu, karena di Ubuntu copy paste di drive C gak banyak dialog yang membingungkan yang bisa membuat hasil paste kita tidak maksimal alias tidak dapat di paste semua, kalo yang belum pake Ubuntu giman dong ? instal dong atau gunakan saja Ubuntu Live USB, banyak kok tutorialnya di warnet…………..eh salah internet………..:)

Ingat ya pastikan sebelumnya versi XAMPP sudah sama, sebelum paste folder XAMPP di drive C.

Jika saja klient saya menggunakan versi XAMPP terbaru, pasti gampang penanganannya, tinggal copy C:/xampp/mysql/data/nama_database, terus paste pada C:/xampp/mysql/data komputer kita, aman sudah datanya bisa langsung di cek di phpmyadmin pasti sudah langsung masuk database beserta isinya.

  • Langkah ke empat, saya restart laptop saya untuk pindah ke Windows 7. Lalu saya cek di localhost/phpmyadmin…………..walaaaaaaa akhirnya database yang saya backup dan amankan tadi sudah ada berserta semua isinya. Alhamdulihah, gak jadi hilang 713 record item barang yang sangat berharga input datanya aja sampai tiga minggu, kalo sampai hilang dan tak terselamtkan bisa nangin tiga minggu…….hahahahahaha
  • Langkah ke empat ekspor database yang sudah kita amankan, buat jaga-jaga kalo ada apa-apa lagi.
  • Langkah ke lima finish……………….hahahahaha ngaso dulu………….

Nah berdasarkan pengalaman yang tidak mengenakan tersebut sebainya kita harus memindahkan lokasi penyimpanan database MYSQL secara defaut, bukan lagi di C:/xampp/mysql/data/ sehingga kalo terjadi error pada Windows, database tetap aman dan tidak membuat kita was-was. Misalkan kita pindahkan saja ke drive D:/database, berikut step-stepnya :

  • Copy semua isi dari folder C:/xampp/mysql/data, ingat jangan sampai ada ketinggalan dalam mengcopy, lalu paste ke D:/database.
  • Lalu edit my.ini yang berada pada C:/xampp/mysql/bin ganti :

datadir = “D:/database”

innodb_data_home_dir = “D:/database”

innodb_log_group_home_dir = “D:/database”

  • Restart MYSQL pada XAMPP Control Panel.
  • Buka lacalhost/phpmyadmin di browser Anda
  • InsyaAllah pasti mau………….
  • Coba buat database atau tabel baru, dan cek di D:/database pasti sudah ada database atau tabel baru Anda disitu. Kalo database baru pasti ada foldernya didalam D:/database sesuai dengan nama database

Ok lah semua pengalaman dan tips saya mengenai backup database MYSQL saat Windows error sudah saya kupas tuntas dan lugas, semoga pengalaman saya ini dapat menjadi ilmu dan bahan belajar bagi para rekan-rekan programer pemula seperti saya ini, agar selalu siap menghadapai berbagai kemungkinan terburuk dalam dunia pemrograman…………………halah sok bijak. Kalo ada yang salah, kurang, atau mau kasih kritik, saran, dan ide langsung komen ya. Ojo lali rek………………tak enteni yoooooo……………. 🙂

Fungsi Maxdate Dan Mindate Pada Delphi

Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Fungsi maxdate dan mindate sebenarnya fungsi yang sangat sederhana pada delphi, tapi berhubung saya cari-cari di blog lainnya lumayan jarang yang menulis, makanya saya coba untuk men-share, barangkali ada yang bingung cari-cari kesana kemari, siapa tahu tulisan saya ini bermanfaat.

Oke lah langsung saja, fungsi maxdate dan mindate digunakan untuk mensetting tanggal pada datetimepicker, contoh penerapannya biasanya pada tanggal lahir. Fungsi maxdate digunakan untuk mensetting tanggal maksimal yang dapat ditampilkan pada datetimepicker, maksudnya tanggal maksimal ke depan atau ke belakang berdasarkan tahun pada tanggal saat ini (sistem), contoh kita gunakan tanggal lahir tanggal saat ini 3/06/2015 tanggal lahir maksimal yang ingin kita tampilkan 3/06/1997 atau yang dapat diterima yang sudah berumur 18 tahun.

Sedangakan fungsi mindate akan mensetting tanggal minimal yang dapat ditampilkan pada datetimepicker, tanggal minimal ini harus berada dibawah tanggal maksimal, contohnya maxdate  3/06/1997, maka mindate nya 3/06/1985.

Masih bingung mari kita langsung saja ke source codenya
procedure tf_pkh.set_tanggal;

procedure tf_pkh.set_tanggal;
begin
dt.Date:=IncYear(date(),-18);
dt.MaxDate:=IncYear(date(),-18);
dt.MinDate:=IncYear(date(),-35);
end;

Penjelasan :

  • Baris 3 : tanggal yang ditampilkan adalah tanggal, bulan sesuai tanggal saat ini, namun tahunnya dikurangi 18 tahun, kalo tahun saat ini 2015 maka tahun yang ditampilkan pada datetimepicker adalah tahun 1997. Pada contoh ini diterapkan pada tanggal lahir, jadi tanggal lahir yang dapat diterima paling muda adalah kelahiran tahun 1997 atau usia 18 tahun.
  • Baris 4 : tanggal maksimal yang dapat ditampilkan adalah tanggal, bulan sesuai tanggal saat ini, namun tahunnya dikurangi 18 tahun.
  • Baris 5 : tanggal minimal yang dapat ditampilkan dan diterima datetimepicker adalah tanggal, bulan sesuai tanggal saat ini, namun tahunnya dikurangi 35 tahun. Artinya kelahiran tertua yang dapat diterima adalah tahun 1985 atau umur 35 tahun. Yang harus dicermati mindate harus berada dibawah maxdate.
  • Procedure ini dijalankan saat form keaadan aktif atau inputan sudah aktif, dan sudah siap digunakan untuk menginput data.

procedure tf_pkh.tanggal_netral;

procedure tf_pkh.tanggal_netral;
begin
dt.MaxDate:=date();
dt.Date:=date();
dt.MinDate:=IncYear(date(),-100);
end;

Digunakan untuk menggembalikan datetimepicker pada settingan awal, procedure ini biasanya digunakan pada saat form show, atau saat form pertama kali tampil. Procedure ini juga berfungsi agar datetimepicker lebih flexibel dalam menampilkan tanggal dari data yang sudah ada, tanpa error. Jika settingan datetimepicker tidak kita kembalikan seperti awal maka kemungkinan error akan terjadi, karena overlap antara tanggal yang disetting dengan tanggal pada data.

Demikianlah tips sederhana mengenai maxdate dan mindate, jika ada salah, kurang, atau saran silahkan di komen ya. Selamat mencoba dan terus kembangkan. Siiiiiiip……………..

Pencarian Data Sederhana pada Delphi

desain form barang photo barang_zpsxars3vgr.jpg Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Pada postingan saya sebelumnya kita telah membahas mengenai membuat aplikasi sederhana dengan delphi. Sebenarnya dalam aplikasi  tersebut terdapat beberapa fungsi penting yang dapat kita uraikan lagi secara lebih detail, salah satunya adalah fungsi pencarian. Nah mari kita bahas fungsi pencarian, fungsi tersebut terdapat pada form barang. Untuk dapat melakukan pencarian pada delphi membutuhkan beberapa buah procedure atau blok coding yang saya ciptakan sendiri atau memang procedure bawaan delphi berikut ini fungsi yang saya gunakan untuk pencarian data pada delphi.
procedure Tf_barang.FormShow;

procedure Tf_barang.FormShow(Sender: TObject);
begin
with dm.ZQuery1 do
begin
sql.Clear;
sql.Add('select * from t_barang');
open;
gbarang.DataSource:=dm.DataSource1;
end;
end;

Procedure ini digunakan pada saat form pertama kali muncul atau tampil. Disitu saya menuliskan SQL yang digunakan untuk menampilkan data pada grid barang, sehingga user dapat melihat isi data barang, dan mengetahui bahwa form ini digunakan untuk menginput data barang.
procedure Tf_barang.rgcariClick;

procedure Tf_barang.rgcariClick(Sender: TObject);
begin
ecari.SetFocus;
end;

Procedure hanya untuk men-setfocus atau mengarahkan langsung inputan ke edit text pencarian, saat salah satu dari radio group di klik.
procedure Tf_barang.bcariClick;

procedure Tf_barang.bcariClick(Sender: TObject);
begin
with dm.ZQuery1 do
begin
if rgcari.ItemIndex=-1 then
begin
MessageDlg('Kategori Pencarian Belum Dipilih',mtInformation,[mbOK],0);
exit;
end
else
if rgcari.ItemIndex=0 then
begin
sql.Clear;
sql.Add('select * from t_barang where kd_barang like "%'+ecari.Text+'%"');
open;
if (RecordCount=0) then
begin
MessageDlg('Kode Barang '+ecari.text+' Tidak Ditemukan',mtInformation,[mbOK],1);
formshow(sender);
ecari.Clear;
rgcari.ItemIndex:=-1;
exit;
end
else
gbarang.SetFocus;
end
else
begin
sql.Clear;
sql.Add('select * from t_barang where nm_barang like "%'+ecari.Text+'%"');
open;
if (RecordCount=0) then
begin
MessageDlg('Nama Barang '+ecari.text+' Tidak Ditemukan',mtInformation,[mbOK],1);
formshow(sender);
ecari.Clear;
rgcari.ItemIndex:=-1;
exit;
end
else
gbarang.SetFocus;
end;
end;
end;

Nah pada procedure inilah proses pencarian data dijalankan, procedure ini dijalankan pada saat tombol pencarian di klik. Procedure ini yang paling penting, mari kita uraikan penjelasannya satu persatu.

  • Baris 3 : pada prosedure menggunakan Zquery atau Zeos Query untuk menampung dan mengeksekusi perintah SQL.
  • Baris 5 s/d 9 : validasi jika radio group tidak ada yang dipilih atau diklik maka muncul dialog untuk memilih salah satu pilihan pencarian.
  • Baris 11 s/d 26 : merupakan pencarian berdasarkan pilihan radio group pertama yaitu Kode Barang, jadi yang dicari kode barang pada tabel barang. Pencarian ini menggunakan LIKE, supaya hasil pencariannya lebih luas dan dapat mencari kode barang yang memiliki kemiripan sesuai dengan key pencarian atau text yang diketikkan pada edit text pencarian.
  • Baris 13 s/d 15 : perintah SQL pencarian berdasarkan kode barang.
  • Baris 16 s/d 23 : dialog jika pencarian tidak menemukan data barang yang dicari, atau data barang yang dicari tidak ada.
  • Baris 25 : jika data barang yang dicari dapat ditemukan maka setfocus akan langsung mengarah ke grid barang yang menampilkan data barang yang dicari.
  • Baris 28 s/d 42 : pencarian berdasarkan pilihan radio group kedua yaitu Nama Barang.
  • Baris 29 s/d 31 : perintah SQL pencarian berdasarkan nama barang.
  • Baris 32 s/d 39 : dialog jika nama barang yang dicari tidak ditemukan.
  • Baris 41 : setfocus pada grid barang jika nama barang yang dicari telah ditemukan.

procedure tf_barang.tampil;

procedure tf_barang.tampil;
var s:string;
begin
with dm.ZQuery1 do
begin
if RecordCount=0 then
begin
  MessageDlg('Data Mobil Belum Ada',mtInformation,[mbOK],0);
  btambah.SetFocus;
  exit;
end
else
begin
  kb:=FieldByName('kd_barang').AsString;
  nb:=FieldByName('nm_barang').AsString;
  ekd.Text:=FieldByName('kd_barang').AsString;
  enama.Text:=FieldByName('nm_barang').AsString;
  ejml.Text:=inttostr(FieldByName('qty').AsInteger);
  csatuan.Text:=FieldByName('satuan').AsString;
  dttgl.Date:=FieldByName('tgl_beli').AsDateTime;
  eharga.Text:=inttostr(FieldByName('harga').AsInteger);
  s:=ExtractFilePath(Application.ExeName)+'\img\'+FieldByName('foto').AsString;
  if FileExists(s) then
  begin
    blek:=false;
    foto.Picture.LoadFromFile(s);
  end
  else
  begin
    blek:=true;
    foto.Picture.LoadFromFile(pchar(ExtractFilePath(Application.ExeName)+'book.jpg'))
  end;
  sket:=FieldByName('foto').AsString;
end;
end;
end;

Procedure ini digunakan untuk menampilkan data barang pada grid barang ke inputan form barang, namun inputan tetap tidak aktif sebelum tombol ubah di klik, untuk mengubah data barang. Procedure tampil ini dijalankan saat grid barang di klik atau ditekan tombol Enter.

  • Baris 7 s/d 10 : validasi atau dialog muncul jika data barang tidak atau belum ada namun grid barang sudah di klik. Dialog ini juga berfungi sebagai error handling, karena jika data barang kosong maka script dibawahnya dapat menjadi error karena isi dalam field kosong.
  • Baris 13 s/d 34 : menampilkan data barang pada inputan yang tersedia, termasuk foto barang.

procedure Tf_barang.gbarangCellClick;

procedure Tf_barang.gbarangCellClick(Column: TColumn);
begin
tampil;
end;

ketika cell pada grid barang di klik maka langsung akan menjalankan procedure tampil.

Naah sudah komplit fungsi pencarian pada delphi mudah bukan, sekarang tinggal Anda coba dan kembangkan sesuai dengan kebutuhan dan tuntutan. Jika ada salah dan kurangnya atau ada pertanyaan silahkan langsung saja di komen, saya senang sekali kalo ada yang mau komen di blog sederhana saya. So selamat mencoba. 🙂

Sorcecode lengkapnya ada disini

Aplikasi Database Sederhana Dengan Delphi

Codegratis.wordpress.com. Mari belajar coding dengan mudah dan sederhana. Dalam post blog saya kali ini kita akan belajar membuat aplikasi database sederhana dengan delphi. Aplikasi yang akan kita buat digunakan sebagai contoh untuk menginput data barang. Namun sebelum kita belajar untuk membuat aplikasi ini sebelumnya saya akan menjelaskan spesifikasi software yang saya gunakan.

Software Version
Windows 7 Home Premium 64 bit
Delphi Embarcadero Delphi XE2
XAMPP Win32 5.6.3
ZEOS 7.1.2 stable
TMS Component Pack 6.4.4.1
QuickReport 5.05 Pro

Baiklah karena spesifikasi software yang saya gunakan telah jelas marilah kita langsung mulai belajar membuat aplikasi database sederhana dengan delphi yang kali ini kita ambil tema tentang data barang.

1. DATABASE

Database Management System (DBMS) yang kita gunakan pada aplikasi ini MySQL, karena MySQL paling banyak penggunanya dan lebih mudah digunakan. MySQL yang kita gunakan kali ini sudah include dalam virtual server XAMPP. Baiklah untuk membangun database dengan MySQL langsung saja buka browser dan ketikkan localhost/phpmyadmin pada address bar. Buat database dengan nama barang, lalu buat tabel dengan nama tabel t_barang, untuk rincian field pada t_barang sebagai berikut :

Nama Field Tipe Lebar Penyortiran Keterangan
kd_barang* Varchar 4 ascii_bin User name (Primary Key)
nm_barang Varchar 20 Nama barang
satuan Varchar 5
qty Int 3 Jumlah
tgl_beli Date Tanggal pembelian
harga Int 6
foto Varchar 8

2. MEMULAI MEMBUAT PROJECT DENGAN DELPHI

Setelah kita buat database pada MySQL selanjutnya kita langsung saja buat project baru pada delphi. Pertama buka delphi lalu pilih menu File – New – VCL Form Applications. Setelah itu akan muncul sebuah form baru, lalu klik tombol Save All untuk menyimpan form pertama yang akan kita buat beri nama u_main, form ini akan kita gunakan sebagai menu utama aplikasi. Setelah itu klik tombol Save All lagi untuk menyimpan project delphi, beri nama prj_barang. Ok setelah form menu utama dan project barang kita simpan langkah selanjutnya adalah merancang form menu utama, berikut ini adalah rancangan form menu utama
 menu_barang_zps4a14ibnr.jpg

Object dan properties yang digunakan pada form menu utama adalah sebagai berikut :

Nama Object Nama Property Setting Nilai
Form Main (Menu Utama) Align Custom
Border icons biMaximize false
Border style bsSingle
Caption Toko Alat Tulis Abadi
Font Name Segoe UI Light
Font size 10
Name f_main
Position poScreenCenter
WindowState wsMaximized
MainMenu1 Klik 2x
D1 Caption Data
B1 Caption Barang
L1 Caption Laporan
B2 Caption Barang
K1 Caption Keluar
Panel1 Align alTop
Caption TOKO ALAT TULIS ABADI
Font Name Segoe UI Light
Font Size 18
Font Style Bold

Untuk membuat menu pada form menu utama gunakan komponen TMainMenu, selanjutnya letakkan pada form menu utama lalu klik dua kali dan ketik menu apa saja yang akan kita tampilkan.

3. KONEKSI DATABASE MYSQL DENGAN DELPHI

Untuk dapat mengkoneksikan database yang telah kita buat dengan delphi maka kita memerlukan konektor, salah satu konektor yang dapat kita gunakan adalah ZEOS. ZEOS merupakan konektor database pada delphi yang disediakan oleh pihak ketiga. Baiklah langsung saja kita buat koneksi database MySQL dengan ZEOS. Pertama buat form baru yang akan kita gunakan sebagai Data Module pada delphi, Data Module adalah form yang berfungsi khusus untuk koneksi database pada delphi. Cara membuat form Data Module klik menu File – New – Data Module, lalu simpan dengan nama u_dm. Setelah itu masukkan component pada Data Module antara lain ZConnection untuk koneksi ke MySQL, ZQuery untuk memasukkan perintah SQL, dan DataSource  untuk menampilakan data pada form.
datamodule barang  dm_zpstpxarrf6.jpg
Object dan properties yang digunakan pada form Data Module adalah sebagai berikut :

Nama Object Nama Property Setting Nilai
Form Datamodule Name dm
ZConnection1 Database barang
HostName localhost
Port 3306
Protocol mysql-5
User root
Connected true
ZQuery1 Connection ZConnection1
DataSource1 Dataset ZQuery1

Jika setting properties pada ZConnection tidak tepat maka property Connected tidak akan dapat diseting menjadi true, itu berarti koneksi ke database MySQL masih gagal, jika Connected sudah dapat diseting menjadi true, maka berarti koneksi ke database MySQL sudah sukses, horeee Selamat.  Jangan lupa di Save All.

4. MEMBUAT FORM BARANG

Form barang adalah form yang kita gunakan untuk menginput, mengedit, menghapus, dan mencari data barang. Form ini adalah form utama pada aplikasi ini dimana fungsi-fungsi database pada delphi diaplikasikan. Baiklah langsug saja kita buat form baru caranya klik File – New – VCL Form, simpan dengan nama u_barang. Berikut adalah rancangan form barang, jika ada yang memiliki rancangan model lainnya monggo silahkan, tapi rancangan dan komponen dasarnya seperti ini :
desain form barang photo barang_zpsxars3vgr.jpg

Sedangkan untuk object dan properties yang digunakan pada form barang adalah sebagai berikut :

Nama Object Nama Property Setting Nilai
Form barang Align Custom
Border style bsDialog
Caption
Font Name Segoe UI Light
Font size 10
Name f_barang
Position poScreenCenter
Label1 Caption Barang
Font Size 12
Label2 Caption Kode Barang
Edit1 CharCase ecUpperCase
Name ekd
Enabled False
Label3 Caption Nama Barang
Edit2 CharCase ecUpperCase
MaxLength 20
Name enama
Enabled False
Label4 Caption Jumlah
Edit3 Alignment taRightJustify
MaxLength 3
Name ejml
Enabled False
NumbersOnly True
Label5 Caption Satuan
Combo box 1 CharCase ecUpperCase
Enabled False
Items PCSPACK

RIM

BOX

KOTAK

LUSIN

Name csatuan
Label6 Caption Tanggal Pembelian
DateTimePicker 1 Enabled False
Format dd/mm/yyyy
name dttgl
Label7 Caption Harga
Edit4 Alignment taRightJustify
MaxLength 7
Name eharga
Enabled False
NumbersOnly True
Label8 Caption Foto
Shape1 Height 95
Width 91
TAdvGDIPPicture1 Align Custom
Height 91
Name foto
Stretch True
Width 87
OpenPictureDialog1 Filter File Gambar JPG (*.jpg)|*.jpg|File Gambar JPEG (*.jpeg)|*.jpeg
Title Cari Foto Barang
Button1 Caption &Cari Foto
Cursor crHandPoint
Font size 8
Button2 Caption &Tambah
Cursor crHandPoint
Font size 8
Button3 Caption &Ubah
Cursor crHandPoint
Font size 8
Button4 Caption &Tambah
Cursor crHandPoint
Font size 8
Button5 Caption &Hapus
Cursor crHandPoint
Font size 8
Button6 Caption &Keluar
Cursor crHandPoint
Font size 8
Panel1 Caption
Label9 Caption Cari
RadioGroup1 Columns 2
Items Kode BarangNama Barang
Name rgcari
Edit5 CharCase ecUpperCase
MaxLength 20
Name ecari
Button7 Caption &Cari
Cursor crHandPoint
Font size 8
DBGrid1 Font Size 8
Name gbarang
Options dgEditing false
dgRowSelect true
ReadOnly true
TitleFont Size 8
Style fsBold
Column[0] FieldName kd_barang
Title – Alignment taCenter
Title – Caption Kode Brg.
Column[1] FieldName nm_barang
Title – Alignment taCenter
Title – Caption Nama Brg.
Column[2] FieldName qty
Title – Alignment taCenter
Title – Caption Jumlah
Column[3] FieldName satuan
Title – Alignment taCenter
Title – Caption Satuan
Column[4] FieldName tgl_beli
Title – Alignment taCenter
Title – Caption Tgl. Pembelian
Column[5] FieldName harga
Title – Alignment taCenter
Title – Caption harga

Ok setelah Anda benar dalam merancang form dan menyamakan properties komponen pada form barang, maka selanjutnya kita akan bahas mengenai coding dari form barang. Sebelum memulai coding kita harus menghubungkan terlebih dahulu antara form menu utama dengan form barang, agar form barang dapat ditampilan langsung pada menu utama. Caranya buka fom menu utama yang tadi telah kita buat, setelah itu pilih menu File – Use Unit – pilih u_barang lalu OK. Selajutnya pada MainMenu1 klik 2x pada menu Data submenu Barang klik 2x, lalu ketikkan f_barang.showmodal; ok form barang telah dapat ditampilakan dari menu utama, jangan lupa Save All.

Kembali lagi ke form barang, sekarang kita tinggal mengkoneksikan antara form barang dengan form Data Module supaya form barang dapat mengakses database MySQL. Caranya tinggal use unit form Data Module pada form barang, caranya sama seperti Use Unit sebelumnya. Ok sekarang form barang sudah terhubung dengan form Data  Module, baiklah sekarang langsung lanjut coding form barang, tapi jangan lupa Save All.

  • Variabel yang digunakan pada form barang

Untuk menulisakan variabel pada delphi, langsung saja tulis dibawah tulisan f_barang: Tf_barang; dibawah tulisan var sebelum tulisan implementation.

var
  f_barang: Tf_barang;
  asalgambar,gambar,foto,fotolama,sket,kb,nb:string;
  datalama,blek:boolean;
  • Prosedure buatan sendiri atau tambahan pada form barang

Untuk menulisakan prosedure buatan sendiri pada delphi sangat mudah caranya, sama seperti membuat variabel, lansung diketik saja. Ketik nama prosedure terlebih dahulu sebelum tulisan private, setelah itu baru ketik isi prosedure dibawah tulisan {$R *.dfm} dibawah implementation.

procedure mati;
procedure aktif;
procedure matik;
procedure bersih;
procedure tampil;
  •  Prosedure mati, digunakan untuk menonaktifkan inputan
procedure tf_barang.mati;
begin
enama.Enabled:=false;
ejml.Enabled:=false;
csatuan.Enabled:=false;
dttgl.Enabled:=false;
eharga.Enabled:=false;
bfoto.Enabled:=false;
btambah.Caption:='&Tambah';
bubah.Caption:='&Ubah';
bhapus.Enabled:=true;
bexit.Enabled:=true;
ecari.Enabled:=true;
rgcari.Enabled:=true;
bcari.Enabled:=true;
gbarang.Enabled:=true;
end;
  •  Prosedure aktif, digunakan untuk mengaktifkan inputan
procedure tf_barang.aktif;
begin
enama.Enabled:=true;
ejml.Enabled:=true;
csatuan.Enabled:=true;
dttgl.Enabled:=true;
eharga.Enabled:=true;
bfoto.Enabled:=true;
btambah.Caption:='&Batal';
bubah.Caption:='&Simpan';
bhapus.Enabled:=false;
bexit.Enabled:=false;
ecari.Enabled:=false;
rgcari.Enabled:=false;
bcari.Enabled:=false;
gbarang.Enabled:=false;
enama.SetFocus;
end;
  •  Prosedure matik, digunakan untuk menghasilkan kode otomatis atau nomor otomatis sebagai primary key pada tabel barang tepatnya pada field kd_barang
procedure tf_barang.matik;
var i:integer;
begin
with DM.ZQuery1  do
begin
i:=1;
sql.Clear;
sql.Add('select * from t_barang');
open;
if IsEmpty then
 kb:='B'+format('%.3d',[i])
else
begin
  last;
  i:=StrToInt(copy((FieldByName('kd_barang').AsString),2,3))+1;
  kb:='B'+format('%.3d',[i]);
end;
ekd.Text:=kb;
end;
end;
  •  Prosedure bersih, digunakan untuk membersihkan inputan
procedure tf_barang.bersih;
begin
ekd.Clear;
enama.Clear;
ejml.Clear;
csatuan.Text:='';
dttgl.Date:=date();
eharga.Clear;
foto.Picture:=nil;
end;
  •  Prosedure tampil, digunakan untuk menampilkan data dari DBGrid ke inputan, pada saat datanya diklik atau dipilih. Terdapat satu variabel pada procedure ini
procedure tf_barang.tampil;
var s:string;
begin
with dm.ZQuery1 do
begin
if RecordCount=0 then
begin
  MessageDlg('Data Mobil Belum Ada',mtInformation,[mbOK],0);
  btambah.SetFocus;
  exit;
end
else
begin
  kb:=FieldByName('kd_barang').AsString;
  nb:=FieldByName('nm_barang').AsString;
  ekd.Text:=FieldByName('kd_barang').AsString;
  enama.Text:=FieldByName('nm_barang').AsString;
  ejml.Text:=inttostr(FieldByName('qty').AsInteger);
  csatuan.Text:=FieldByName('satuan').AsString;
  dttgl.Date:=FieldByName('tgl_beli').AsDateTime;
  eharga.Text:=inttostr(FieldByName('harga').AsInteger);
  s:=ExtractFilePath(Application.ExeName)+'\img\'+FieldByName('foto').AsString;
  if FileExists(s) then
  begin
    blek:=false;
    foto.Picture.LoadFromFile(s);
  end
  else
  begin
    blek:=true;
    foto.Picture.LoadFromFile(pchar(ExtractFilePath(Application.ExeName)+'book.jpg'))
  end;
  sket:=FieldByName('foto').AsString;
end;
end;
end;
  •  Prosedure ribuan, digunakan untuk menghasilkan tanda pemisah pada angka ribuan, jika format US menggunakan koma ( , ) sebagai pemisah ribuannya, jika format Indonesia menggunakan titik ( . ) sebagai pemisah ribuannya. Prosedure ini digunakan untuk hal-hal yang berhubungan dengan uang, contohnya harga,pembayaran, setoran, total bayar, dll. Terdapat dua variabel pada procedure ini
procedure ribuan(edit : Tedit);
var
  sRupiah: string;
  iRupiah: Currency;
begin
  //ribuan --> currency ( menyesuaikan setting windows )
  sRupiah := edit.Text;
  sRupiah := StringReplace(sRupiah,',','',[rfReplaceAll,rfIgnoreCase]); // hilangkan char koma , pemisah //ribuan selain IDR
  sRupiah := StringReplace(sRupiah,'.','',[rfReplaceAll,rfIgnoreCase]); //remove char titik .    pemisah //ribuan IDR
  iRupiah := StrToCurrDef(sRupiah,0); // convert srupiah ke currency

  //currency --> format ribuan
  edit.Text := FormatCurr('##,###,###',iRupiah);
  edit.SelStart := length(edit.text);
end;
  • Function buatan sendiri atau tambahan pada form barang

Kalo tadi kita sudah belajar membuat procedure tambahan, sekarang kita belajar membuat function pada delphi. Prosedure pada delphi digunakan untuk melakukan proses dengan multy output, sedangakan function pada delphi digunakan untuk melakukan proses dengan single output. Membuat function pada delphi malah lebih mudah dari pada membuat procedure, caranya langsung saja ketik nama function dan isi function  dibawah tulisan {$R *.dfm} dibawah implementation.

  • Function hapusribuan, digunakan untuk mengembalikan inputan angka yang telah ditambahkan pemisah ribuan baik itu format koma atau titik ke angka biasa tanpa pemisah ribuan. Function ini digunakan pada saat menyimpan angka integer ke MySQL karena MySQL tidak dapat menerima angka integer dengan pemisah ribuan. Terdapat satu variabel pada function ini.
function hapusribuan(edit : Tedit): string;
var hasil : string;
begin
  hasil := edit.text;
  hasil := StringReplace(hasil,',','',[rfReplaceAll,rfIgnoreCase]);
  hasil := StringReplace(hasil,'.','',[rfReplaceAll,rfIgnoreCase]);
  hapusribuan := hasil;
end;

Variabel, procedure, dan function tambahan sudah dibuat eiiiits jangan lupa Save All, sekarang tinggal membuat prosedure sesuai event pada setiap komponen pada form barang. Untuk menuliskan prosedure pada komponen yang digunakan pada form cukup klik komponen lalu pilih events yang akan kita isi prosedurenya atau akan kita tuliskan codingnya, events ada disebah properties komponen, klik 2x events untuk menuliskan coding didalamnya. Berikut ini adalah prosedure pada events setiap komponen pada form barang :

  • Procedure Tf_barang.FormShow, prosedure ini digunakan pada saat form pertama kali tampil, untuk menentukan tabel yang kita gunakan dan data yang ditampilkan pada form. Pada prosedure ini kita mulai menggunakan perintah SQL, dimana perintah tersebut akan digunakan terus dalam coding form ini yang berhubungan database. Kenapa mengunakan perintah SQL, karena kita menggunakan database MySQL, perintah SQL adalah standar atau aturan baku dalam DBMS secara global, perintah SQL dapat diterima di semua software DBMS, dan perintah SQL bersifat bug free and easy to use menurut saya, sehingga tidak usah mengcoding dua kali untuk mengakses database dari delphi.
  • Procedure Tf_barang.ehargaChange, prosedure ini digunakan untuk menambahkan pemisah ribuan pada saat mengiput harga. Prosedure ini hanya memanggil prosedure ribun yang telah kita buat sebelumnya
procedure Tf_barang.ehargaChange(Sender: TObject);
begin
ribuan(eharga);
end;
  •  Procedure Tf_barang.bfotoClick, digunakan untuk memilih foto yang akan tampilkan pada form sebelum disimpan pada database
procedure Tf_barang.bfotoClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
if OpenPictureDialog1.FileName <> '' then
  begin
    foto.Picture.LoadFromFile(OpenPictureDialog1.FileName);
  end;
end;
end;
  •  Procedure Tf_barang.rgcariClick, digunakan untuk setfocus ke EditText Cari, jadi jika salah satu kategori pencarian atau radio group diklik inputan akan langsung mengarah ke EditText Cari.
procedure Tf_barang.rgcariClick(Sender: TObject);
begin
ecari.SetFocus;
end;
  •  Procedure Tf_barang.bcariClick, digunakan saat tombol cari diklik. Pencarian data menggunakan perintah SQL Select * from t_barang where…….
procedure Tf_barang.bcariClick(Sender: TObject);
begin
with dm.ZQuery1 do
begin
if rgcari.ItemIndex=-1 then
begin
  MessageDlg('Kategori Pencarian Belum Dipilih',mtInformation,[mbOK],0);
  exit;
end
else
if rgcari.ItemIndex=0 then
begin
  sql.Clear;
  sql.Add('select * from t_barang where kd_barang like "%'+ecari.Text+'%"');
  open;
  if (RecordCount=0)  then
  begin
    MessageDlg('Kode Barang '+ecari.text+' Tidak Ditemukan',mtInformation,[mbOK],1);
    formshow(sender);
    ecari.Clear;
    rgcari.ItemIndex:=-1;
    exit;
  end
  else
    gbarang.SetFocus;
end
else
begin
  sql.Clear;
  sql.Add('select * from t_barang where nm_barang like "%'+ecari.Text+'%"');
  open;
  if (RecordCount=0)  then
  begin
    MessageDlg('Nama Barang '+ecari.text+' Tidak Ditemukan',mtInformation,[mbOK],1);
    formshow(sender);
    ecari.Clear;
    rgcari.ItemIndex:=-1;
    exit;
  end
  else
    gbarang.SetFocus;
end;
end;
end;
  •  Procedure Tf_barang.gbarangClick, digunakan pada saat grid yang berisi data barang diklik maka data akan langsung ditampilkan pada inputan termasuk foto barang
procedure Tf_barang.gbarangCellClick(Column: TColumn);
begin
tampil;
end;
  •  Procedure Tf_barang.bexitClick, digunakan pada saat tombol keluar diklik
procedure Tf_barang.bexitClick(Sender: TObject);
begin
bersih;
close;
end;
  •  Procedure Tf_barang.bhapusClick, digunakan pada saat tombol hapus diklik, untuk menghapus data barang. Namun sebelum data barang dihapus akan tampil dialog apakah data barang akan benar-benar dihapus oleh pengguna. Pada saat menghapus data barang menggunakan perintah SQL Delete from t_barang where ………
procedure Tf_barang.bhapusClick(Sender: TObject);
begin
with dm.ZQuery1 do
begin
if enama.Text='' then
begin
  Messagedlg('Data Barang Belum Dipilih',mterror,[MBOK],1);
  exit;
end;
if MessageDlg('Apakah Data Barang '+enama.Text+' Akan Dihapus?',mtConfirmation,[mbYes,mbNo],0)=mryes then
  begin
    DeleteFile(pchar(ExtractFilePath(Application.ExeName)+'\img\'+kb+'.jpg'));
    sql.Clear;
    sql.Add('delete from t_barang where kd_barang='+QuotedStr(kb));
    ExecSQL;
    MessageDlg('Data Barang '+enama.Text+' Telah Dihapus',mtInformation,[mbOK],0);
    bersih;
    FormShow(sender);
    exit;
  end
  else
  begin
    bersih;
    FormShow(sender);
    exit;
  end;
end;
end;
  •  Procedure Tf_barang.btambahClick, digunakan pada saat menambah data barang baru. Tombol tambah memiliki fungsi ganda yaitu sebagai tombol batal. Coding pada tombol ini hanya memanggil prosedure sebelunya yang telah kita buat
procedure Tf_barang.btambahClick(Sender: TObject);
begin
if btambah.Caption='&Tambah' then
begin
  datalama:=false;
  FormShow(sender);
  bersih;
  aktif;
  matik;
end
else
begin
  bersih;
  FormShow(sender);
  mati;
end;
end;
  •  Procedure Tf_barang.bubahClick, digunakan pada saat kita akan merubah data barang,  namun sebelum dapat merubah data barang kita harus memilih data barang yang ingin kita ubah dari DBGrid. Tombol ini juga memiliki fungsi ganda yakni sebagai tombol simpan. Pada saat menyimpan data barang menggunakan perintah SQL Insert into t_barang values……. Sedangkan perintah SQL untuk mengedit data barang adalah Update t_barang set……. Sebelum data dapat kita disimpan terdapat validasi untuk memastikan semua inputan sudah terisi dengan benar
procedure Tf_barang.bubahClick(Sender: TObject);
var plak:string;
begin
with dm.ZQuery1 do
begin
if bubah.Caption='&Ubah' then
begin
  if enama.Text = '' then
  begin
    MessageDlg('Data Barang Belum Dipilih',mtInformation,[mbOK],0);
    exit;
  end;
  datalama:=true;
  aktif;
  fotolama:=OpenPictureDialog1.FileName;
end
else
begin
  if enama.Text = '' then
  begin
    Messagedlg('Nama Barang Belum Diisi',mterror,[MBOK],1);
    enama.SetFocus;
    exit;
  end;
  if ejml.Text = '' then
  begin
    Messagedlg('Jumlah Barang Belum Diisi',mterror,[MBOK],1);
    ejml.SetFocus;
    exit;
  end;
  if csatuan.Text = '' then
  begin
    Messagedlg('Satuan Barang Belum Dipilih',mterror,[MBOK],1);
    csatuan.SetFocus;
    exit;
  end;
  if eharga.Text = '' then
  begin
    Messagedlg('Harga Barang Belum Diisi',mterror,[MBOK],1);
    eharga.SetFocus;
    exit;
  end;
  if foto.Picture.Empty then
  begin
    Messagedlg('Foto Barang Belum Ada',mterror,[MBOK],1);
    enama.SetFocus;
    exit;
  end;
  if datalama=false then
  begin
    sql.Clear;
    sql.Add('select * from t_barang where nm_barang='+QuotedStr(enama.Text));
    open;
    if not isempty then
    begin
      Messagedlg('Nama Barang Sudah Ada',mterror,[MBOK],1);
      enama.Clear;
      enama.SetFocus;
      exit;
    end;
    asalgambar:=OpenPictureDialog1.FileName;
    gambar:=ExtractFilePath(Application.ExeName)+'img\';
    CopyFile(pchar(asalgambar),pchar(gambar+ekd.Text+ExtractFileExt(OpenPictureDialog1.FileName)),false);
    sql.Clear;
    sql.Add('insert into t_barang values('+QuotedStr(ekd.Text)+','
      +QuotedStr(enama.Text)+','
      +QuotedStr(csatuan.Text)+','
      +QuotedStr(ejml.Text)+','
      +QuotedStr(FormatDateTime('yyyy-mm-dd',dttgl.Date))+','
      +QuotedStr(hapusribuan(eharga))+','
      +QuotedStr(ekd.Text+ExtractFileExt(OpenPictureDialog1.FileName))+')');
    ExecSQL;
    MessageDlg('Data Barang Telah Disimpan',mtInformation,[mbOK],1);
    bersih;
    mati;
    formshow(sender);
    exit;
  end
  else
  begin
    if (enama.Text)<>(nb) then
    begin
      sql.Clear;
      sql.Add('select * from t_barang where nm_barang='+QuotedStr(enama.Text));
      open;
      if not isempty then
      begin
        Messagedlg('Nama Barang Sudah Ada',mterror,[MBOK],1);
        enama.Clear;
        enama.SetFocus;
        exit;
      end;
    end;
    if OpenPictureDialog1.FileName <> fotolama then
    begin
      DeleteFile(pchar(ExtractFilePath(Application.ExeName)+'\img\'+ekd.Text+'.jpg'));
      asalgambar:=OpenPictureDialog1.FileName;
      gambar:=ExtractFilePath(Application.ExeName)+'img\';
      CopyFile(pchar(asalgambar),pchar(gambar+ekd.Text+ExtractFileExt(OpenPictureDialog1.FileName)),false);
    end
    else
    begin
      plak:=(ExtractFilePath(Application.ExeName)+'book.jpg');
      gambar:=ExtractFilePath(Application.ExeName)+'img\';
      if blek=true then
        CopyFile(pchar(plak),pchar(gambar+ekd.Text+'.jpg'),false)
      else
      begin
        if RenameFile(gambar+sket,gambar+ekd.Text+'.jpg') then
          showmessage('Nama File Foto Barang '+enama.Text+' Telah Diubah')
        else
          showmessage('Nama File Foto Barang '+enama.Text+' Gagal Diubah');
      end;
    end;
    sql.Clear;
    sql.Add('update t_barang set');
    sql.Add('nm_barang='+QuotedStr(enama.Text)+',');
    sql.add('satuan='+QuotedStr(csatuan.Text)+',');
    sql.Add('qty='+QuotedStr(ejml.Text)+',');
    sql.Add('tgl_beli='+QuotedStr(FormatDateTime('yyyy-mm-dd',dttgl.Date))+',');
    sql.Add('harga='+QuotedStr(hapusribuan(eharga))+' ');
    sql.Add('where kd_barang='+QuotedStr(ekd.Text));
    ExecSQL;
    MessageDlg('Data Barang '+enama.text+' Telah Diubah',mtInformation,[mbOK],1);
    bersih;
    mati;
    formshow(sender);
    exit;
  end;
end;
end;
end;

Baiklah jika semua prosedure sudah diisi dengan benar jangan lupa Save All dan coba jalankan form yang kita buat dengan menekan tombol F9, jika tidak ada yg error maka akan tampil form barang seperti berikut ini :
form barang photo Untitled-4_zpsljxsxgcc.jpg
Jangan lupa ya diuji coba setiap inputan dan tombol apakah sudah sesuai dengan yang diharapkan.

5. MEMBUAT LAPORAN BARANG

Setelah membuat form barang selanjutnya adalah membuat form untuk menampilkan laporan barang. Buat form baru dan simpan dengan nama u_lap, setelah itu buka kembali form menu utama untuk Use Unit form laporan agar dapat ditampilkan langsung dari menu utama. Kembali lagi ke form laporan barang selanjutnya Use Unit form Data Module, agar dapat menampilkan laporan barang dari database barang. Untuk dapat menampilkan report pada form laporan barang menggunakan komponen QuickReport, caranya klik komponen TQuickRep lalu letakkan pada bagian form yang kosong. Pada TQuickRep ini kita menggunakan empat band, Title digunakan sebagai kop atau header report, ColumnHeader untuk menampilkan keterangan atau header kolom tabel laporan data barang, Detail untuk menampilkan data barang yang ada pada database pada report, sedangkan Page Footer digunakan untuk menampilkan footer report yang biasanya berisi halaman laporan. Untuk dapat menampilkan data barang pada Detail perlu menggunakan TQRDBText sedangankan untuk menampilkan nomor urut pada report gunakan TQRExpr. Pada bagian PageFooter untuk menampilkan halaman report gunakan TQRSysData, lalu ubah properties data ke qrsPageNumber. Baiklah langsung saja kita desain form laporan barang seperti dibawah ini :
desain form laporan barang photo lap_barang_zpsceoqfucy.jpg
Object dan properties yang digunakan pada form laporan barang adalah sebagai berikut :

Nama Object Nama Property Setting Nilai
Form Laporan Barang Align Custom
Border style bsDialog
Caption
Font Name Segoe UI Light
Font size 10
Name f_lap
Label1 Caption Laporan Barang
Font Size 12
Button1 Caption &Cetak
Cursor crHandPoint
Font size 8
Button2 Caption &Keluar
Cursor crHandPoint
Font size 8
QuickReport1 Bands HasColumnHeader True
HasDetail True
HasPageFooter True
HasTitle True
Dataset dm.ZQuery1
Name qr1
PreviewInitialState wsMaximize
ReportTitle Laporan Barang
QRLabel1 Aligment taCenter
QRLabel1 AlignToBand True
QRLabel1 caption TOKO ALAT TULIS ABADI
QRLabel1 font  Size 12
QRLabel2 Aligment taCenter
QRLabel2 AlignToBand True
QRLabel2 caption LAPORAN BARANG
QRLabel3 Aligment taCenter
QRLabel3 AlignToBand True
QRShape1 Height 30
QRShape1 Width 46
QRShape2 Height 30
QRShape2 Width 110
QRShape3 Height 30
QRShape3 Width 173
QRShape4 Height 30
QRShape4 Width 71
QRShape5 Height 30
QRShape5 Width 71
QRShape6 Height 30
QRShape6 Width 125
QRShape7 Height 30
QRShape7 Width 87
QRlabel4 caption NO.
QRlabel4 font Style fsBold
QRlabel5 caption KODE BARANG
QRlabel5 font Style fsBold
QRlabel6 caption NAMA BARANG
QRlabel6 font Style fsBold
QRlabel7 caption JUMLAH
QRlabel7 font  Style fsBold
QRlabel8 caption SATUAN
QRlabel8 font  Style fsBold
QRlabel9 caption TGL. PEMBELIAN
QRlabel9 font Style fsBold
QRlabel10 caption HARGA
QRlabel10 font  Style fsBold
QRShape8 Height 30
QRShape8 Width 46
QRShape9 Height 30
QRShape9 Width 110
QRShape10 Height 30
QRShape10 Width 173
QRShape11 Height 30
QRShape11 Width 71
QRShape12 Height 30
QRShape12 Width 71
QRShape13 Height 30
QRShape13 Width 125
QRShape14 Height 30
QRShape14 Wight 87
QRExpr1 alignment taRightJustify
Expression count
Master qr1
QRDBText1 Alignment taLeftJustify
Datafield kd_barang
Dataset Dm.ZQuery1
QRDBText2 Alignment taLeftJustify
Autosize false
Datafield nm_barang
Dataset Dm.ZQuery1
QRDBText3 Alignment taRightJustify
Datafield qty
Dataset Dm.ZQuery1
QRDBText4 Alignment taLeftJustify
Datafield satuan
Dataset Dm.ZQuery1
QRDBText5 Alignment taLeftJustify
Datafield tgl_beli
Dataset Dm.ZQuery1
QRDBText6 Alignment taRightJustify
Datafield harga
Dataset Dm.ZQuery1
QRLabel11 Caption Halaman :
QRSysData1 Alignment taRightJustify
Data qrsPageNumber

Desain laporan sudah beres jangan lupa Save All, setelah itu baru kita melangkah untuk mengisi codingnya. Coding form laporan barang sangat singkat hanya ada dua prosedure, yaitu presedure tombol cetak klik dan prosedure tombol keluar klik

  • Tf_lap.bexitClick, prosedure ini untuk menutup atau keluar dari form cetak laporan barang, isinya sangat gampang cukup satu kata saja, yaitu close;
  • Tf_lap.bcetakClick, prosedure ini untuk mencetak atau menampilkan report data barang menggunakan QuickReport. Terdapat perintah SQL pada prosedure ini, SQLnya sangat sederhana hanya menggunakan Select * from t_barang
procedure Tf_lap.bcetakClick(Sender: TObject);
begin
with dm.ZQuery1 do
begin
sql.Clear;
sql.Add('select * from t_barang');
open;
qrlabel3.Caption:='Per '+FormatDateTime('dd mmmm yyyy',now());
qr1.Preview;
end;
end;

Gampang bukan prosedure  pada form laporan barang, jika sudah selesai jangan lupa Save All. Untuk lebih memperindah tampilan form laporan barang dapat diperkecil, jangan takut tidak akan mengganggu tampilan report kok, jika diperkecil tampilan form laporan barang hasilnya seperti ini.
form laporan barang diperkecil photo lap_barang2_zpskuukp22q.jpg
Lalu test runing hasil dari laporan barang seperti dibawah ini
laporan barang photo lap_barang3_zpsnkvvbbto.jpg
Jika sudah sesuai berarti Anda telah dapat membuat aplikasi database sederhana dengan delphi. Mantaaaaaaaaaap 😉

Untuk contoh aplikasi ini secara lengkap nanti akan saya share, karena aplikasi ini masih digunakan untuk praktek murid saya di SMK. Mohon kritik dan sarannya, jika ada yang kurang tepat dalam penyampaian tutorial ini langsung saja komen yaaaaa, nanti komennya langsung akan saya jawab. Terimakasih, belum pintar kalo belum sharing.