Instalasi Firebird 4.0 secara manual

Assalamu’alaikum Wr. Wb.

Kangen nulis lagi setelah lama vakum.

Pada kesempatan kali ini saya ingin berbagi sedikit tentang cara instalasi Firebird (pada contoh ini Firebird 4.0) secara manual sehubungan dengan sudah ada instalasi Firebird sebelumnya, sebagaimana kita ketahui bahwa instalasi standar selalu menindih service Firebird sebelumnya.

Instalasi manual ini diperlukan juga manakala kita ingin menginstall lebih dari satu versi Firebird dalam satu komputer.

Syarat untuk dapat install lebih satu versi Firebird dalam komputer yang sama adalah membuat unik point-point berikut, misal pada Firebird 4.0 saya atur sbb :

  1. Folder = c:\fb40
  2. Port = 3065
  3. IPCName = FIREBIRD40
  4. Service Name = fb40

Langsung saja kita mulai dengan melakukan download master Firebirdnya,

masuk ke http://firebirdsql.org/en/firebird-4-0/ kemudian cari yang typenya zip.

kita bisa pilih yang 32bit atau 64bit, jika kita install yang versi 64 bit dan aplikasi kita (project Delphi misalnya) yang dicompile dengan win32, maka kita perlu download juga paket 32 bit untuk mengambil beberapa client library yang mana kita perlukan.

Setelah kita download master Firebird dalam bentuk zip diatas, extract semua isinya kedalam satu folder yang telah kita siapkan misalnya c:\fb40,

untuk 64bit ada tambahan beberapa file dari paket 32bit yang harus diextract kedalam folder c:\fb40\Wow64 yaitu fbclient.dll, firebird.msg, msvcp140.dll, vcruntime140.dll dan zlib1.dll,

jika kita ingin mendistribusi aplikasi yang mengakses database firebird 4 maka file-file inilah yang harus disertakan.

Setelah semua file diextract pada folder yang telah disiapkan, tahap selanjutnya yaitu membuat user dan password SYSDBA, untuk itu kita perlu masuk command prompt dan “Run as Administrator“, perlu diketahui bahwa sejak Firebird 3.0 tidak lagi didistribusikan dengan menggunakan password standar “masterkey“, dan bahkan distribusikan tanpa user apapun. Kita harus membuat user SYSDBA sebelum server dapat dijalakan, untuk password bebas tidak harus masterkey, password boleh panjang tidak lagi diakui 8 karakter seperti Firebird 2.5.

Pertama kita masuk utility ISQL dengan mengetikkan perintah isql -u sysdba employee (employee adalah database demo dari firebird, karena untuk membuat user diharuskan konek ke database lokal secara embeded).

Selanjutnya kita buat user SYSDBA dengan cara create user SYSDBA password ‘masterkey’;

Seperti yang saya sampaikan sebelumnya password tidak harus masterkey tapi bebas, malah disarankan membuat password yang mudah diingat tapi susah ditebak orang lain.

Setelah membuat user SYSDBA tahapan selanjutnya adalah modifikasi konfigurasi (firebird.conf) agar tidak bentrok dengan Firebird lain jika ada, untuk ini kita gunakan notepad, namun perlu diingat harus jalan dibawah kendali “Run as Administrator“.

Beberapa entry yang harus kita tambahkan (letakkan pada bagian bawah sendiri), ada beberapa setting namun minimal ada 2 yang paling penting (tanda panah pada gambar).

Pertama .. RemoteServicePort = 3065, ini untuk menentukan port mana yang mau digunakan Firebird server nantinya, seperti kita ketahui bahwa default port untuk Interbase/Firebird adalah 3050, maka dari itu kita bikin beda agar tidak bentrok, port ini bebas selama tidak dipakai oleh yang lain, contoh punya saya 3064 untuk Firebird 3.0, 3065 untuk Firebird 4.0 dan 3066 untuk Firebird 5.0.

Kedua .. IPCName, ini harus unik, defaultnya Firebird saja.

Ketiga .. yang mungkin perlu adalah DataTypeCompatibility = 3.0, perlu diketahui bahwa Firebird 4.0 sudah mendukung operasi numeric diatas 18 digit, jika kita melakukan operasi perkalian 2 buah numeric(18) maka akan terjadi error jika aplikasi client kita tidak mendukung, dengan setting diatas maka masalah tersebut tersolusikan.

Setelah pengaturan konfigurasi tahapan selanjutnya adalah install Firebird Service.

fb40 adalah nama service, bebas tapi harus unik.

Setelah install Firebird service sukses dan tidak ada error, berarti tahapan instalasi Firebird 4.0 secara manual telah selesai.

Demikian semoga sedikit ilmu pengalaman ini bermanfaat bagi kita semua.

Aamiin.

Link …

Memperkecil ukuran EXE pada Delphi

Bismillahirrohmanirrohim.
Assalamu’alaikum wr wb.
Delphi versi lebih baru hadir dengan beberapa kemudahan dan kelebihan diantara beberapa komponen yang sebelumnya harus menambahkan secara manual yang mana hal tersebut terkadang tidak mudah bagi pemula, saat ini hanya dengan menginstall Delphi 10.3 Rio Community Edition kita sudah dapat membuat aplikasi yang bagus tanpa repot-repot menambahkan komponen pihak ketiga.
Namun dibalik kemudahan dan kelebihannya disisi lain ada yang membuat sedikit kurang yaitu ukuran EXEnya yang lumayan gendut, beberapa teman di media sosial yang sebelumnya menggunakan Delphi 7 keluhannya “bisa gak sih ukuran EXEnya diperkecil” saat mencoba menggunakan Delphi versi yang lebih baru.
Pada artikel kali ini saya akan mencoba menjawab keluhan teman-teman (termasuk saya juga dulu).
Kalo diperkecil segede EXEnya Delphi 7 sepertinya sulit, tapi kalo sedikit dirampingkan bisa dengan langkah-langkah dibawah ini.
Ada beberapa langkah untuk membuat ukuran EXE menjadi lebih kecil diantaranya :
1. Merubah konfigurasi menjadi Release (Defaultnya Debug).
2. Membuang Informasi RTTI.
3. Mengkompress EXE yang sudah jadi menggunakan software UPX.
Perbandingan ukuran EXE sebelum dan sesudah melewati proses diatas seperti gambar berikut.

Perbandingan ukuran EXE

Langsung saja kita mulai, langkah pertama yaitu merubah konfigurasi menjadi Release.

Klik 2x pada “Release” untuk merubah

Selanjutnya membuang informasi RTTI, yaitu dengan menambahkan kode berikut pada Project Source.

Pilih menu Project-View Source

Yang terakhir mengkompres EXE yang sudah jadi dengan menggunakan UPX.
Sebelumnya download dulu software upxnya jika belum punya pada link berikut https://github.com/upx/upx/releases/download/v3.95/upx-3.95-win32.zip
Yang dibutuhkan hanya upx.exe, copykan upx.exe ke lokasi yang terjangkau path misalnya c:\windows.
Cara menggunakannya cukup mudah seperti gambar berikut.

parameter -9 untuk kompresi maksimum

Kalo diinginkan upx jalan secara otomatis setiap selesai compile bisa juga yaitu dengan mengaturnya pada Build Event.

Project Option – Build events

Langkah-langkah diatas boleh dilakukan salah satu atau semuanya, namun yang perlu diperhatikan bahwa langkah tersebut diatas hanya berlaku untuk platform windows (VCL & Firemonkey).
Demikian sedikit ilmu yang bisa saya bagi pada kesempatan kali ini, semoga bermanfaat.
Wassalamu’alaikum Wr Wb.

Menyiapkan RAD Studio 10.3 Rio untuk develop aplikasi android

Bismillahirrohmanirrohim,
Assalamu’alaikum Wr Wb.

Pada kesempatan kali ini saya akan berbagi tentang langkah-langkah mudah yang diperlukan untuk develop atau membangun aplikasi android menggunakan RAD Studio 10.3 Rio Comunity Edition.

Langkap pertama yang diperlukan dan wajib tentunya harus sudah terinstall RAD Studio 10.3 Rio Comunity Edition, silahkan download pada link berikut jika belum punya.

https://www.embarcadero.com/products/delphi/starter/free-download

Untuk cara download, regitrasi dan instalasi tidak saya bahas disini.
Pada postingan kali ini saya hanya membahas langkah-langkah yang diperlukan sehinggan kita dapat membangun aplikasi android menggunakan RAD Studio 10.3 Rio Comunity Edition.

Untuk menyingkat waktu langsung saja, berikut ini langkah-langkahnya dalam bentuk visual/gambar.

Dari menu “Tools” pilih “Manage Platform”
Pastikan centang “Delphi Android Community”
Centang pada “Java Development .. ” dan “Android SDK …”
Jalankan “SDK Manager”
Download dengan menandai (centang), minimal seperti gambar diatas, yang lain gak usah

Demikian langkah singkat untuk menyiapkan RAD Studio 10.3 Rio agar mendukung develop aplikasi android.

Tutorial modifikasi komponen VCL pada Delphi 10.3 Rio

Assalamu’alaikum Wr Wb.
Bismillahirrohmanirrohim.
Dalam membangun sebuah aplikasi terkadang kita menginginkan sebuah komponen mempunyai fungsi lebih dari yang ada, mungkin kita bisa menggabungkan beberapa komponen atau memainkan koding tertentu agar dapat memenuhi yang kita butuhkan, namun apabila dalam project tersebut terdapat banyak sekali komponen yang dimaksud hal tersebut cukup menyulitkan juga.
Pada kesempatan kali ini saya akan berbagi tutorial cara sederhana untuk menambahkan kemampuan lebih sesuai yang kita butuhkan pada sebuah komponen vcl.
Langsung saja, caranya dapat dilihat pada video berikut.

Contoh source code dapat di download pada Link berikut

Menambahkan tulisan pada progressbar

Bismillahirohmanirrohim,
Assalamu’alaikum Wr Wb.

Terinspirasi dari sebuah pertanyaan pada grup facebook tentang bagaimana cara membuat atau menambahkan tulisan pada progressbar, maka pada kesempatan kali ini saya ingin berbagi ilmu cara menambahkan property Text pada TProgressBar bawaan Delphi sehingga dapat menampilkan progress seperti gambar diatas.

Memang banyak komponen pihak ketiga yang sudah mendukung untuk ini, namun kali ini kita akan melakukannya dengan menggunkan komponen bawaan delphi.

Saya rasa untuk pengantar tidak perlu panjang lebar, kita langsung saja ke source codenya.
Bagi yang males menulis kodenya bisa langsung download contoh aplikasinya pada link dibawah.

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls;

type
  TProgressBar = class(ComCtrls.TProgressBar)
  private
    FText: string;
  protected
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  published
    property Text:string read FText write FText;
  end;
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
     with ProgressBar1 do
     begin
          Font.Color:=clWhite;
          Font.Style:=[fsBold];
          Text:='Posisi 0%';
          Color:=clNavy;
     end;
end;

{ TProgressBar }

procedure TProgressBar.WMPaint(var Message: TWMPaint);
var
   dc: HDC;
   OldBK: Integer;
   OldFont: HGDIOBJ;
   OldColor: Cardinal;
   rc: TRect;
begin
     rc:=ClientRect; // ambil posisi canvas

     rc.Left:=rc.Left+1;
     rc.Top:=rc.Top+1;
     rc.Right:=rc.Right-1;
     rc.Bottom:=rc.Bottom-1;

     dc:=GetWindowDC(Handle); // ambil handle canvas
     FillRect(dc,rc,Brush.Handle); // kosongkan area canvas

     Inherited; // Tampilkan progress asli

     if FText<>'' then // Jika property Text tidak kosong
     begin
          OldBK:=SetBkMode(dc,TRANSPARENT); // simpan mode background
          OldFont:=SelectObject(dc,Font.Handle); // simpan font
          OldColor:=SetTextColor(dc,Font.Color); // simpan warna
          DrawText(dc,PAnsiChar(FText),Length(FText),rc,DT_SINGLELINE or DT_CENTER or DT_VCENTER); // tulis teks
          SetTextColor(dc,OldColor); // kembalikan warna
          SelectObject(dc,OldFont);  // kembalikan font
          SetBkMode(dc,OldBK); // kembalikan mode background
          ReleaseDC(Handle,dc); // kembalikan handle canvas
     end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     with ProgressBar1 do
     begin
          Position:=Position+1;
          if Position>=Max then
             Position:=0;
          Text:=Format('Posisi %d%%',[Position]);
     end;
     Application.ProcessMessages;
end;

end.

 

Contoh aplikasi bisa di download di https://app.box.com/s/2esuhbgyraf777fqv7ueyz5nbfnukzv8

 

Semoga tulisan ini bermanfaat bagi saya sendiri dan teman-teman yang membutuhkan.
Aamiin.

Wassalamu’alaikum Wr Wb

Agar komponen TEdit hanya bisa diisi angka dengan acuan nama komponen

Assalamu’alaikum Wa Rohmatullohi Wa Barokatuh.
Taqobalallahu Minna Waminkum Siyamanna Wasiyamakum Taqobal Yaa Kariim.
Minal Aidin wal Faizin, Mohon maaf Lahir dan Bathin.
Selamat Hari Raya Idul Fitri 1436H.

Pada kesempatan kali ini saya ingin berbagi sedikit tips sederhana, yaitu bagaimana kita memperlakukan sebagian atau semua komponen TEdit agar hanya bisa diisi dengan angka dengan acuan nama komponennya, secara otomatis tanpa memberikan pengaturan atau koding satu persatu (yang dilakukan hanya cara penamaan komponen saja).

Untuk membedakan mana komponen TEdit yang hanya bisa diisi dengan angka dan mana yang bisa diisi secara normal, kita buat sebuah aturan yaitu semua komponen TEdit yang namanya dimulai dengan huruf “en” (huruf kecil), maka dia hanya bisa diisi dengan angka, sementara untuk nama yang lain dia akan berfungsi secara normal.

Langsung saja, caranya cukup sederhana yaitu dengan meng-override procedure KeyPress milik TEdit …

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  // Tambahkan ini
  TEdit = class(StdCtrls.TEdit)
    procedure KeyPress(var Key: Char); override;
  end;
  // Sampai sini
  TForm1 = class(TForm)
    enEdit1: TEdit;
    Edit2: TEdit;
    enEdit3: TEdit;
    Edit4: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ TEdit }

procedure TEdit.KeyPress(var Key: Char);
begin
     inherited;
     if (Pos('en',Name)=1) and  // Jika nama diawali dengan "en"
        (Pos(Key,'0123456789-'#8#13+DecimalSeparator)=0) then
        Key:=#0; // hanya menerima angka dan pemisah desimal
end;


end.

Semoga bermanfaat.
Contoh source code dapat didownload di https://app.box.com/s/enc1s0d4jntrozig5dike4uz31g245qy

Cara berbagi koneksi Internet melalui jaringan WIFI pada Windows 7


Saat ini hampir semua Laptop maupun ponsel, bahkan yang harganya murahpun sudah banyak yang dilengkapi dengan koneksi Wifi.
Berbagi koneksi internet melalui Wifi tentunya bisa menjadi solusi untuk penggunakan koneksi internet di rumah
bersama-sama satu keluarga hanya dengan berlangganan satu paket internet.
Untuk keperluan ini kita memanfaat “Microsoft Virtual Wifi Miniport” yang ada di Windows 7 keatas.

Caranya cukup sederhana, hanya beberapa langkah :
1. membuat virtual Access point dengan tool netsh, dengan perintah sbb : netsh wlan set hostednetwork mode=allow ssid=”nama access point” key=”kata kunci”

2. memsharing koneksi modem ke adapter “Microsoft Virtual Wifi Miniport”

3. mengaktifkan dengan perintah : netsh wlan start hostednetwork

Dikemudian hari jika ingin berbagi koneksi internet via jaringan wifi hanya perlu melakukan langkah ke-3, sedangkan langkah 1-2 hanya dilakukan sekali saja.

Untuk lebih jelasnya bisa dilihat pada video berikut ini …
https://app.box.com/s/ik6lq1cicfndv8f56rikztc836ekob09

Semoga bermanfaat.

Membuat Realtime Search menggunakan Delphi & Firebird


Assalamu’alaikum Wr Wb,
Beberapa waktu yang lalu saya pernah berbagi Aplikasi RealTime Search menggunakan database Interbase di media sosial Facebook https://www.facebook.com/notes/komunitas-programmer-delphi-dan-interbase-indonesia/contoh-aplikasi-realtime-search-menggunakan-interbase/480900875287982.
Kali ini saya ingin berbagi aplikasi yang sama dengan menggunakan database Firebird dengan beberapa perbaikan yaitu dengan menambahkan beberapa komentar di source code sehingga lebih mudah di pelajari.
Apa fungsi aplikasi ini, tentunya sudah banyak yang tahu yaitu sebuah aplikasi yang secara otomatis akan melakukan pencarian setelah kita mengetikkan beberapa huruf tanpa menunggu kita menekan enter atau klik button.
Aplikasi ini saya buat menggunakan Turbo Delphi (Delphi 2006) dan insya Alloh tidak masalah dibuka menggunakan Delphi versi lain.
Komponen yang digunakan pada aplikasi ini adalah IBX (Interbase) bawaan delphi dan Alpha Skin.
Untuk databasenya menggunakan Firebird 2.54 yang bisa didownload gratis di situs resminya ( http://www.firebirdsql.org/en/firebird-2-5-4/ ) bila belum punya.
Untuk yang belum punya Firebird dan belum ingin menginstall Firebird bisa mencoba Firebird versi Embeded (tanpa install).
Oke dah, langsung saja sedot aplikasinya di https://app.box.com/s/5oi1saxu1ob7qo7a4nwmfbddsxh37470
Untuk versi FB Embeded silahkan download https://app.box.com/s/l58u0a18hp2gy8rxy44xn50djzlf5tfp dan copykan menjadi satu folder dengan aplikasinya.
Demikian semoga bermanfaat.
Bila ada kesulitan bisa ditulis dikolom komentar atau diposting ke grup Komunitas programmer Delphi dan Interbase Indonesia

Cara menginisialisasi manajemen user perdatabase pada Firebird 3.0

Bismillahirrohmanirrohim.
Assalamu’alaikum Wr Wb.

Lama tidak berbagi, kali ini saya ingin berbagi sedikit yang saya ketahui yaitu cara menginisialisasi manajemen user perdatabase pada Firebird 3.0.

Pada Interbase kita mengenal istilah EUA (Embedded User Authentication) dimana manajemen user (daftar user yang berhak mengakses database) dapat diatur menyatu didalam database, tidak lagi nempel pada server. Sehingga masing-masing database mempunyai user sendiri-sendiri.

Pada Firebird sebelum 3.0, manajemen user disimpan dalam server (pada file security2.fdb), ini agak merepotkan jika ada banyak aplikasi yang mengakses database yang berbeda, mungkin itulah sebabnya umumnya aplikasi yang kita jumpai sangat jarang yang menggunakan hak akses bawaan, sebagai gantinya mereka membuat sendiri table user untuk mengatur hak akses.

Pada Firebird 3.0 selain menggunakan manajemen user default yaitu menempel pada server kita diberikan alternatif untuk menyimpan manajemen user pada database file ataupun database itu sendiri (mirip dengan EUA pada Interbase).

Kalau dibandingkan dengan EUA pada Interbase, manajemen user perdatabase ini masih mempunyai kelemahan pada sisi kelemahan yaitu karena harus didaftarkan dulu di file databases.conf.

Pada EUA seseorang yang menemukan (terlalu kasar kalo disebut mencuri), praktis tidak dapat membuka database kalo tidak tahu passwordnya, sedangkan pada security perdatabase ala firebird ini database tetap bisa dibuka kalo tidak didaftarkan (unreg) pada database.conf.

Ibarat “tiada akar arangpun jadi”, dengan kelemahan diatas bukan berarti kita tidak dapat mengamankan database kita jika menggunakan Firebird.

Database akan aman selama orang yang tidak berwenang tidak dapat menjangkau secara fisik, bagaimana caranya?
Letakkan database pada partisi NTFS dan berikan hak baca/tulis selain system, lindungi server dengan firewall dan matikan filesharing terutama pada folder tempat database tersebut berada.

Banyak sekali keutungan jika kita menggunakan manajemen user bawaan database dibanding dengan membuat table user akal-akalan, diantaranya :
– Setiap user akan hanya dapat melakukan aktifitas ke database sesuai hak yang diberikan baik melalui aplikasi yang kita buat maupun menggunakan tool lain.

Dengan menggunakan table user akal-akalan ada 2 kemungkinan bila seorang user akan mengakses database tidak melalui aplikasi yaitu tidak bisa masuk sama sekali atau bisa masuk dengan bebas keseluruh area didalam database walaupun dia tidak mempunyai wewenang dalam aplikasi.

Namun semua kembali kepada anda, apa yang kita pakai tergantung selera masing-masing, apa yang menurut saya baik belum tentu menurut orang lain baik, apa yang menurut saya mudah belum tentu menurut orang lain mudah, begitu juga sebaliknya.

Okelah segini aja prakatanya, lebih jelasnya silahkan lihat pada gambar dibawah ini.
Semoga bermanfaat.

Yang butuh Firebird 3.0 dapat di download di …
http://www.firebirdsql.org/en/firebird-3-0-0-beta1/ (Installer)
http://web.firebirdsql.org/download/snapshot_builds/win/3.0/ (Snapshot Build)

Komunikasi Delphi-Excel menggunakan VBA


Bismillahirrohmanirrohim,
Assalamu’alaikum Wr Wb.
Sekitar 2 tahun (2012) yang lalu saya pernah menulis artikel “Export DBGrid ke Microsoft Excel” di grup facebook
(https://www.facebook.com/notes/komunitas-programmer-delphi-dan-interbase-indonesia/export-dbgrid-ke-microsoft-excel/390918654286205).
Alhamdulillah ternyata banyak yang tertarik dengan artikel tersebut,
unit tersebut telah didownload 457 kali pada saat postingan ini ditulis.

Kali ini saya tidak membahas tentang mengexport DBGrid/database ke Microsoft Excel namun hanya melakukan perbaikan/update pada unit yang ada dengan ditambahkan dokumentasi singkat dan contoh program.
Unit yang saya upload ada 2 versi yaitu untuk Delphi 7 dan Delphi 2006 (karena saya cuman punya 2 versi delphi itu .. hehehe)

Update Desember 2018 – Tambahan dukungan untuk Delphi 10.1-Berlin, Delphi 10.2-Tokyo 32/64bit dan Delphi 10.3-Rio 32/64bit.

Untuk menggunakan unit ini cukup mudah, copy unit yang sesuai dengan versi delphi yang anda pakai, taruh di folder lib atau jadikan satu dengan aplikasi.
Selanjutnya tambahkan VsrExcelOle pada klausa uses.

Berikut ini contoh potongan kodenya …

uses ..... VsrExcelOle;

var
  Form1: TForm1;
  ex: VsrExcel;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
     if not Assigned(ex) then
     begin
          ex:=VsrExcel.Create; // komunikasi dengan excel
          ex.Show; // tampilkan excel
     end;
     ex.New; // buat workbook baru
     ex.AutoSelect:=True; // supaya otomatis aktifkan cell setelah menulis
     ex.Write('A1',Edit1.Text); // tulis Edit1 pada Cell A1
     if CheckBox1.Checked then
        ex.Font.Bold:=True; // Tebalkan jika dicentang
     ex.Write('A2',Edit2.Text); // tulis Edit1 pada Cell A2
     if CheckBox2.Checked then
        ex.Font.Bold:=True; // Tebalkan jika dicentang
end;

Pada object VsrExcel ada property App yang dapat kita gunakan untuk memasukkan perintah VBA lainnya yang belum tersedia di unit ini.

Unit beserta dokumentasi dan contoh programnya dapat
didownload di https://app.box.com/s/f9c4ebde3a0ce86a1895
Bila ingin memperdalam VBA Excel silahkan baca di helpnya Excel, kalo gak punya bisa juga
didownload di https://app.box.com/s/1i5ivb6k04jgz0822ez1

Semoga bermanfaat