Anda di halaman 1dari 82

TABELKU

Tiga program aplikasi terdahulu tidak melibatkan file tabel (DBF),


sedangkan program aplikasi TabelKu ini melibatkan 1 (satu) tabel
(DBF). Di mana Anda dapat mengisi data, mengubah data, meng-
hapus data, serta menelusuri tabel dari satu record ke record lainnya.
Pembahasan dalam program aplikasi TabelKu ini difokuskan pada
pembuatan file kode (CODE), yaitu file yang berekstensi PRG.
Program TabelKu berhubungan dengan 1 tabel, yaitu TabelKu.DBF.
Kita masih memanfaatkan form utama Visual FoxPro dan beberapa
objek Label, TextBox, Grid, dan CommandButton untuk menangani
tabel TabelKu.DBF.
Struktur tabel tabelKu.DBF adalah sebagai berikut.

77
No Field Type Width Keterangan
1 Nama C 30 Nama
2 JenKel C 9 Jenis Kelamin
3 Alamat C 30 Alamat
4 Kota C 30 Nama Kota
5 KodePos C 5 Kode Pos

Apabila program aplikasi TabelKu dijalankan dan file TabelKu.dbf


belum ada, maka otomatis akan dibuat file baru TabelKu.dbf.
Dengan demikian, pemakai tidak direpotkan untuk membuat tabel
tersebut di atas.

6.1 Desain Program


Bentuk tampilan dari program TabelKu terlihat seperti pada gambar
di bawah ini, yaitu sebagai sarana interaktif antara pemakai dengan
database (tabel). Semua tabel ditampilkan dalam Grid sebagai
jendela untuk menelusuri tabel, kemudian masing-masing record
ditampilkan dalam TextBox. Fasilitas yang tersedia, antara lain pe-
nambahan data baru, ubah data, hapus data, dan pengurutan data.

78
Gambar 6.1 Desain program aplikasi TabelKu

6.2 Logika Program


Dasar utama pembuatan program TabelKu ini adalah jendela Grid
sebagai sarana interaktif antara pemakai dengan tabel TabelKu.DBF.
Untuk itu, pada saat program dijalankan, maka langsung akan
terhubung dengan tabel TabelKu.DBF. Kemudian semua data ditam-
pilkan dalam objek Grid, sedangkan masing-masing record ditam-
pilkan dalam objek TextBox.
Di baris bawah terdapat 10 objek CommandButton yang berfungsi
sebagai navigator, yang digunakan untuk penelusuran record,
tambah data (ADD), ubah data (EDIT), hapus data (DEL), dan
pengurutan data (SORT).

79
Pengurutan data dilakukan dengan teknik external sorting BUBBLE
SORT.
Algoritma program aplikasi TabelKu adalah sebagai berikut:
• Mengatur variabel _SCREEN untuk diisi dengan 13 objek Label,
6 objek TextBox, 1 objek OptionGroup, 1 objek Grid, dan 10
objek CommandButton.
• Koneksi dengan tabel TabelKu.DBF pada saat dijalankan per-
tama kali.
• Menampilkan semua data di dalam objek Grid.
• Menampilkan satu data (record) di dalam objek TextBox.
• Navigasi (pergerakan) dari satu record ke record lainnya
dikontrol dalam objek CommandButton. Demikian juga fasilitas
tambah data (ADD), ubah data (EDIT), hapus data (DEL), dan
pengurutan data (SORT) dikontrol dalam objek CommandButton
ditambah dengan ABOUT dan CLOSE.
Program aplikasi TabelKu menampilkan isi tabel TabelKu.dbf. Data
yang terdapat di dalamnya, antara lain Nama, Jenis Kelamin,
Alamat, Kota, dan Kode Pos. Di baris atas ditampilkan nama hari dan
pasaran posisi tanggal saat ini dan ditampilkan juga jam digital.
Kemudian ditampilkan masing-masing data (record) serta semua
data dalam grid. Di baris bawah ditampilkan navigasi (pergerakan)
record, button untuk tambah data (ADD), ubah data (EDIT), hapus
data (DELETE), dan pengurutan data (SORT), serta button About
yang akan menampilkan keterangan kecil tentang program ini, dan
button Close yang akan menampilkan pilihan untuk mengakhiri
program. Jika dipilih YES, maka program akan berhenti dan kembali
ke Windows.
Secara sederhana, program aplikasi TabelKu dapat digambarkan
sebagai berikut.

80
Start

Persiapan Mengatur form _SCREEN

Menampilkan semua data dalam


Menampilkan objek Grid dan menampilkan satu
Data data dalam objek TextBox

Navigasi ADD EDIT DELETE SORT ABOUT CLOSE


Record

Stop

Gambar 6.2 Flowchart program aplikasi TabelKu

6.3 Kode Program


Berikut ini listing kode program TabelKu.

******************************************************
* Nama Program : TabelKu.prg *
* Keterangan : menggunakan program aplikasi (CODE) *
* menangani 1(satu) tabel TabelKu.dbf *
* menggunakan perintah reguler tabel *
* (USE,APPEND,REPLACE,DELETE,PACK) *
* - single user version (exclusive) - *
******************************************************
*--- Set Environtment ---*
SET TALK OFF
SET STATUS OFF

81
SET STATUS BAR OFF
SET SYSMENU OFF
SET ESCAPE ON
SET CENTURY ON
SET EXCLUSIVE ON
SET DATE ITALIAN
*--- bersihkan memori ---*
CLEAR ALL
CLOSE ALL
CLOSE TABLES ALL
*--- persiapan variabel public ---*
PUBLIC oFormSort As Form
PUBLIC nMaxRec
* jumlah record maksimum (disesuaikan kebutuhan)
nMaxRec = 1000
*--- persiapan tampilan form _SCREEN ---*
WITH _Screen && form _SCREEN (milik Visual FoxPro)
.Top = 0 && posisi atas
.Left = 0 && posisi kiri
.Width = 540 && lebar form
.Height = 485 && tinggi form
.AutoCenter = .T. && form di tengah layar monitor
.ControlBox = .F. && button controlbox dinon-aktifkan
.Closable = .F. && button close dinon-aktifkan
.MaxButton = .F. && button max dinon-aktifkan
.MinButton = .F. && button min dinon-aktifkan
.ShowTips = .T. && tampilkan semua tooltip text
.BorderStyle = 2 && border diset fix dialog
.Caption = "TabelKu - menggunakan perintah native "+;
"(USE,APPEND,REPLACE,PACK)" && judul form
.BackColor = RGB(128,128,255) && warna latar form
****************************************************
* cara mengisi form _Screen, yaitu: *
* 1. menambahkan objek (nama objek,nama definisi), *
* kemudian *
* 2. mendefinisikan objek bersama atributnya *
* (DEFINE CLASS) *
****************************************************
* tambahkan objek Label
.AddObject("Judul1","myJudul1") && label Judul 1
.AddObject("Judul2","myJudul2") && label Judul 2
.AddObject("Waktu", "myWaktu") && timer Waktu Digital
.AddObject("Tanggal","myTanggal") && label Tanggal
.AddObject("Jam", "myJam") && label Jam Digital
.AddObject("Versi", "myVersion") && label Version
.AddObject("Kode", "myKode") && label Kode
.AddObject("Nama", "myNama") && label Nama
.AddObject("JenKel","myJenKel") && label Jenis Kelamin
.AddObject("Alamat","myAlamat") && label Alamat
.AddObject("Kota", "myKota") && label Kota
.AddObject("KodePos","myKodePos") && label Kode Pos
* tambahkan objek Label titik-dua
.AddObject("Titik01","myTitik01") && label Titik Dua
.AddObject("Titik02","myTitik02") && label Titik Dua
.AddObject("Titik03","myTitik03") && label Titik Dua
.AddObject("Titik04","myTitik04") && label Titik Dua
.AddObject("Titik05","myTitik05") && label Titik Dua
.AddObject("Titik06","myTitik06") && label Titik Dua
* tambahkan objek No.Record - label dan text box
.AddObject("NoRecord", "myNoRecord") && label No.Record
.AddObject("txtNoRec", "myNoRec") && No.Record

82
.AddObject("txtTotRec","myTotRec") && Total Record
* tambahkan objek TextBox
.AddObject("txtKode", "myTxtKode") && Kode
.AddObject("txtNama", "myTxtNama") && Nama
.AddObject("optJenKel", "myOptJenKel") && Jenis Kelamin
.AddObject("txtAlamat", "myTxtAlamat") && Alamat
.AddObject("txtKota", "myTxtKota") && Kota
.AddObject("txtKodePos","myTxtKodePos") && Kode Pos
* tambahkan objek Grid
.AddObject("myGrid","myGrdGrid") && grid myGrid
* tambahkan objek Command Button
.AddObject("cmdFirst", "myFirst") && button First
.AddObject("cmdPrev", "myPrev") && button Previous
.AddObject("cmdNext", "myNext") && button Next
.AddObject("cmdLast", "myLast") && button Last
.AddObject("cmdAdd", "myAdd") && button Add
.AddObject("cmdEdit", "myEdit") && button Edit
.AddObject("cmdDelete","myDelete") && button Delete
.AddObject("cmdSort", "mySort") && button Sort
.AddObject("cmdAbout", "myAbout") && button About
.AddObject("cmdClose", "myClose") && button Close
* tampilkan form _SCREEN
.Show
ENDWITH
Start() && aktifkan prosedur Start()
SetField(.F.) && aktifkan prosedur SetField()
SetButton(.T.) && aktifkan prosedur SetButton()
GridRefresh() && aktifkan prosedur GridRefresh()
TampilkanData(.T.) && aktifkan prosedur TampilkanData()
READ EVENTS && proses semua event
RETURN && selesai
*****************************************
* definisi objek timer, label, textbox, *
* optiongroup dan command button *
*****************************************
*--- definisi timer myWaktu ---*
DEFINE CLASS myWaktu AS Timer
Top = 0 && posisi atas
Left = 0 && posisi kiri
Interval = 1000 && interval 1 detik
PROCEDURE Timer
* label Jam diisi jam 00:00:00
_Screen.Jam.Caption = TIME()
ENDPROC
ENDDEFINE
*--- definisi label myTanggal ---*
DEFINE CLASS myTanggal AS Label
Top = 10 && posisi atas
Left = 190 && posisi kiri
Width = 268 && lebar label
Height = 20 && tinggi label
Caption = "" && isi label
Alignment = 1 && rata kanan
FontName = "Arial" && jenis huruf
FontSize = 10 && besar huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myJam ---*
DEFINE CLASS myJam AS Label
Top = 10 && posisi atas

83
Left = 465 && posisi kiri
Width = 50 && lebar textbox
Height = 20 && tinggi label
Caption = TIME() && label diisi jam 00:00:00
Alignment = 1 && rata kanan
FontName = "Arial" && jenis huruf
FontSize = 10 && besar huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myVersion ---*
DEFINE CLASS myVersion AS Label
Top = 35 && posisi atas
Left = 190 && posisi kiri
Width = 155 && lebar label
Height = 20 && tinggi label
Caption = "SINGLE USER VERSION" && isi label
Alignment = 2 && di tengah
FontName = "Arial" && jenis huruf
FontSize = 10 && besar huruf
FontBold = .T. && huruf tebal
ForeColor = RGB(0,0,255) && warna huruf biru
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myNoRecord ---*
DEFINE CLASS myNoRecord AS Label
Top = 35 && posisi atas
Left = 350 && posisi kiri
Width = 50 && lebar label
Height = 20 && tinggi label
Caption = "No.Rec.:" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && besar huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && label tampil
ENDDEFINE
*--- definisi textbox myNoRec ---*
DEFINE CLASS myNoRec AS TextBox
Top = 35 && posisi atas
Left = 410 && posisi kiri
Width = 50 && lebar textbox
Height = 24 && tinggi textbox
Value = 0 && isi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && besar huruf
BackColor = _Screen.BackColor && warna dasar
DisabledForeColor = RGB(255,0,0) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
InputMask = "99999" && bentuk masukan
Format = "99999" && bentuk tampilan
Enabled = .F. && textbox tidak aktif
Visible = .T. && textbox tampil
ENDDEFINE
*--- definisi textbox myTotRec ---*
DEFINE CLASS myTotRec AS TextBox
Top = 35 && posisi atas
Left = 465 && posisi kiri
Width = 50 && lebar textbox
Height = 24 && tinggi textbox
Value = 0 && isi textbox

84
FontName = "Arial" && jenis huruf
FontSize = 9 && besar huruf
BackColor = _Screen.BackColor && warna dasar
DisabledForeColor = RGB(255,0,0) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
InputMask = "99999" && bentuk masukan
Format = "99999" && bentuk tampilan
Enabled = .F. && textbox tidak aktif
Visible = .T. && textbox tampil
ENDDEFINE
*--- 2 judul memberi efek bayangan ---*
*--- definisi label myJudul1 ---*
DEFINE CLASS myJudul1 AS Label && sebagai bayangan judul
Top = 12 && posisi atas
Left = 11 && posisi kiri
Width = 180 && lebar label
Height = 22 && tinggi label
Caption = "NAMA DAN ALAMAT" && isi label
FontName = "Arial" && jenis huruf
FontBold = .T. && huruf tebal
FontSize = 12 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf hitam
BackStyle = 0 && transparan
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myJudul2 ---*
DEFINE CLASS myJudul2 AS Label && sebagai judul (merah)
Top = 10 && posisi atas
Left = 10 && posisi kiri
Width = 180 && lebar label
Height = 22 && tinggi label
Caption = "NAMA DAN ALAMAT" && isi label
FontName = "Arial" && jenis huruf
FontBold = .T. && huruf tebal
FontSize = 12 && ukuran huruf
ForeColor = RGB(255,0,0) && warna huruf merah
BackStyle = 0 && transparan
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myKode ---*
DEFINE CLASS myKode AS Label
Top = 35 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 1. Kode" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myNama ---*
DEFINE CLASS myNama AS Label
Top = 60 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 2. Nama" && isi label

85
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myJenKel ---*
DEFINE CLASS myJenKel AS Label
Top = 85 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 3. Jenis Kelamin" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myAlamat ---*
DEFINE CLASS myAlamat AS Label
Top = 110 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 4. Alamat" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myKota ---*
DEFINE CLASS myKota AS Label
Top = 135 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 5. Kota" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label myKodePos ---*
DEFINE CLASS myKodePos AS Label
Top = 160 && posisi atas
Left = 10 && posisi kiri
Width = 100 && lebar label
Height = 20 && tinggi label
Caption = " 6. Kode Pos" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label Titik01 ---*
DEFINE CLASS myTitik01 AS Label
Top = 35 && posisi atas

86
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label Titik02 ---*
DEFINE CLASS myTitik02 AS Label
Top = 60 && posisi atas
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label Titik03 ---*
DEFINE CLASS myTitik03 AS Label
Top = 85 && posisi atas
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label Titik04 ---*
DEFINE CLASS myTitik04 AS Label
Top = 110 && posisi atas
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi label Titik05 ---*
DEFINE CLASS myTitik05 AS Label
Top = 135 && posisi atas
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor

87
ENDDEFINE
*--- definisi label Titik05 ---*
DEFINE CLASS myTitik06 AS Label
Top = 160 && posisi atas
Left = 120 && posisi kiri
Width = 10 && lebar label
Height = 20 && tinggi label
Caption = ":" && isi label
FontName = "Arial" && jenis huruf
FontSize = 10 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
BackColor = _Screen.BackColor && warna dasar
Visible = .T. && tampil dilayar monitor
ENDDEFINE
*--- definisi textbox myTxtKode ---*
DEFINE CLASS myTxtKode AS TextBox
Top = 35 && posisi atas
Left = 135 && posisi kiri
Width = 50 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
MaxLength = 5 && panjang maksimum isian textbox
Value = "" && nilai textbox dokosongkan
Visible = .T. && tampil di layar monitor
ENDDEFINE
*--- definisi textbox myTxtNama ---*
DEFINE CLASS myTxtNama AS TextBox
Top = 60 && posisi atas
Left = 135 && posisi kiri
Width = 380 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
MaxLength = 50 && panjang maksimum isian textbox
Value = "" && nilai textbox dokosongkan
Visible = .T. && tampil di layar monitor
ENDDEFINE
*--- definisi optiongroup myOptJenKel ---*
DEFINE CLASS myOptJenKel AS OptionGroup
Top = 85 && posisi atas
Left = 135 && posisi kiri
Width = 200 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
ButtonCount = 2 && 2 pilihan Laki-laki atau Perempuan
Enabled = .T. && optiongroup di-aktifkan
Visible = .T. && tampil di layar monitor

88
ENDDEFINE
*--- definisi textbox myTxtAlamat ---*
DEFINE CLASS myTxtAlamat AS TextBox
Top = 110 && posisi atas
Left = 135 && posisi kiri
Width = 380 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
MaxLength = 50 && panjang maksimum isian textbox
Value = "" && nilai textbox dokosongkan
Visible = .T. && tampil di layar monitor
ENDDEFINE
*--- definisi textbox myTxtKota ---*
DEFINE CLASS myTxtKota AS TextBox
Top = 135 && posisi atas
Left = 135 && posisi kiri
Width = 380 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
MaxLength = 50 && panjang maksimum isian textbox
Value = "" && nilai textbox dokosongkan
Visible = .T. && tampil di layar monitor
ENDDEFINE
*--- definisi textbox myTxtKodePos ---*
DEFINE CLASS myTxtKodePos AS TextBox
Top = 160 && posisi atas
Left = 135 && posisi kiri
Width = 60 && lebar textbox
Height = 24 && tinggi textbox
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledForeColor = RGB(0,0,255) && warna non-aktif
DisabledBackColor = RGB(224,224,224) && warna non-aktif
MaxLength = 5 && panjang maksimum isian textbox
Value = "" && nilai textbox dokosongkan
Visible = .T. && tampil di layar monitor
ENDDEFINE
*--- definisi grid myGrdGrid ---*
DEFINE CLASS myGrdGrid AS Grid
Top = 185 && posisi atas
Left = 10 && posisi kiri
Width = 520 && lebar grid
Height = 265 && tinggi grid
ColumnCount = 6 && jumlah kolom
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,255) && warna huruf
SplitBar = .F. && splitbar di-non-aktifkan
* tambahkan prosedur AfterRowColChange

89
PROCEDURE AfterRowColChange
* parameter harus ada, tapi tidak digunakan
LPARAMETERS nColIndex
* aktifkan prosedur TampilkanData()
TampilkanData(.T.)
ENDPROC
ENDDEFINE
*--- definisi command button myFirst ---*
DEFINE CLASS myFIRST AS COMMANDBUTTON
Top = 450 && posisi atas
Left = 10 && posisi kiri
Width = 40 && lebar button
Height = 25 && tinggi button
Caption = "|<" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Record Awal" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button FIRST diklik
SELECT TabelKu && aktifkan tabel TabelKu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
IF RECNO()=1 && jika posisi di record awal, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....top of file!")
ELSE && jika posisi tidak di record awal, maka:
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("FIRST")
ENDIF
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button myPrev ---*
DEFINE CLASS myPREV AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdFirst.Left + ;
_Screen.cmdFirst.Width && posisi kiri
Width = _Screen.cmdFirst.Width && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "<" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Record Sebelumnya" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button NEXT diklik
SELECT TabelKu && aktifkan tabel TabelKu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
IF RECNO()=1 && jika posisi di record awal, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....top of file!")
ELSE
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("PREV")
ENDIF

90
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button myNext ---*
DEFINE CLASS myNEXT AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdPrev.Left + ;
_Screen.cmdPrev.Width && posisi kiri
Width = _Screen.cmdFirst.Width && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = ">" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Record Berikutnya" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button NEXT diklik
SELECT TabelKu && aktifkan tabel TabelKu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
* jika posisi di record akhir, maka:
IF RECNO() = RECCOUNT()
* tampilkan pesan
TampilkanSorry("SORRY.....end of file!")
ELSE && jika posisi tidak di record akhir, maka:
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("NEXT")
ENDIF
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button myLast ---*
DEFINE CLASS myLAST AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdNext.Left + ;
_Screen.cmdNext.Width && posisi kiri
Width = _Screen.cmdFirst.Width && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = ">|" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Record Akhir" && keterangan singkat
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button LAST diklik
SELECT TabelKu && aktifkan tabel TabelKu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
* jika posisi di record akhir, maka:
IF RECNO() = RECCOUNT()
* tampilkan pesan
TampilkanSorry("SORRY.....end of file!")
ELSE && jika posisi tidak di record akhir, maka:
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("LAST")
ENDIF
ENDIF

91
ENDPROC
ENDDEFINE
*--- definisi command button myAdd ---*
DEFINE CLASS myADD AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdLast.Left + ;
_Screen.cmdLast.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "ADD" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Tambah Data" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button ADD diklik
LOCAL nRecPos && variabel lokal
SELECT TabelKu && aktifkan tabel TabelKu.dbf
* periksa isi button
IF ThisForm.cmdAdd.Caption = "ADD" && tambah data
* jika jumlah record maksimum, maka:
IF RECCOUNT() >= nMaxRec
* tampilkan pesan
TampilkanSorry("SORRY.....maksimum record 1.000!")
* posisi kursor di field Kode
ThisForm.txtKode.SetFocus
ELSE && jika jumlah record belum maksimum, maka:
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("ADD")
ENDIF
ELSE && simpan data (SAVE)
* jika Kode kosong, maka:
IF EMPTY(ThisForm.txtKode.Value)
* tampilkan pesan
TampilkanSorry("SORRY.....Kode kosong!")
* posisi kursor di field Kode
ThisForm.txtKode.SetFocus
ELSE && jika Kode isi, maka:
nRecPos = RECNO() && posisi record sekarang
* cari Kode yang sama
LOCATE FOR TabelKu.Kode=ThisForm.txtKode.Value
IF FOUND() && jika Kode sama, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....Kode sudah ada!")
* posisi kursor di field Kode
ThisForm.txtKode.SetFocus
GO nRecPos && menuju record xRecPos
ELSE && jika Kode tidak sama, maka:
APPEND BLANK && tambahkan record kosong
* isi dengan data berikut ini:
REPLACE TabelKu.Kode WITH ;
ThisForm.txtKode.Value
REPLACE TabelKu.Nama WITH ;
ThisForm.txtNama.Value
IF ThisForm.optJenKel.Value = 1
REPLACE TabelKu.JenKel WITH "Laki-laki"
ELSE
REPLACE TabelKu.JenKel WITH "Perempuan"
ENDIF
REPLACE TabelKu.Alamat WITH ;
ThisForm.txtAlamat.Value

92
REPLACE TabelKu.Kota WITH ;
ThisForm.txtKota.Value
REPLACE TabelKu.KodePos WITH ;
ThisForm.txtKodePos.Value
FLUSH && pastikan data disimpan
GO BOTTOM && menuju record akhir
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("SAVE")
ENDIF
ENDIF
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button myEdit ---*
DEFINE CLASS myEDIT AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdAdd.Left + ;
_Screen.cmdAdd.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "EDIT" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Ubah Data" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button EDIT diklik
SELECT TabelKu && aktifkan tabel TabelKu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
DO CASE && periksa isi (caption) button
CASE ThisForm.cmdEdit.Caption="EDIT" && ubah data
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("EDIT")
CASE ThisForm.cmdEdit.Caption="SAVE" && simpan data
* simpan data berikut ini:
REPLACE TabelKu.Nama WITH ;
ThisForm.txtNama.Value
IF ThisForm.optJenKel.Value = 1
REPLACE TabelKu.JenKel WITH "Laki-laki"
ELSE
REPLACE TabelKu.JenKel WITH "Perempuan"
ENDIF
REPLACE TabelKu.Alamat WITH ;
ThisForm.txtAlamat.Value
REPLACE TabelKu.Kota WITH ;
ThisForm.txtKota.Value
REPLACE TabelKu.KodePos WITH ;
ThisForm.txtKodePos.Value
FLUSH && pastikan data disimpan dalam tabel
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("SAVE")
OTHERWISE && batal (CANCEL)
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("SAVE")
ENDCASE
ENDIF
ENDPROC
ENDDEFINE

93
*--- definisi command button myDelete ---*
DEFINE CLASS myDELETE AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdEdit.Left + ;
_Screen.cmdEdit.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "DELETE" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Hapus Data" && keterangan singkat
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button DELETE diklik
LOCAL xYesNo, xRecSek && variabel lokal
SELECT TabelKu && aktifkan tabel TabelKu.dbf
xRecSek = RECNO() && variabel posisi record sekarang
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
* periksa isi button (Caption)
IF ThisForm.cmdDelete.Caption="DELETE" && hapus data
* tampilkan pesan untuk memilih YES atau NO
IF MESSAGEBOX("Anda ingin menghapus data ini?",;
4+32+256,"Konfirmasi") = 6 && pilih YES
DELETE && hapus data
PACK && pastikan data terhapus dalam tabel
* aktifkan prosedur GridRefresh()
GridRefresh()
* aktifkan prosedur SetButton()
SetButton(.T.)
* aktifkan prosedur SetField()
SetField(.F.)
IF RECCOUNT()=0 && jika tabel kosong, maka:
* aktifkan prosedur TampilkanData()
TampilkanData(.F.)
* tampilkan pesan
MESSAGEBOX("Data Anda sudah dihapus.....!"+;
CHR(13)+CHR(13)+"SORRY.....file kosong!",;
0,"Delete")
ELSE
* jika posisi record > jumlah record
IF xRecSek > RECCOUNT()
GO BOTTOM && menuju record akhir
ELSE
GO xRecSek && menuju record sekarang
ENDIF
* aktifkan prosedur TampilkanData()
TampilkanData(.T.)
* tampilkan pesan
MESSAGEBOX("Data Anda sudah dihapus.....!",;
0,"Delete")
ENDIF
ELSE
* aktif prosedur TampilkanRecord()
TampilkanRecord("SAVE")
ENDIF
ELSE
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("SAVE")

94
ENDIF
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button mySort ---*
DEFINE CLASS mySORT AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdDelete.Left + ;
_Screen.cmdDelete.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "SORT" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Urut Data" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button SORT diklik
LOCAL nRecPos && variabel lokal
SELECT TabelKu && aktifkan tabel TabelKu.dbf
nRecPos = RECNO() && variabel posisi record sekarang
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
SortData() && aktifkan prosedur SortData()
GO nRecPos && menuju posisi record sekarang
* aktifkan prosedur TampilkanRecord()
TampilkanRecord("SORT")
ENDIF
ENDPROC
ENDDEFINE
*--- definisi command button myAbout ---*
DEFINE CLASS myABOUT AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdSort.Left + ;
_Screen.cmdSort.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "ABOUT" && isi button
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor = RGB(0,0,0) && warna huruf
ToolTipText = "Tentang Program" && tips kecil
Visible = .T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button ABOUT diklik
* tampilkan pesan
MESSAGEBOX("Program ini disumbangkan kepada"+;
CHR(13)+"komunitas programer di Indonesia."+;
CHR(13)+"Semoga bermanfaat.....",0,"About")
ENDPROC
ENDDEFINE
*--- definisi command button myClose ---*
DEFINE CLASS myCLOSE AS COMMANDBUTTON
Top = _Screen.cmdFirst.Top && posisi atas
Left = _Screen.cmdAbout.Left + ;
_Screen.cmdAbout.Width && posisi kiri
Width = _Screen.cmdFirst.Width + 20 && lebar button
Height = _Screen.cmdFirst.Height && tinggi button
Caption = "CLOSE" && isi button
Cancel = .T. && aktif jika tombol ESC ditekan

95
FontName = "Arial" && jenis huruf
FontSize = 9 && ukuran huruf
ForeColor =RGB(0,0,0) && warna huruf
ToolTipText="Selesai, kembali ke Windows" && tips kecil
Visible =.T. && tampil di layar monitor
PROCEDURE Click && aktif, jika button CLOSE diklik
* tampilkan pesan, pilih YES atau NO
IF MESSAGEBOX("Anda ingin selesai?",4+32,;
"Konfirmasi") = 6 && pilihan YES
Stop() && aktifkan prosedur Stop()
ENDIF
ENDPROC
ENDDEFINE
******************************
* definisi prosedur-prosedur *
******************************
*--- prosedur SetButton ---*
PROCEDURE SetButton
PARAMETERS xPar && menerima variabel kiriman
* mengatur button dalam form _SCREEN
WITH _Screen
.cmdFirst.Enabled = xPar && button ON/OFF
.cmdPrev.Enabled = xPar && button ON/OFF
.cmdNext.Enabled = xPar && button ON/OFF
.cmdLast.Enabled = xPar && button ON/OFF
.cmdAdd.Enabled = xPar && button ON/OFF
.cmdEdit.Enabled = xPar && button ON/OFF
.cmdDelete.Enabled = xPar && button ON/OFF
.cmdSort.Enabled = xPar && button ON/OFF
.cmdAbout.Enabled = xPar && button ON/OFF
.cmdClose.Enabled = xPar && button ON/OFF
IF xPar = .T.
.cmdAdd.Caption = "ADD" && isi button
.cmdEdit.Caption = "EDIT" && isi button
.cmdDelete.Caption = "DELETE" && isi button
.cmdAdd.ToolTipText = "Tambah Data" && tips
.cmdEdit.ToolTipText = "Ubah Data" && tips
.cmdDelete.ToolTipText = "Hapus Data" && tips
ENDIF
ENDWITH
ENDPROC
*--- prosedur SetField ---*
PROCEDURE SetField
PARAMETERS xPar && menerima variabel kiriman
* mengatur field dalam form _SCREEN
WITH _Screen
.txtKode.Enabled = xPar && textbox ON/OFF
.txtNama.Enabled = xPar && textbox ON/OFF
.optJenKel.Enabled = xPar && textbox ON/OFF
.txtAlamat.Enabled = xPar && textbox ON/OFF
.txtKota.Enabled = xPar && textbox ON/OFF
.txtKodePos.Enabled = xPar && textbox ON/OFF
IF xPar && jika bernilai TRUE, maka:
* warna dasar putih
.optJenKel.BackColor = RGB(255,255,255)
.optJenKel.Option1.BackColor = RGB(255,255,255)
.optJenKel.Option2.BackColor = RGB(255,255,255)
ELSE && jika bernilai FALSE, maka:
* warna dasar abu-abu
.optJenKel.BackColor = RGB(224,224,224)
.optJenKel.Option1.BackColor = RGB(224,224,224)

96
.optJenKel.Option2.BackColor = RGB(224,224,224)
ENDIF
.myGrid.Enabled = NOT xPar && grid ON/OFF
ENDWITH
ENDPROC
*--- prosedur TampilkanData ---*
PROCEDURE TampilkanData
PARAMETERS xPar && menerima variabel kiriman
IF xPar && jika bernilai TRUE, maka:
* tampilkan data berikut
WITH _Screen
.txtNoRec.Value = RECNO() && NoRec
.txtTotRec.Value = RECCOUNT() && TotRec
.txtKode.Value = TabelKu.Kode && Kode
.txtNama.Value = TabelKu.Nama && Nama
IF TabelKu.JenKel = "Laki-laki"
.optJenKel.Value = 1 && JenKel
ELSE
.optJenKel.Value = 2 && JenKel
ENDIF
.txtAlamat.Value = TabelKu.Alamat && Alamat
.txtKota.Value = TabelKu.Kota && Kota
.txtKodePos.Value = TabelKu.KodePos && KodePos
.myGrid.Refresh
ENDWITH
ELSE && jika bernilai FALSE, maka
* tampilkan data berikut
WITH _Screen
.txtNoRec.Value = RECCOUNT()+1 && NoRec
.txtTotRec.Value = RECCOUNT() && TotRec
.txtKode.Value = "" && isi textbox Kode
.txtNama.Value = "" && isi textbox Nama
.optJenKel.Value = 1 && isi textbox JenKel
.txtAlamat.Value = "" && isi textbox Alamat
.txtKota.Value = "" && isi textbox Kota
.txtKodePos.Value = "" && isi textbox KodePos
ENDWITH
ENDIF
ENDPROC
*--- prosedur TampilkanRecord ---*
PROCEDURE TampilkanRecord
PARAMETERS cPar && menerima variabel kiriman
DO CASE
CASE cPar = "FIRST"
GO TOP && menuju record awal
CASE cPar = "PREV"
SKIP -1 && menuju record sebelumnya
CASE cPar = "NEXT"
SKIP && menuju record berikutnya
CASE cPar = "LAST"
GO BOTTOM && menuju record akhir
CASE cPar = "ADD"
SetButton(.F.) && aktifkan prosedur SetButton()
SetField(.T.) && aktifkan prosedur SetField()
WITH _Screen
.cmdAdd.Enabled = .T. && aktifkan button cmdADD
.cmdEdit.Enabled = .T. && aktifkan button cmdEDIT
.cmdAdd.Caption = "SAVE" && isi button cmdADD
.cmdEdit.Caption = "CANCEL" && isi button cmdEDIT
.cmdAdd.ToolTipText = "Simpan Data" && tip kecil
.cmdEdit.ToolTipText = "Batal" && tip kecil

97
.txtKode.SetFocus && kursor di field txtKode
ENDWITH
CASE cPar = "EDIT"
SetButton(.F.) && aktifkan prosedur SetButton()
SetField(.T.) && aktifkan prosedur SetField()
WITH _Screen
.txtKode.Enabled = .F. && textbox Kode nonaktif
.cmdEdit.Enabled = .T. && button cmdEDIT aktif
.cmdDelete.Enabled = .T. && button cmdDELETEaktif
.cmdEdit.Caption = "SAVE" && button cmdEDIT
.cmdDelete.Caption = "CANCEL" && button cmdDELETE
.cmdEdit.ToolTipText ="Simpan Data" && tip kecil
.cmdDelete.ToolTipText="Batal" && tip kecil
.txtNama.SetFocus && kursor di field txtNama
ENDWITH
CASE cPar = "SAVE"
SetButton(.T.) && aktifkan prosedur SetButton()
SetField(.F.) && aktifkan prosedur SetField()
OTHERWISE
SetButton(.T.) && aktifkan prosedur SetButton()
SetField(.F.) && aktifkan prosedur SetField()
ENDCASE
IF cPar = "ADD"
TampilkanData(.F.) && aktif prosedur TampilkanData()
ELSE
TampilkanData(.T.) && aktif prosedur TampilkanData()
ENDIF
ENDPROC
*--- prosedur TampilkanSorry ---*
PROCEDURE TampilkanSorry
PARAMETERS cPar && menerima variabel kiriman
MESSAGEBOX(cPar,0,"SORRY") && tampilkan pesan SORRY
ENDPROC
*--- prosedur GridRefresh ---*
PROCEDURE GridRefresh
* me-refresh grid myGrid
WITH _Screen.myGrid
.HighlightStyle = 2 && warna dasar dipilih
.HighlightForeColor = RGB(0,0,255) && huruf
.HighlightBackColor = RGB(224,224,224) && dasar
.SelectedItemForeColor = RGB(0,0,0) && huruf
.SelectedItemBackColor = RGB(128,255,128) && dasar
.RecordSource = "TabelKu" && tabel TabelKu
.RecordSourceType = 1 && tipe alias
.AllowAutoColumnFit = 2 && kolom tetap
.AllowHeaderSizing = .F. && header tidak bisa diubah
.DeleteMark = .F. && tidak bisa dihapus
.ReadOnly = .T. && tidak bisa diubah
.Visible = .T. && tampilkan di layar monitor
* lebar masing-masing kolom
.Column1.Width = 50 && lebar kolom1
.Column2.Width = 200 && lebar kolom2
.Column3.Width = 100 && lebar kolom3
.Column4.Width = 200 && lebar kolom4
.Column5.Width = 200 && lebar kolom5
.Column6.Width = 60 && lebar kolom6
* judul masing-masing kolom
.Column1.Header1.Caption = "KODE" && judul kolom1
.Column2.Header1.Caption = "N A M A" && judul kolom2
.Column3.Header1.Caption = "JEN.KEL." && judul kolom3
.Column4.Header1.Caption = "ALAMAT" && judul kolom4

98
.Column5.Header1.Caption = "KOTA" && judul kolom5
.Column6.Header1.Caption = "KODE POS" && judul kolom6
ENDWITH
* me-refresh optiongroup optJenKel
WITH _Screen.optJenKel
.ForeColor = RGB(0,0,255) && warna huruf
.BackColor = RGB(224,224,224) && warna dasar
* mengatur optiongroup.Option1
.Option1.Top = 2 && posisi atas
.Option1.Left = 10 && posisi kiri
.Option1.Width = 80 && lebar option1
.Option1.Height = 22 && tinggi option1
.Option1.ForeColor = RGB(0,0,0) && warna non-aktif
.Option1.BackColor = RGB(224,224,224) && non-aktif
.Option1.Caption = "Laki-laki" && isi option1
* mengatur optiongroup.Option2
.Option2.Top = 2 && posisi atas
.Option2.Left = 100 && posisi kiri
.Option2.Width = 80 && lebar option1
.Option2.Height = 22 && tinggi option1
.Option2.ForeColor = RGB(0,0,0) && warna non-aktif
.Option2.BackColor = RGB(224,224,224) && non-aktif
.Option2.Caption = "Perempuan" && isi option1
ENDWITH
ENDPROC
*--- prosedur Start ---*
PROCEDURE Start
* isi label Tanggal
_Screen.Tanggal.Caption = TampilkanTanggal()
CLOSE TABLES ALL && tutup semua tabel
* periksa, apakah file TabelKu.dbf sudah ada
* jika file TabelKu.dbf tidak ada, maka:
IF NOT FILE("TabelKu.dbf")
* buat file baru TabelKu.dbf
CREATE TABLE TabelKu.dbf ( ;
Kode C(5), ;
Nama C(50), ;
JenKel C(9), ;
Alamat C(50), ;
Kota C(50), ;
KodePos C(5))
ENDIF
CLOSE TABLES ALL && tutup semua tabel
* aktifkan tabel TabelKu
USE TabelKu ALIAS TabelKu EXCLUSIVE IN 0
GridRefresh() && aktifkan prosedur GridRefresh()
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ENDIF
ENDPROC
*--- prosedur Stop ---*
PROCEDURE Stop
SELECT TabelKu && aktifkan tabel TabelKu.dbf
* jika jumlah record melebihi maksimum, maka:
IF RECCOUNT() > nMaxRec
GO (nMaxRec+1) && menuju mrecord maksimum + 1
* hapus beberapa record berikutnya
DELETE NEXT RECCOUNT()
* pastikan record benar-benar dihapus dari tabel
PACK

99
ENDIF
QUIT && selesai, kembali ke Windows
ENDPROC
*--- prosedur SortData ---*
PROCEDURE SortData
* membuat form myFormSort
oFormSort = CREATEOBJECT("myFormSort")
oFormSort.Show && tampilkan
READ EVENTS && aktifkan semua event
RETURN && selesai
ENDPROC
****************************
* definisi form myFormSort *
****************************
DEFINE CLASS myFormSort As Form
Top = 10 && posisi atas
Left = 10 && posisi kiri
Width = 300 && lebar form
Height = 160 && tinggi form
Caption = "Urut Data" && judul form
BorderStyle = 2 && fix dialog
BackColor = _Screen.BackColor && warna dasar
AutoCenter = .T. && posisi di tengah layar monitor
ControlBox = .F. && control box di-non-aktifkan
Movable = .T. && bisa dipindahkan
MinButton = .F. && button minimum di-non-aktifkan
MaxButton = .F. && button maksimum di-non-aktifkan
Closable = .F. && button close di-non-aktifkan
ShowTips = .T. && tip tool text di-aktifkan
WindowType = 1 && window modal, lainnya non-aktif
****************************************************
* berikut ini cara mengisi form myFormSort, yaitu: *
* langsung menambahkan objek bersama atributnya *
* ke dalam form *
****************************************************
*--- tambahkan label lblMyJudul ---*
ADD OBJECT lblMyJudul As Label WITH ;
Name = "lblJudul", ;
Caption = "Urut berdasarkan:", ;
BackColor = _Screen.BackColor, ;
FontBold = .T., ;
Top = 10, ;
Left = 10, ;
Width = 120, ;
Height = 22, ;
Visible = .T.
*--- tambahkan optiongroup optMyOption ---*
ADD OBJECT optMyOption AS OptionGroup WITH ;
Name = "optOption", ;
FontName = "Arial", ;
FontSize = 9, ;
BackColor = _Screen.BackColor, ;
ButtonCount = 4, ;
Left = 10, ;
Top = 35, ;
Width = 130, ;
Height = 110, ;
Enabled = .T., ;
Visible = .T.
*--- tambahkan optiongroup optMySort ---*
ADD OBJECT optMySort AS OptionGroup WITH ;

100
Name = "optSort", ;
FontName = "Arial", ;
FontSize = 9, ;
BackColor = _Screen.BackColor, ;
ButtonCount = 2, ;
Left = 150, ;
Top = 35, ;
Width = 120, ;
Height = 60, ;
Enabled = .T., ;
Visible = .T.
*--- tambahkan button mySort ---*
ADD OBJECT mySort As Commandbutton WITH ;
Name = "cmdSortOK", ;
Caption = "OK", ;
Top = 120, ;
Left = 150, ;
Width = 60, ;
Height = 25, ;
ToolTipText = "Proses dilanjutkan", ;
Visible = .T.
*--- tambahkan button myClose ---*
ADD OBJECT myClose As Commandbutton WITH ;
Name = "cmdSortClose", ;
Caption = "Close", ;
Cancel = .T., ;
Top = 120, ;
Left = 210, ;
Width = 60, ;
Height = 25, ;
ToolTipText = "Proses dibatalkan", ;
Visible = .T.
*--- prosedur Init ---*
PROCEDURE Init
* mengatur optiongroup optOption
WITH Thisform.optOption
.Option1.Name = "optKODE" && nama option1
.Option2.Name = "optNAMA" && nama option1
.Option3.Name = "optJKEL" && nama option2
.Option4.Name = "optKOTA" && nama option3
* mengatur optKODE
.optKODE.Caption = "KODE" && isi optKODE
.optKODE.ForeColor = RGB(0,0,255) && warna biru
.optKODE.FontBold = .T. && huruf tebal
.optKODE.BackColor = _Screen.BackColor && dasar
.optKODE.Top = 5 && posisi atas
.optKODE.Left = 5 && posisi kiri
.optKODE.Width = 100 && lebar optKODE
.optKODE.Height = 20 && tinggi optKODE
.optKODE.Visible = .T. && tampilkan di monitor
* mengatur optNAMA
.optNAMA.Caption = "NAMA" && isi optNAMA
.optNAMA.ForeColor = RGB(0,0,255) && warna biru
.optNAMA.FontBold = .T. && huruf tebal
.optNAMA.BackColor = _Screen.BackColor && dasar
.optNAMA.Top = 30 && posisi atas
.optNAMA.Left = 5 && posisi kiri
.optNAMA.Width = 100 && lebar optNAMA
.optNAMA.Height = 20 && tinggi optNAMA
.optNAMA.Visible = .T. && tampilkan di monitor
* mengatur optJKEL

101
.optJKEL.Caption = "JENIS KELAMIN" && optJKEL
.optJKEL.ForeColor = RGB(0,0,255) && warna biru
.optJKEL.FontBold = .T. && huruf tebal
.optJKEL.BackColor = _Screen.BackColor && dasar
.optJKEL.Top = 55 && posisi atas
.optJKEL.Left = 5 && posisi kiri
.optJKEL.Width = 110 && lebar optJKEL
.optJKEL.Height = 20 && tinggi optJKEL
.optJKEL.Visible = .T. && tampilkan di monitor
* mengatur optKOTA
.optKOTA.Caption = "KOTA" && isi optKOTA
.optKOTA.ForeColor = RGB(0,0,255) && warna biru
.optKOTA.FontBold = .T. && huruf tebal
.optKOTA.BackColor = _Screen.BackColor && dasar
.optKOTA.Top = 80 && posisi atas
.optKOTA.Left = 5 && posisi kiri
.optKOTA.Width = 100 && lebar optKOTA
.optKOTA.Height = 20 && tinggi optKOTA
.optKOTA.Visible = .T. && tampilkan di monitor
ENDWITH
* mengatur optiongroup optSort
WITH Thisform.optSort
.Option1.Name = "optASC" && nama option1
.Option2.Name = "optDESC" && nama option2
* mengatur optASC
.optASC.Caption = "Ascending" && isi optASC
.optASC.ForeColor = RGB(0,0,255) && warna biru
.optASC.FontBold = .T. && huruf tebal
.optASC.BackColor = _Screen.BackColor && dasar
.optASC.Top = 5 && posisi atas
.optASC.Left = 5 && posisi kiri
.optASC.Width = 100 && lebar optASC
.optASC.Height = 20 && tinggi optASC
.optASC.Visible = .T. && tampilkan di monitor
* mengatur optDESC
.optDESC.Caption = "Descending" && isi optDESC
.optDESC.ForeColor = RGB(0,0,255) && warna bitu
.optDESC.FontBold = .T. && huruf tebal
.optDESC.BackColor = _Screen.BackColor && dasar
.optDESC.Top = 30 && posisi atas
.optDESC.Left = 5 && posisi kiri
.optDESC.Width = 100 && lebar optDESC
.optDESC.Height = 20 && tinggi optDESC
.optDESC.Visible = .T. && tampilkan di monitor
ENDWITH
ENDPROC
*--- prosedur cmdSortOK.Click ---*
PROCEDURE cmdSortOK.Click
LOCAL I, N, xUrut && variabel lokal
*********************************************
* pengurutan BUBBLE SORT (external sorting) *
* untuk jumlah data 1.000 - waktu 00:01:30 *
*********************************************
SELECT TabelKu && aktifkan tabel TabelKu
N = RECCOUNT() && variabel jumlah record
xUrut = .F. && variabel tanda (flag/switch)
DO WHILE xUrut = .F. && selama False (belum urut)
xUrut = .T. && tanda True (sudah urut)
* pembacaan data sequential (awal s/d akhir)
FOR I = 1 TO (N-1)
GO I && menuju record ke I, ambil data

102
xKODE = TabelKu.Kode && ambil KODE
xNAMA = TabelKu.Nama && ambil NAMA
xJKEL = TabelKu.JenKel && ambil JENKEL
xALMT = TabelKu.Alamat && ambil ALAMAT
xKOTA = TabelKu.Kota && ambil KOTA
xKPOS = TabelKu.KodePos && ambil KODEPOS
GO (I+1) && menuju record ke (I+1), ambil data
yKODE = TabelKu.Kode && ambil KODE
yNAMA = TabelKu.Nama && ambil NAMA
yJKEL = TabelKu.JenKel && ambil JENKEL
yALMT = TabelKu.Alamat && ambil ALAMAT
yKOTA = TabelKu.Kota && ambil KOTA
yKPOS = TabelKu.KodePos && ambil KODEPOS
* periksa kondisi pengurutan dalam form ini
WITH ThisForm
* lakukan pembandingan
DO CASE
* urut KODE - ASCENDING
CASE .optOption.Value=1 AND .optSort.Value=1
* jika memenuhi syarat, pemindahan data
IF xKODE > yKODE
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut KODE - DESCENDING
CASE .optOption.Value=1 AND .optSort.Value=2
* jika memenuhi syarat, pemindahan data
IF xKODE < yKODE
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut NAMA - ASCENDING
CASE .optOption.Value=2 AND .optSort.Value=1
* jika memenuhi syarat, pemindahan data
IF xNAMA > yNAMA
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut NAMA - DESCENDING
CASE .optOption.Value=2 AND .optSort.Value=2
* jika memenuhi syarat, pemindahan data
IF xNAMA < yNAMA
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut JENKEL - ASCENDING
CASE .optOption.Value=3 AND .optSort.Value=1
* jika memenuhi syarat, pemindahan data
IF xJKEL > yJKEL
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data

103
ENDIF
* urut JENKEL - DESCENDING
CASE .optOption.Value=3 AND .optSort.Value=2
* jika memenuhi syarat, pemindahan data
IF xJKEL < yJKEL
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut KOTA - ASCENDING
CASE .optOption.Value=4 AND .optSort.Value=1
* jika memenuhi syarat, pemindahan data
IF xKOTA > yKOTA
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
* urut KOTA - DESCENDING
CASE .optOption.Value=4 AND .optSort.Value=2
* jika memenuhi syarat, pemindahan data
IF xKOTA < yKOTA
xUrut = .F. && False (belum urut)
ThisForm.SimpanData(I,xKODE,xNAMA,xJKEL,;
xALMT,xKOTA,xKPOS,yKODE,yNAMA,yJKEL,;
yALMT,yKOTA,yKPOS) && simpan data
ENDIF
ENDCASE
ENDWITH
NEXT
ENDDO
ThisForm.Release && form dihapus
ENDPROC
*--- prosedur cmdSortClose.Click ---*
PROCEDURE cmdSortClose.Click
ThisForm.Release && form dihapus
ENDPROC
*--- prosedur SimpanData ---*
PROCEDURE SimpanData
* menerima 13 variabel kiriman
PARAMETERS nRecPos, ;
xKODE,xNAMA,xJKEL,xALMT,xKOTA,xKPOS, ;
yKODE,yNAMA,yJKEL,yALMT,yKOTA,yKPOS
* menuju record xRecPos
GO nRecPos
* menyimpan data di record xRecPos
REPLACE TabelKu.Kode WITH yKODE && simpan Kode
REPLACE TabelKu.Nama WITH yNAMA && simpan Nama
REPLACE TabelKu.JenKel WITH yJKEL && simpan JenKel
REPLACE TabelKu.Alamat WITH yALMT && simpan Alamat
REPLACE TabelKu.Kota WITH yKOTA && simpan Kota
REPLACE TabelKu.KodePos WITH yKPOS && simpan Kode Pos
* menuju record ( xRecPos + 1 )
GO (nRecPos+1)
* menyimpan data di record xRecPos+1
REPLACE TabelKu.Kode WITH xKODE && simpan Kode
REPLACE TabelKu.Nama WITH xNAMA && simpan Nama
REPLACE TabelKu.JenKel WITH xJKEL && simpan JenKel
REPLACE TabelKu.Alamat WITH xALMT && simpan Alamat
REPLACE TabelKu.Kota WITH xKOTA && simpan Kota

104
REPLACE TabelKu.KodePos WITH xKPOS && simpan Kode Pos
ENDPROC
ENDDEFINE
*--- prosedur TampilkanTanggal ---*
FUNCTION TampilkanTanggal
LOCAL cRet,NamaHari(7),NamaPasar(5),NamaBulan(12)
* Nama-nama hari
NamaHari(1) = "Minggu"
NamaHari(2) = "Senin"
NamaHari(3) = "Selasa"
NamaHari(4) = "Rabu"
NamaHari(5) = "Kamis"
NamaHari(6) = "Jum'at"
NamaHari(7) = "Sabtu"
* Nama-nama pasaran
NamaPasar(1) = "Pahing"
NamaPasar(2) = "Pon"
NamaPasar(3) = "Wage"
NamaPasar(4) = "Kliwon"
NamaPasar(5) = "Legi"
* Nama-nama bulan
NamaBulan(1) = "Januari"
NamaBulan(2) = "Februari"
NamaBulan(3) = "Maret"
NamaBulan(4) = "April"
NamaBulan(5) = "Mei"
NamaBulan(6) = "Juni"
NamaBulan(7) = "Juli"
NamaBulan(8) = "Agustus"
NamaBulan(9) = "September"
NamaBulan(10)= "Oktober"
NamaBulan(11)= "Nopember"
NamaBulan(12)= "Desember"
* nama hari dan pasar, tanggal, bulan dan tahun
cRet = NamaHari(DOW(DATE()))+" - "+ ;
NamaPasar((MOD((DATE()-CTOD("01/01/1900")),5)+1))+;
", "+ALLTRIM(STR(DAY(DATE())))+" "+;
NamaBulan(MONTH(DATE()))+" "+STR(YEAR(DATE()),4)
* mengembalikan nama hari dan pasar, tanggal,
* bulan dan tahun
RETURN (cRet)
ENDFUNC
* End of procedure

Ketik program di atas, simpan dengan nama TabelKu.prg atau copy


file TabelKu.prg dari CD pendamping buku ini, kemudian jalankan di
dalam lingkungan Visual FoxPro. Hasilnya pasti memuaskan!

105
TABEL BAPAKANAK

Program aplikasi Bapak-Anak ini melibatkan tiga tabel (DBF) yang


saling berhubungan. Tabel Bapak.dbf berhubungan langsung dengan
tabel Anak.dbf, sedangkan tabel Anak.dbf berhubungan dengan tabel
Cucu.dbf. Ketiga tabel dihubungkan menggunakan field kunci. Tabel
Bapak.dbf menggunakan kunci KODE untuk berhubungan dengan
tabel Anak.dbf, sedangkan tabel Anak.dbf menggunakan kunci
KDANAK untuk berhubungan dengan tabel Cucu.dbf.
Dengan program BapakAnak ini, Anda dapat mengisi data, meng-
ubah data, menghapus data, serta menelusuri tabel dari satu record
ke record lainnya. Tabel Bapak, tabel Anak, maupun tabel Cucu
ditampilkan dalam satu layar sebagai sarana interaktif antara pema-
kai dengan database (tabel).
Pembahasan dalam program aplikasi Bapak-Anak ini difokuskan
pada pembuatan file kode (CODE), yaitu file yang berekstensi PRG.
Program BapakAnak berhubungan dengan 3 tabel, yaitu Bapak.DBF,
Anak.DBF, dan Cucu.DBF.

106
Kita masih memanfaatkan form utama Visual FoxPro dan beberapa
objek Label, TextBox, Grid, dan CommandButton untuk menangani
ketiga tabel tersebut.
Struktur tabel Bapak.DBF adalah sebagai berikut.
No Field Type Width Keterangan
1 KODE C 3 Kode Bapak kunci
penghubung tabel Anak.DBF
2 NAMA C 30 Nama Bapak

Struktur tabel Anak.DBF adalah sebagai berikut.


No Field Type Width Keterangan
1 KODE C 3 Kode kunci penghubung
tabel Bapak.DBF
2 KDANAK C 3 Kode Anak kunci
penghubung tabel
MataKuliah.DBF
3 NMANAK C 30 Nama Anak

Struktur tabel Cucu.DBF adalah sebagai berikut.


No Field Type Width Keterangan
1 KDCUCU C 3 Kode Cucu kunci
penghubung tabel
Anak.DBF
2 NMCUCU C 30 Nama Cucu

Program aplikasi BapakAnak disusun berdasarkan konsep hubungan


antartabel seperti tersebut di atas. Tabel Bapak, tabel Anak, dan tabel
Cucu ditampilkan dalam satu layar sehingga memudahkan pemakai
untuk melakukan penelusuran dari satu record ke record lainnya.
Perubahan dalam tabel Bapak akan langsung kelihatan dalam tabel

107
Anak, demikian juga perubahan dalam tabel Anak akan langsung
kelihatan dalam tabel Cucu. Disamping itu, manipulasi data dapat
dilakukan dengan mudah, baik menambah data, mengubah data,
maupun menghapus data.
Berikut ini contoh hubungan antara tabel Bapak, Anak, dan Cucu. Di
mana satu data dalam tabel Bapak berhubungan dengan 2 data
dalam tabel Anak serta tabel Cucu.
Contoh pemakaian:
Tabel Bapak (001-Kusmijanto) berhubungan dengan 2 Anak (100
dan 200), sedangkan tabel Anak berhubungan dengan 2 Cucu (100-
Bhs. Indonesia dan 200-Bhs. Inggris).
Tabel Bapak:
KODE NAMA
001 Kusmijanto

Tabel Anak:
KODE KDANAK NMANAK
001 100 Bhs. Indonesia
001 200 Bhs. Inggris
002 100 Bhs. Indonesia
002 400 Sejarah

Tabel Cucu:
KDCUCU NMCUCU
100 Bhs. Indonesia
200 Bhs. Inggris
300 Matematika
400 Sejarah

108
Semoga uraian yang ringkas di atas bisa menjelaskan konsep
hubungan ketiga tabel yang tampak dalam contoh pemakaian.
Penjelasan yang lebih rinci sudah banyak ditulis dalam beberapa
buku mengenai konsep database relasional serta perintah SQL-nya.

7.1 Desain Program


Bentuk tampilan dari program Bapak-Anak seperti gambar di bawah
ini, yaitu jendela sebagai sarana interaktif antara pemakai dengan
database (tabel). Di bagian atas terdapat informasi tabel Bapak,
sedangkan di bagian bawah terdapat informasi tabel Anak. Jika
Anda mengklik button […], maka akan ditampilkan form yang
menangani tabel Cucu.

Gambar 7.1a Tampilan program aplikasi BapakAnak

109
Fasilitas yang tersedia, antara lain navigasi record, tambah data,
ubah data, hapus data, tentang program, dan tutup form.
Jika button […] diklik, maka akan tampil form pengelolaan cucu
sebagai berikut.
Form Pengelolaan tabel Cucu.

Gambar 7.1b Tampilan Pengelolaan Tabel Cucu

Fasilitas yang tersedia, antara lain navigasi record, tambah data,


ubah data, hapus data, tentang program dan tutup form, kembali ke
tampilan Bapak-Anak.

110
7.2 Logika Program
Dasar utama pembuatan program Bapak-Anak ini adalah jendela
sebagai sarana interaktif antara pemakai dan database (tabel).
Dalam pengelolaan 3 tabel dibutuhkan objek Label, Grid, dan
CommandButton yang menampilkan semua record (data) dari ketiga
tabel, yakni tabel Bapak, Anak, dan Cucu.
Program Bapak-Anak disusun hanya menggunakan kode program
(CODE) saja, tanpa membuat form lainnya selain form utama Visual
FoxPro, yaitu variabel _SCREEN. Algoritma program Bapak-Anak
adalah sebagai berikut.
• Mengatur variabel _SCREEN untuk diisi dengan beberapa objek
Label, objek Grid, dan objek CommandButton.
• Menghubungkan form dengan ketiga tabel (Bapak.dbf, Anak.dbf,
dan Cucu.dbf)
• Menampilkan record (data) ke dalam form. Selanjutnya terserah
pemakai.
• Pemakai dapat menelusuri tabel, menambah data, mengubah
data, atau menghapus data.
Pengembangan selanjutnya dari program ini, bisa digunakan untuk
berbagai keperluan bidang bisnis lainnya, misalnya akuntansi, point
of sales, pendidikan, perpustakaan, dan lain-lain.
Program aplikasi BapakAnak menampilkan isi tabel Bapak.dbf,
Anak.dbf, dan Cucu.dbf. Data yang ditampilkan, antara lain untuk
tabel Bapak.dbf adalah Kode dan Nama; sedangkan untuk tabel
Anak.dbf adalah Kode, Kode Anak, dan Nama Anak. Di baris atas
ditampilkan nama hari dan pasaran posisi tanggal saat ini dan
ditampilkan juga jam digital. Kemudian ditampilkan masing-masing
data (record) serta semua data dalam grid. Di baris bawah ditam-
pilkan navigasi (pergerakan) record, button untuk tambah data
(ADD), ubah data (EDIT), hapus data (DELETE), dan pengurutan
data (SORT), serta button About yang akan menampilkan kete-
rangan kecil tentang program ini, dan button Close yang akan
menampilkan pilihan untuk mengakhiri program. Jika dipilih YES,
maka program akan berhenti dan kembali ke Windows.

111
Secara sederhana, program aplikasi tabel BapakAnak dapat digam-
barkan sebagai berikut.

Start

Persiapan Mengatur form _SCREEN

Menampilkan semua data


Menampilkan dalam objek Grid dan
Data menampilkan satu data
dalam objek TextBox

Navigasi
… ADD EDIT DELETE SORT ABOUT CLOSE
Record

Stop
Menampilkan Å Pengelolaan tabel Cucu.dbf
Data Cucu

Navigasi
ADD EDIT DELETE ABOUT CLOSE
Record

Gambar 7.2 Flowchart program aplikasi tabel BapakAnak

112
7.3 Kode Program
Berikut ini listing kode program tabel BapakAnak.

***********************************************************
* Nama Program : BapakAnak.prg *
* Keterangan : program aplikasi (CODE) untuk menangani *
* 3 tabel Bapak, tabel Anak dan tabel Cucu *
* yang saling berhubungan (relationship) *
* - single user version (exclusive) - *
***********************************************************
* Set Environment
SET TALK OFF
SET STATUS OFF
SET SAFETY OFF
SET STATUS BAR OFF
SET SYSMENU OFF
SET EXCLUSIVE ON
SET ESCAPE ON
* bersihkan memori
CLEAR ALL
CLOSE ALL
CLOSE TABLES ALL
* variabel public
PUBLIC oKusForm As Form
PUBLIC nMaxRec
nMaxRec = 1000 && Jumlah record maksimum 1.000
* Mengatur form _SCREEN (milik Visual FoxPro)
WITH _Screen
.Top = 0 && posisi atas
.Left = 0 && posisi kiri
.Width = 390 && lebar form
.Height = 600 && tinggi form
.Caption = "Parent - Child Relationship" && judul form
.AutoCenter = .T. && form ditengah layar monitor
.ControlBox = .F. && button controbox dihilangkan
.Closable = .F. && button close dihilangkan
.MaxButton = .F. && button max dihilangkan
.MinButton = .F. && button min dihilangkan
.ShowTips = .T. && tampilkan tooltiptext
.BorderStyle = 2 && fix dialog
******************
* Kelompok Bapak *
******************
* tambahkan objek label
.AddObject("Judul","myJudul")
.AddObject("JudulBapak","myJudulBapak")
.AddObject("Waktu", "myWaktu")
.AddObject("Tanggal","myTanggal")
.AddObject("Jam","myJam")
.AddObject("Versi","myVersion")
.AddObject("RecBapak","myRecBapak")
.AddObject("KodeBapak","myKodeBapak")
.AddObject("NamaBapak","myNamaBapak")
* tambahkan objek label
.AddObject("Titik01","myTitik01")
.AddObject("Titik02","myTitik02")

113
.AddObject("Titik03","myTitik03")
* tambahkan objek textbox
.AddObject("txtKodeBapak","mytxtKodeBapak")
.AddObject("txtNamaBapak","mytxtNamaBapak")
.AddObject("txtNoRecBapak","mytxtNoRecBapak")
.AddObject("txtTotRecBapak","mytxtTotRecBapak")
* tambahkan objek grid
.AddObject("GrdGridBapak","myGrdGridBapak")
* tambahkan objek button
.AddObject("cmdTop","myCmdTop")
.AddObject("cmdPrev","myCmdPrev")
.AddObject("cmdNext","myCmdNext")
.AddObject("cmdBottom","myCmdBottom")
.AddObject("cmdAdd","myCmdAdd")
.AddObject("cmdEdit","myCmdEdit")
.AddObject("cmdDel","myCmdDel")
.AddObject("cmdAbout","myCmdAbout")
.AddObject("cmdClose","myCmdClose")
*****************
* Kelompok Anak *
*****************
* tambahkan objek label
.AddObject("JudulAnak","myJudulAnak")
.AddObject("KodeAnak","myKodeAnak")
.AddObject("NamaAnak","myNamaAnak")
.AddObject("TabelCucu","myTabelCucu")
.AddObject("NoRecAnak","myNoRecAnak")
.AddObject("NomorAnak","myNomorAnak")
* tambahkan objek label
.AddObject("Titik04","myTitik04")
.AddObject("Titik05","myTitik05")
.AddObject("Titik06","myTitik06")
.AddObject("Titik07","myTitik07")
* tambahkan objek textbox
.AddObject("txtKodeAnak","mytxtKodeAnak")
.AddObject("txtNomorAnak","mytxtNomorAnak")
.AddObject("txtNamaAnak","mytxtNamaAnak")
.AddObject("txtNoRecAnak","mytxtNoRecAnak")
.AddObject("txtTotRecAnak","mytxtTotRecAnak")
* tambahkan objek grid
.AddObject("GrdGridAnak","myGrdGridAnak")
* tambahkan objek button
.AddObject("cmdCucu","myCmdCucu")
* tambahkan objek button
.AddObject("cmdTopAnak","myCmdTopAnak")
.AddObject("cmdPrevAnak","myCmdPrevAnak")
.AddObject("cmdNextAnak","myCmdNextAnak")
.AddObject("cmdBottomAnak","myCmdBottomAnak")
.AddObject("cmdAddAnak","myCmdAddAnak")
.AddObject("cmdEditAnak","myCmdEditAnak")
.AddObject("cmdDelAnak","myCmdDelAnak")
.AddObject("cmdAboutAnak","myCmdAboutAnak")
.AddObject("cmdCloseAnak","myCmdCloseAnak")
* tampilkan form
.Show
ENDWITH
Start() && aktifkan prosedur Start()
READ EVENTS && aktifkan semua event
RETURN && selesai
*****************************************
* definisi objek timer, label, textbox, *

114
* optiongroup dan command button *
*****************************************
*--- definisi timer myWaktu ---*
DEFINE CLASS myWaktu AS Timer
Top = 0 && posisi atas
Left = 0 && posisi kiri
Interval = 1000 && interval 1 detik
PROCEDURE Timer && aktif setiap 1 detik
* label Jam diisi jam 00:00:00
_Screen.Jam.Caption = TIME()
ENDPROC
ENDDEFINE
******************
* KELOMPOK BAPAK *
******************
*----------------------------
* Kelompok Label
*----------------------------
*--- definisi label myJudul ---*
DEFINE CLASS myJudul As Label
Top = 10 && posisi atas
Left = 20 && posisi kiri
Width = 220 && lebar label
Height = 25 && tinggi label
FontBold = .T. && huruf tebal
Caption = "PARENT - CHILD TABLE RELATIONSHIP"
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--- definisi label myVersion ---*
DEFINE CLASS myVersion AS Label
Top = 10 && posisi atas
Left = 240 && posisi kiri
Width = 120 && lebar label
Height = 20 && tinggi label
Caption = "Single User Version" && isi label
Alignment = 1 && rata kanan
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myJudulBapak ---*
DEFINE CLASS myJudulBapak As Label
Top = 35 && posisi atas
Left = 20 && posisi kiri
Width = 108 && lebar label
Height = 25 && tinggi label
FontBold = .T. && huruf tebal
ForeColor = RGB(0,0,255) && warna huruf
Caption = "PARENT TABLE" && isi Label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--- definisi label myTanggal ---*
DEFINE CLASS myTanggal AS Label
Top = 35 && posisi atas
Left = 110 && posisi kiri
Width = 190 && lebar label
Height = 20 && tinggi label
Caption = "" && isi label
Alignment = 1 && rata kanan
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myJam ---*
DEFINE CLASS myJam AS Label

115
Top = 35 && posisi atas
Left = 310 && posisi kiri
Width = 50 && lebar textbox
Height = 20 && tinggi label
Caption = TIME() && label diisi jam 00:00:00
Alignment = 1 && rata kanan
Visible = .T. && label tampil
ENDDEFINE
*--- definisi label myKodeBapak ---*
DEFINE CLASS myKodeBapak As Label
Top = 60 && posisi atas
Left = 20 && posisi kiri
Width = 40 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Kode" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------
DEFINE CLASS myRecBapak As Label
Top = 60 && posisi atas
Left = 168 && posisi kiri
Width = 50 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Rec. No." && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------
DEFINE CLASS myNamaBapak As Label
Top = 85 && posisi atas
Left = 20 && posisi kiri
Width = 40 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Nama" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------
* Kelompok Titik Bapak
*------------------------------
DEFINE CLASS myTitik01 As Label
Top = 60 && posisi atas
Left = 216 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && di tengah
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------
DEFINE CLASS myTitik02 As Label
Top = 60 && posisi atas
Left = 60 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && di tengah
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor

116
ENDDEFINE
*------------------------------
DEFINE CLASS myTitik03 As Label
Top = 85 && posisi atas
Left = 60 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && di tengah
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------------
* Kelompok TextBox Bapak
*-------------------------------------
DEFINE CLASS mytxtKodeBapak As TextBox
Top = 60 && posisi atas
Left = 70 && posisi kiri
Width = 60 && lebar label
Height = 22 && tinggi label
Alignment = 0 && di kiri textbox
Enabled = .F. && non-aktif
Format = "999" && bentuk tampilan
InputMask = "999" && bentuk masukan
ForeColor = RGB(0,0,255) && warna huruf
DisabledBackColor = RGB(128,255,255) && warna dasar
DisabledForeColor = RGB(255,0,0) && warna depan
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------------
DEFINE CLASS myTxtNoRecBapak As TextBox
Top = 60 && posisi atas
Left = 230 && posisi kiri
Width = 60 && lebar label
Height = 22 && tinggi label
Alignment = 2 && di kiri textbox
Enabled = .F. && non-aktif
Format = "999999" && bentuk tampilan
InputMask = "999999" && bentuk masukan
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,255) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
TabStop = .F. && tidak bisa di-tab
Visible = .T. && tampak di layar monitor
ENDDEFINE
*---------------------------------------
DEFINE CLASS myTxtTotRecBapak As TextBox
Top = 60 && posisi atas
Left = 300 && posisi kiri
Width = 60 && lebar label
Height = 22 && tinggi label
Alignment = 2 && di kiri textbox
Enabled = .F. && non-aktif
Format = "999999" && bentuk tampilan
InputMask = "999999" && bentuk masukan
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,255) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
TabStop = .F. && tidak bisa di-tab

117
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------------
DEFINE CLASS myTxtNamaBapak As TextBox
Top = 85 && posisi atas
Left = 70 && posisi kiri
Width = 290 && lebar text box
Height = 22 && tinggi text box
MaxLength = 30 && isian maksimum
Enabled = .F. && non-aktif
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,255) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
ENDDEFINE
*----------------------------------
* Kelompok Grid Bapak
*----------------------------------
DEFINE CLASS myGrdGridBapak As Grid
Top = 115 && posisi atas
Left = 20 && posisi kiri
Width = 350 && lebar grid
Height = 121 && tinggi grid
ColumnCount = 2 && jumlah kolom
DeleteMark = .F. && tidak bisa dihapus
ReadOnly = .T. && tidak bisa diedit
RecordSource = "Bapak" && sumber tabel Bapak
RecordSourceType = 1 && alias
SplitBar = .F. && tidak bisa displit
Column1.Name = "Column1" && nama kolom 1
Column2.Name = "Column2" && nama kolom 2
Visible = .T. && tampak di layar monitor
PROCEDURE AfterRowColChange && aktif jika ada perubahan
* parameter ini harus ada, tidak digunakan
LPARAMETERS nColIndex
RefreshAnakTmp() && aktifkan RefreshAnakTmp()
TampilkanAnak() && aktifkan TampilkanAnak()
TampilkanBapak() && aktifkan TampilkanBapak()
ENDPROC
ENDDEFINE
*-------------------------------------
* Kelompok CommandButton Bapak
*-------------------------------------
DEFINE CLASS myCmdTop As CommandButton
Top = 240 && posisi atas
Left = 20 && posisi kiri
Width = 25 && lebar button
Height = 25 && tinggi button
Caption = "|<" && isi button
ToolTipText = "Record Awal" && tips kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiBapak()
NavigasiBapak("FIRST")
ENDPROC
ENDDEFINE
*--------------------------------------
DEFINE CLASS myCmdPrev As CommandButton
Top = _Screen.cmdTop.Top && posisi atas
Left = _Screen.cmdTop.Left + ;

118
_Screen.cmdTop.Width && posisi kiri
Height = _Screen.cmdTop.Height && tinggi button
Width = _Screen.cmdTop.Width && lebar button
Caption = "<" && isi button
ToolTipText = "Record Sebelumnya" && tips kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiBapak()
NavigasiBapak("PREV")
ENDPROC
ENDDEFINE
*--------------------------------------
DEFINE CLASS myCmdNext As CommandButton
Top = _Screen.cmdPrev.Top && posisi atas
Left = _Screen.cmdPrev.Left + ;
_Screen.cmdPrev.Width && posisi kiri
Height = _Screen.cmdPrev.Height && tinggi button
Width = _Screen.cmdPrev.Width && lebar button
Caption = ">" && isi button
ToolTipText = "Record Berikutnya" && tips kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiBapak()
NavigasiBapak("NEXT")
ENDPROC
ENDDEFINE
*----------------------------------------
DEFINE CLASS myCmdBottom As CommandButton
Top = _Screen.cmdNext.Top && posisi atas
Left = _Screen.cmdNext.Left + ;
_Screen.cmdNext.Width && posisi kiri
Height = _Screen.cmdNext.Height && tinggi button
Width = _Screen.cmdNext.Width && lebar button
Caption = ">|" && isi button
ToolTipText = "Record Akhir" && tips kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiBapak()
NavigasiBapak("LAST")
ENDPROC
ENDDEFINE
*-------------------------------------
DEFINE CLASS myCmdAdd As CommandButton
Top = _Screen.cmdBottom.Top && posisi atas
Left = _Screen.cmdBottom.Left + ;
_Screen.cmdBottom.Width && posisi kiri
Width = _Screen.cmdBottom.Width + 25 && lebar button
Height = _Screen.cmdBottom.Height && tinggi button
Caption = "Add" && isi button
ToolTipText = "Tambah Data" && tips kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
LOCAL nRecPos
SELECT Bapak && aktifkan tabel Bapak
* jika jumlah record sudah maksimum, maka:
IF RECCOUNT() >= nMaxRec
TampilkanRecordMax() && tampilkan pesan
ELSE
WITH _Screen && menatur _SCREEN
DO CASE
CASE .cmdAdd.Caption = "Add" && button ADD

119
* aktifkan prosedur ButtonBapak()
ButtonBapak(.F.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.F.)
* mengatur grid
.grdGridBapak.Enabled = .F. && non-aktif
.grdGridAnak.Enabled = .F. && non-aktif
* mengatur button
.cmdAdd.Enabled = .T. && button non-aktif
.cmdEdit.Enabled = .T. && button non-aktif
* mengatur button
.cmdAdd.Caption = "Save" && button Add
.cmdEdit.Caption = "Cancel" && button Edit
* mengatur field
.txtKodeBapak.Value = "" && dikosongkan
.txtNamaBapak.Value = "" && dikosongkan
* mengatur field
.txtKodeBapak.Enabled = .T. && non-aktif
.txtNamaBapak.Enabled = .T. && non-aktif
* kursor fokus di field txtKodeBapak
.txtKodeBapak.SETFOCUS
CASE .cmdAdd.Caption = "Save" && button SAVE
* jika txtKodeBapak kosong
IF EMPTY(.txtKodeBapak.Value)
TampilkanKodeKosong() && tampil pesan
* kursos fokus di field txtKodeBapak
.txtKodeBapak.SetFocus
ELSE && jika txtKodeBapak isi
nRecPos = RECNO() && posisi record
LOCATE FOR Kode = .txtKodeBapak.Value
IF FOUND()
TampilkanKodeSama() && pesan
GO nRecPos && record nRecPos
* kursos fokus di txtKodeBapak
.txtKodeBapak.SetFocus
ELSE
APPEND BLANK && tambah satu record
* simpan data
REPLACE Bapak.Kode ;
WITH .txtKodeBapak.Value
REPLACE Bapak.Nama ;
WITH .txtNamaBapak.Value
FLUSH && pastikan data disimpan
GO BOTTOM && menuju akhir record
* aktifkan prosedur BapakRefresh()
BapakRefresh()
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button
.cmdAdd.Caption = "Add"
.cmdEdit.Caption = "Edit"
* mengatur textbox
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbox
.txtKodeBapak.Enabled = .F.
.txtNamaBapak.Enabled = .F.
*
.grdGridAnak.Enabled = .T.

120
.grdGridBapak.Enabled = .T.
.grdGridBapak.Refresh && direfresh
ENDIF
ENDIF
ENDCASE
ENDWITH
ENDIF
ENDPROC
ENDDEFINE
*--------------------------------------
DEFINE CLASS myCmdEdit As CommandButton
Top = _Screen.cmdAdd.Top && posisi atas
Left = _Screen.cmdAdd.Left + ;
_Screen.cmdAdd.Width && posisi kiri
Height = _Screen.cmdAdd.Height && tinggi button
Width = _Screen.cmdAdd.Width && lebar button
Caption = "Edit" && isi button
ToolTipText = "Ubah Data" && keterangan pendek
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
SELECT Bapak && aktifkan tabel Bapak
IF RECCOUNT() = 0 && jika file kosong, maka:
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi
* mengatur _SCREEN
WITH _Screen
DO CASE
CASE .cmdEdit.Caption = "Edit" && Edit
* aktifkan prosedur ButtonBapak()
ButtonBapak(.F.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.F.)
* mengatur grid
.grdGridBapak.Enabled = .F. && non-aktif
.grdGridAnak.Enabled = .F. && non-aktif
* mengatur button
.cmdEdit.Enabled = .T. && non-aktif
.cmdDel.Enabled = .T. && non-aktiif
* mengatur button
.cmdEdit.Caption = "Save"
.cmdDel.Caption = "Cancel"
* mengatur textbox
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbox
.txtKodeBapak.Enabled = .T. && non-aktif
.txtNamaBapak.Enabled = .T. && non-aktif
* kursor fokus di field txtKodeBapak
.txtKodeBapak.SETFOCUS
CASE .cmdEdit.Caption = "Save" && button Save
* simpan data
REPLACE Bapak.Kode WITH .txtKodeBapak.Value
REPLACE Bapak.Nama WITH .txtNamaBapak.Value
FLUSH && pastikan data disimpan
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button
.cmdEdit.Caption = "Edit"
.cmdDel.Caption = "Del"

121
* mengatur textbox
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbot
.txtKodeBapak.Enabled = .F. && non-aktif
.txtNamaBapak.Enabled = .F. && non-aktif
* mengatur grid
.grdGridAnak.Enabled = .T. && aktif
.grdGridBapak.Enabled = .T. && aktif
.grdGridBapak.Refresh && direfresh
OTHERWISE && lainnya
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button
.cmdAdd.Caption = "Add"
.cmdEdit.Caption = "Edit"
.cmdDel.Caption = "Del"
* mengatur textbox
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbox
.txtKodeBapak.Enabled = .F. && non-aktif
.txtNamaBapak.Enabled = .F. && non-aktif
* mengatur grid
.grdGridAnak.Enabled = .T. && aktif
.grdGridBapak.Enabled = .T. && aktif
.grdGridBapak.Refresh && direfresh
ENDCASE
ENDWITH
ENDIF
ENDPROC
ENDDEFINE
*-------------------------------------
DEFINE CLASS myCmdDel As CommandButton
Top = _Screen.cmdEdit.Top && posisi atas
Left = _Screen.cmdEdit.Left + ;
_Screen.cmdEdit.Width && posisi kiri
Height = _Screen.cmdEdit.Height && tinggi button
Width = _Screen.cmdEdit.Width && lebar button
Caption = "Del" && isi button
ToolTipText = "Hapus Data" && keterangan pendek
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
SELECT Bapak && aktifkan tabel Bapak
IF RECCOUNT() = 0 && jika file kosong
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi
* mengatur _SCREEN
WITH _Screen
DO CASE
CASE .cmdDel.Caption = "Del" && button Del
* tampilkan pilihan, YES atau NO
IF MESSAGEBOX("Anda ingin menghapus record?",;
4+32+256,"Konfirmasi")=6 && YES
SELECT Bapak && aktifkan tabel Bapak
xRecPos = RECNO() && posisi record
DELETE && hapus record
PACK && pastikan record dihapus
* jika file kosong

122
IF RECCOUNT() = 0
TampilkanFileKosong() && pesan
ELSE
* jika record posisi > jumlah record
IF xRecPos > RECCOUNT()
GO BOTTOM && record akhir
ELSE
GO xRecPos && record posisi
ENDIF
.grdGridBapak.RecordSource="Bapak"
.grdGridBapak.RecordSourceType = 1
.grdGridBapak.ColumnCount = 2
.grdGridBapak.Column1.Width = 50
.grdGridBapak.Column2.Width = 300
.grdGridBapak.Column1.Header1.Caption=;
"KODE"
.grdGridBapak.Column2.Header1.Caption=;
"NAMA"
* mengatur textbox
.txtNoRecBapak.Value = RECNO()
.txtTotRecBapak.Value = RECCOUNT()
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbox
.txtKodeBapak.Enabled = .F.
.txtNamaBapak.Enabled = .F.
* mengatur grid
.grdGridBapak.Enabled = .T.
* filter data tabel Anak ke dalam
* tabel AnakTmp
* perintah SQL
SELECT * FROM Anak ;
INTO TABLE AnakTmp ;
WHERE Kode = Bapak.Kode
* mengatur grid
.grdGridAnak.RecordSource = "AnakTmp"
.grdGridAnak.RecordSourceType = 1
.grdGridAnak.ColumnCount = 3
.grdGridAnak.Column1.Width = 50
.grdGridAnak.Column2.Width = 70
.grdGridAnak.Column3.Width = 300
.grdGridAnak.Column1.Header1.Caption=;
"KODE"
.grdGridAnak.Column2.Header1.Caption=;
"KD.ANAK"
.grdGridAnak.Column3.Header1.Caption=;
"NAMA ANAK"
* mengatur grid
.grdGridBapak.Refresh && direfresh
.grdGridAnak.Refresh && direfresh
* mengatur textbox
.txtKodeAnak.Value = AnakTmp.Kode
.txtNomorAnak.Value = AnakTmp.KdAnak
.txtNamaAnak.Value = AnakTmp.NmAnak
ENDIF
ENDIF
OTHERWISE
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonBapak()
ButtonAnak(.T.)

123
* mengatur textbox
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
* mengatur textbox
.txtKodeBapak.Enabled = .F. && non-aktif
.txtNamaBapak.Enabled = .F. && non-aktif
* mengatur button
.cmdEdit.Caption = "Edit" && button Edit
.cmdDel.Caption = "Del" && button Del
* mengatur grid
.grdGridAnak.Enabled = .T. && aktif
.grdGridBapak.Enabled = .T. && aktif
.grdGridBapak.Refresh && direfresh
ENDCASE
ENDWITH
ENDIF
ENDPROC
ENDDEFINE
*---------------------------------------
DEFINE CLASS myCmdAbout As CommandButton
Top = _Screen.cmdDel.Top && posisi atas
Left = _Screen.cmdDel.Left + ;
_Screen.cmdDel.Width && posisi kiri
Height = _Screen.cmdDel.Height && tinggi button
Width = _Screen.cmdDel.Width && lebar button
Caption = "About" && isi button
ToolTipText = "Tentang Program" && tips kecil
Visible = .T. && tampak di layar monitor
* prosedur jika button diklik
PROCEDURE Click
* tampilkan pesan
MESSAGEBOX("Program ini disumbangkan kepada"+;
CHR(13)+"komunitas programer di Indonesia."+;
CHR(13)+"Semoga bermanfaat.....",0,"About")
ENDPROC
ENDDEFINE
*---------------------------------------
DEFINE CLASS myCmdClose As CommandButton
Top = _Screen.cmdAbout.Top && posisi atas
Left = _Screen.cmdAbout.Left + ;
_Screen.cmdAbout.Width && posisi kiri
Height = _Screen.cmdAbout.Height && tinggi button
Width = _Screen.cmdAbout.Width && lebar button
Caption = "Close" && isi button
Cancel = .T. && aktif jika tombol ESC ditekan
ToolTipText = "Selesai, kembali ke Windows" && tips
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
Stop() && aktifkan prosedur Stop()
ENDPROC
ENDDEFINE
*****************
* KELOMPOK ANAK *
*****************
*--------------------------------
* Kelompok Label Anak
*--------------------------------
DEFINE CLASS myJudulAnak As Label
Top = 280 && posisi atas
Left = 24 && posisi kiri
Width = 108 && lebar label

124
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
ForeColor = RGB(255,0,0) && warna huruf
Caption = "CHILD TABLE" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------
DEFINE CLASS myKodeAnak As Label
Top = 305 && posisi atas
Left = 24 && posisi kiri
Width = 36 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Kode" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------
DEFINE CLASS myNoRecAnak As Label
Top = 305 && posisi atas
Left = 168 && posisi kiri
Width = 48 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Rec.No." && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------
DEFINE CLASS myNomorAnak As Label
Top = 330 && posisi atas
Left = 24 && posisi kiri
Width = 36 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "No." && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------
DEFINE CLASS myTabelCucu As Label
Top = 330 && posisi atas
Left = 168 && posisi kiri
Width = 150 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "Pengelolaan Tabel Cucu" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------
DEFINE CLASS myNamaAnak As Label
Top = 355 && posisi atas
Left = 24 && posisi kiri
Width = 36 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Caption = "MtKul." && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------
* Kelompok Titik Anak
*------------------------------
DEFINE CLASS myTitik04 As Label
Top = 305 && posisi atas

125
Left = 60 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && isi di tengah label
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------
DEFINE CLASS myTitik05 As Label
Top = 305 && posisi atas
Left = 216 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && isi di tengah label
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------
DEFINE CLASS myTitik06 As Label
Top = 330 && posisi atas
Left = 60 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && isi di tengah label
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-----------------------------
DEFINE CLASS myTitik07 As Label
Top = 355 && posisi atas
Left = 60 && posisi kiri
Width = 12 && lebar label
Height = 22 && tinggi label
FontBold = .T. && huruf tebal
Alignment = 2 && isi di tengah label
Caption = ":" && isi label
Visible = .T. && tampak di layar monitor
ENDDEFINE
*------------------------------------
* Kelompok TextBox Anak
*------------------------------------
DEFINE CLASS myTxtKodeAnak As TextBox
Top = 305 && posisi atas
Left = 70 && posisi kiri
Width = 60 && lebar textbox
Height = 22 && tinggi textbox
Alignment = 0 && isi di kiri textbox
Enabled = .F. && di-non-aktifkan
Format = "999" && format tampilan
InputMask = "999" && input tampilan
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,128) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
ENDDEFINE
*-------------------------------------
DEFINE CLASS myTxtNoRecAnak As TextBox

126
Top = 305 && posisi atas
Left = 230 && posisi kiri
Width = 60 && lebar textbox
Height = 22 && tinggi textbox
Alignment = 2 && isi di kanan textbox
Enabled = .F. && di-non-aktifkan
Format = "999999" && format tampilan
InputMask = "999999" && input tampilan
TabStop = .F. && tidak bisa ditab
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,128) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------------
DEFINE CLASS myTxtTotRecAnak As TextBox
Top = 305 && posisi atas
Left = 300 && posisi kiri
Width = 60 && lebar textbox
Height = 22 && tinggi textbox
Alignment = 2 && isi di kanan textbox
Enabled = .F. && di-non-aktifkan
Format = "999999" && format tampilan
InputMask = "999999" && input tampilan
TabStop = .F. && tidak bisa ditab
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,128) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
ENDDEFINE
*--------------------------------------
DEFINE CLASS myTxtNomorAnak As ComboBox
Top = 330 && posisi atas
Left = 70 && posisi kiri
Width = 60 && lebar textbox
Height = 22 && tinggi textbox
Alignment = 0 && isi di kiri textbox
Enabled = .F. && di-non-aktifkan
Format = "" && format tampilan
InputMask = "" && input tampilan
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,128) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
* aktif jika terjadi perubahan
PROCEDURE InteractiveChange
* isi field Nama tabel Cucu.dbf
_Screen.TxtNamaAnak.Value = Cucu.NmCucu
ENDPROC
ENDDEFINE
*------------------------------------
DEFINE CLASS myTxtNamaAnak As TextBox
Top = 355 && posisi atas
Left = 70 && posisi kiri
Width = 290 && lebar textbox
Height = 22 && tinggi textbox
Alignment = 0 && isi di kiri textbox
Enabled = .F. && di-non-aktifkan

127
Format = "" && format tampilan
InputMask = "" && input tampilan
MaxLength = 35 && panjang maksimum
ForeColor = RGB(0,0,255) && warna huruf
BackColor = RGB(255,255,255) && warna dasar
DisabledBackColor = RGB(128,255,128) && warna non-aktif
DisabledForeColor = RGB(255,0,0) && warna non-aktif
Visible = .T. && tampak di layar monitor
ENDDEFINE
*---------------------------------
* Kelompok Grid Anak
*---------------------------------
DEFINE CLASS myGrdGridAnak As Grid
Top = 385 && posisi atas
Left = 20 && posisi kiri
Width = 350 && lebar textbox
Height = 175 && tinggi textbox
ColumnCount = 3 && jumlah kolom
DeleteMark = .F. && tidk bisa dihapus
ReadOnly = .T. && cuma bisa dibaca
RecordSource = "AnakTmp" && tabel AnakTmp.dbf
RecordSourceType = 1 && alias
SplitBar = .F. && tidak ada splitbar
TabStop = .F. && tidak ada tabstop
Column1.Name = "Column1" && nama kolom 1
Column2.Name = "Column2" && nama kolom 2
Column3.Name = "Column3" && nama kolom 3
Visible = .T. && tampak di layar monitor
PROCEDURE AfterRowColChange && jika terjadi perubahan
* parameter ini harus ada, tidak digunakan
LPARAMETERS nColIndex
* aktifkan prosedur TampilkanAnak()
TampilkanAnak()
ENDPROC
ENDDEFINE
*--------------------------------------
* Kelompok CommandButton Anak
*--------------------------------------
DEFINE CLASS myCmdCucu As CommandButton
Top = 330 && posisi atas
Left = 130 && posisi kiri
Width = 30 && lebar button
Height = 22 && tinggi button
Caption = "..." && isi button
ToolTipText = "Pengelolaan Tabel Cucu" && tip kecil
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
oKusForm = CREATEOBJECT("myFrmKusForm") && buat form
oKusForm.Show && tampilkan form
READ EVENTS && aktifkan semua event
ENDPROC
ENDDEFINE
*-----------------------------------------
DEFINE CLASS myCmdTopAnak As CommandButton
Top = 565 && posisi atas
Left = 20 && posisi kiri
Width = 25 && lebar button
Height = 25 && tinggi button
Caption = "|<" && isi button
ToolTipText = "Record Awal" && tip kecil
Visible = .T. && tampak di layar monitor

128
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiAnak()
NavigasiAnak("FIRST")
ENDPROC
ENDDEFINE
*------------------------------------------
DEFINE CLASS myCmdPrevAnak As CommandButton
Top = _Screen.cmdTopAnak.Top && posisi atas
Left = _Screen.cmdTopAnak.Left + ;
_Screen.cmdTopAnak.Width && posisi kiri
Width = _Screen.cmdTopAnak.Width && lebar button
Height = _Screen.cmdTopAnak.Height && tinggi button
Caption = "<" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiAnak()
NavigasiAnak("PREV")
ENDPROC
ENDDEFINE
*------------------------------------------
DEFINE CLASS myCmdNextAnak As CommandButton
Top = _Screen.cmdPrevAnak.Top && posisi atas
Left = _Screen.cmdPrevAnak.Left + ;
_Screen.cmdPrevAnak.Width && posisi kiri
Width = _Screen.cmdPrevAnak.Width && lebar button
Height = _Screen.cmdPrevAnak.Height && tinggi button
Caption = ">" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiAnak()
NavigasiAnak("NEXT")
ENDPROC
ENDDEFINE
*--------------------------------------------
DEFINE CLASS myCmdBottomAnak As CommandButton
Top = _Screen.cmdNextAnak.Top && posisi atas
Left = _Screen.cmdNextAnak.Left + ;
_Screen.cmdNextAnak.Width && posisi kiri
Width = _Screen.cmdNextAnak.Width && lebar button
Height = _Screen.cmdNextAnak.Height && tinggi button
Caption = ">|" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* aktifkan prosedur NavigasiAnak()
NavigasiAnak("LAST")
ENDPROC
ENDDEFINE
*-----------------------------------------
DEFINE CLASS myCmdAddAnak As CommandButton
Top = _Screen.cmdBottomAnak.Top && posisi atas
Left = _Screen.cmdBottomAnak.Left + ;
_Screen.cmdBottomAnak.Width && posisi kiri
Width = _Screen.cmdBottomAnak.Width + 25 && lebar
Height = _Screen.cmdBottomAnak.Height && tinggi button
Caption = "Add" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* variabel lokal
LOCAL xKodeAnak, xNomorAnak, xNamaAnak
SELECT AnakTmp && aktifkan tabel AnakTmp
* jika jumlah record sudah maksimum, maka:

129
IF RECCOUNT() >= nMaxRec
* Tampilkan pesan
TampilkanRecordMax()
ELSE
* mengatur form _Screen
WITH _Screen
DO CASE
CASE .cmdAddAnak.Caption = "Add" && Add
* aktifkan prosedur ButtonBapak()
ButtonBapak(.F.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.F.)
.grdGridBapak.Enabled = .F. && non-aktif
.grdGridAnak.Enabled = .F. && non-aktif
.cmdAddAnak.Enabled = .T. && aktif
.cmdEditAnak.Enabled = .T. && aktif
.cmdAddAnak.Caption = "Save"
.cmdEditAnak.Caption = "Cancel"
.txtKodeAnak.Value = .txtKodeBapak.Value
.txtNomorAnak.Value = "" && textbox
.txtNamaAnak.Value = "" && textbox
.txtNomorAnak.Enabled = .T. && aktif
.txtNamaAnak.Enabled = .T. && aktif
* kursor berada di filed Nomor
.txtNomorAnak.Setfocus
CASE .cmdAddAnak.Caption = "Save" && Save
* variabel sementara
xKodeAnak = .txtKodeAnak.Value
xNomorAnak = .txtNomorAnak.Value
xNamaAnak = .txtNamaAnak.Value
* perintah SQL-tambah data tabel Anak.dbf
INSERT INTO Anak (Kode, KdAnak, NmAnak) ;
VALUES (xKodeAnak, xNomorAnak, xNamaAnak)
SELECT AnakTmp && tabel AnakTmp.dbf
APPEND BLANK && tambahkan satu record
* isi dengan variabel berikut ini
REPLACE AnakTmp.Kode ;
WITH .txtKodeAnak.Value && simpan data
REPLACE AnakTmp.KdAnak ;
WITH .txtNomorAnak.Value &&simpan data
REPLACE AnakTmp.NmAnak ;
WITH .txtNamaAnak.Value && simpan data
GO BOTTOM && menuju record akhir
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button dan textbox
.cmdAddAnak.Caption = "Add"
.cmdEditAnak.Caption = "Edit"
.txtKodeAnak.Value = AnakTmp.Kode
.txtNomorAnak.Value = AnakTmp.KdAnak
.txtNamaAnak.Value = AnakTmp.NmAnak
.txtNomorAnak.Enabled = .F. && non-aktif
.txtNamaAnak.Enabled = .F. && non-aktif
.grdGridBapak.Enabled = .T. && aktif
.grdGridAnak.Enabled = .T. && aktif
.grdGridAnak.Refresh && grid direfresh
ENDCASE
ENDWITH
ENDIF

130
ENDPROC
ENDDEFINE
*------------------------------------------
DEFINE CLASS myCmdEditAnak As CommandButton
Top = _Screen.cmdAddAnak.Top && posisi atas
Left = _Screen.cmdAddAnak.Left + ;
_Screen.cmdAddAnak.Width && posisi kiri
Width = _Screen.cmdAddAnak.Width && lebar button
Height = _Screen.cmdAddAnak.Height && tinggi button
Caption = "Edit" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* variabel lokal
LOCAL xKodeAnak, xNomorAnak, xNamaAnak
SELECT AnakTmp && aktifkan tabel AnakTmp.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi, maka:
* mengatur form _Screen
WITH _Screen
DO CASE
CASE .cmdEditAnak.Caption = "Edit" && Edit
* aktifkan prosedur ButtonBapak()
ButtonBapak(.F.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.F.)
* mengatur grid
.grdGridBapak.Enabled = .F. && non-aktif
.grdGridAnak.Enabled = .F. && non-aktif
.cmdEditAnak.Enabled = .T. && aktif
.cmdDelAnak.Enabled = .T. && aktif
.cmdEditAnak.Caption = "Save"
.cmdDelAnak.Caption = "Cancel"
.txtKodeAnak.Value = AnakTmp.Kode
.txtNomorAnak.Value = AnakTmp.KdAnak
.txtNamaAnak.Value = AnakTmp.NmAnak
.txtKodeAnak.Enabled = .F. && non-aktif
.txtNomorAnak.Enabled = .T. && aktif
.txtNamaAnak.Enabled = .F. && aktif
* kursor berada di filed Nomor
.txtNomorAnak.Setfocus
CASE .cmdEditAnak.Caption = "Save" && Save
* variabel sementara
xKodeAnak = .txtKodeAnak.Value
xNomorAnak = .txtNomorAnak.Value
xNamaAnak = .txtNamaAnak.Value
* perintah SQL-update data tabel Anak.dbf
UPDATE Anak SET KdAnak = xNomorAnak, ;
NmAnak = xNamaAnak WHERE Kode = xKodeAnak
SELECT AnakTmp && tabel AnakTmp.dbf
REPLACE AnakTmp.KdAnak ;
WITH .txtNomorAnak.Value && simpan data
REPLACE AnakTmp.NmAnak ;
WITH .txtNamaAnak.Value && simpan data
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button dan textbox
.cmdEditAnak.Caption = "Edit"
.cmdDelAnak.Caption = "Del"

131
.txtKodeAnak.Value = AnakTmp.Kode
.txtNomorAnak.Value = AnakTmp.KdAnak
.txtNamaAnak.Value = AnakTmp.NmAnak
.txtKodeAnak.Enabled = .F. && non-aktif
.txtNomorAnak.Enabled = .F. && non-aktif
.txtNamaAnak.Enabled = .F. && non-aktif
.grdGridBapak.Enabled = .T. && grid aktif
.grdGridAnak.Enabled = .T. && grid aktif
.grdGridAnak.Refresh && grid direfresh
OTHERWISE
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button dan textbox
.cmdAddAnak.Caption = "Add"
.cmdEditAnak.Caption = "Edit"
.cmdDelAnak.Caption = "Del"
.txtKodeAnak.Value = AnakTmp.Kode
.txtNomorAnak.Value = AnakTmp.KdAnak
.txtNamaAnak.Value = AnakTmp.NmAnak
.txtKodeAnak.Enabled = .F. && non-aktif
.txtNomorAnak.Enabled = .F. && non-aktif
.txtNamaAnak.Enabled = .F. && non-aktif
.grdGridBapak.Enabled = .T. && grid aktif
.grdGridAnak.Enabled = .T. && grid aktif
.grdGridAnak.Refresh && grid direfresh
ENDCASE
ENDWITH
ENDIF
ENDPROC
ENDDEFINE
*-----------------------------------------
DEFINE CLASS myCmdDelAnak As CommandButton
Top = _Screen.cmdEditAnak.Top && posisi atas
Left = _Screen.cmdEditAnak.Left + ;
_Screen.cmdEditAnak.Width && posisi kiri
Width = _Screen.cmdEditAnak.Width && lebar button
Height = _Screen.cmdEditAnak.Height && tinggi button
Caption = "Del" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
SELECT AnakTmp && aktifkan tabel AnakTmp.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi, maka:
* mengatur form _Screen
WITH _Screen
DO CASE
CASE .cmdDelAnak.Caption = "Del" && button Del
* tampilkan pilihan YES atau NO
IF MESSAGEBOX("Anda ingin menghapus record?",;
4+32+256,"Konfirmasi") = 6 && pilih YES
xRecPos = RECNO() && posisi record
SELECT AnakTmp && aktifkan tabel AnakTmp
DELETE && hapus record
PACK && pastikan record dihapus
* jika file kosong, maka:
IF RECCOUNT() = 0
* Tampilkan pesan
TampilkanFileKosong()

132
ELSE && jika file isi, maka:
* jika posisi record > jumlah record
IF xRecPos > RECCOUNT()
GO BOTTOM && menuju record akhir
ELSE
GO xRecPos && menuju posisi record
ENDIF
ENDIF
* aktifkan prosedur TampilkanAnak()
TampilkanAnak()
* mengatur grid
.grdGridAnak.RecordSource = ;
"AnakTmp" && isi grid
.grdGridAnak.RecordSourceType=1
.grdGridAnak.ColumnCount = 3
.grdGridAnak.Column1.Width = 50
.grdGridAnak.Column2.Width = 50
.grdGridAnak.Column3.Width = 180
* judul kolom 1, 2 dan 3
.grdGridAnak.Column1.Header1.Caption=;
"KODE"
.grdGridAnak.Column2.Header1.Caption=;
"KD.ANAK"
.grdGridAnak.Column3.Header1.Caption=;
"NAMA ANAK"
.grdGridAnak.Refresh && direfresh
ENDIF
OTHERWISE
* aktifkan prosedur ButtonBapak()
ButtonBapak(.T.)
* aktifkan prosedur ButtonAnak()
ButtonAnak(.T.)
* mengatur button, textbox dan grid
.cmdEditAnak.Caption = "Edit"
.cmdDelAnak.Caption = "Del"
.txtKodeBapak.Value = Bapak.Kode
.txtNamaBapak.Value = Bapak.Nama
.txtNomorAnak.Enabled = .F. && non-aktif
.txtNamaAnak.Enabled = .F. && non-aktif
.grdGridBapak.Enabled = .T. && grid aktif
.grdGridAnak.Enabled = .T. && grid aktif
.grdGridAnak.Refresh && grid direfresh
ENDCASE
ENDWITH
ENDIF
ENDPROC
ENDDEFINE
*-------------------------------------------
DEFINE CLASS myCmdAboutAnak As CommandButton
Top = _Screen.cmdDelAnak.Top && posisi atas
Left = _Screen.cmdDelAnak.Left + ;
_Screen.cmdDelAnak.Width && posisi kiri
Width = _Screen.cmdDelAnak.Width && lebar button
Height = _Screen.cmdDelAnak.Height && tinggi button
Caption = "About" && isi button
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* tampilkan pesan
MESSAGEBOX("Program ini disumbangkan kepada"+;
CHR(13)+"komunitas programer di Indonesia."+;
CHR(13)+"Semoga bermanfaat.....",0,"About")

133
ENDPROC
ENDDEFINE
*--- definisi sub-class dari myCmdClose ---
*--- duplikasi dari cmdClose ---
DEFINE CLASS myCmdCloseAnak As myCmdClose
Top = _Screen.cmdAboutAnak.Top && posisi atas
Left = _Screen.cmdAboutAnak.Left + ;
_Screen.cmdAboutAnak.Width && posisi kiri
Width = _Screen.cmdAboutAnak.Width && lebar button
Height = _Screen.cmdAboutAnak.Height && tinggi button
Caption = "Close" && isi button
FontItalic = .T. && bentuk huruf miring
Visible = .T. && tampak di layar monitor
PROCEDURE Click && aktif jika button diklik
* :: ->Scope Resolution Operator
* aktifkan prosedur Click dari button myCmdClose
myCmdClose::Click
ENDPROC
ENDDEFINE
******************************
* Kelompok Prosedur-prosedur *
******************************
*--- prosedur Start() ---
PROCEDURE Start
CLOSE TABLES ALL && tutup semua tabel
* periksa, jika file Bapak.dbf tidak ada, maka:
IF NOT FILE("Bapak.dbf")
* buat file baru Bapak.dbf
CREATE TABLE Bapak( Kode C(3), Nama C(30) )
ENDIF
* periksa, jika file Anak.dbf tidak ada, maka:
IF NOT FILE("Anak.dbf")
* buat file baru Anak.dbf
CREATE TABLE Anak(Kode C(3),KdAnak C(3),NmAnak C(30))
ENDIF
* periksa, jika file Cucu.dbf tidak ada, maka:
IF NOT FILE("Cucu.dbf")
* buat file baru Cucu.dbf
CREATE TABLE Cucu( KdCucu C(3), NmCucu C(30))
ENDIF
CLOSE TABLES ALL && tutup semua tabel
USE Cucu ALIAS Cucu EXCLUSIVE IN 0 && tabel Cucu.dbf
USE Anak ALIAS Anak EXCLUSIVE IN 0 && tabel Anak.dbf
USE Bapak ALIAS Bapak EXCLUSIVE IN 0 && tabel Bapak.dbf
* perintah SQL, mengambil data dari tabel Anak.dbf
SELECT * FROM Anak INTO TABLE AnakTmp ;
WHERE Kode = Bapak.Kode && perintah SQL
* mengatur from _Screen
WITH _Screen
.Tanggal.Caption = TampilkanTanggal() && tanggal
.grdGridBapak.RecordSource = "Bapak" && Bapak.dbf
.grdGridBapak.RecordSourceType = 1 && alias
.grdGridBapak.ColumnCount = 2 && jumlah kolom
.grdGridBapak.Column1.Width = 50 && lebar kolom 1
.grdGridBapak.Column2.Width = 260 && lebar kolom 2
.grdGridBapak.Column1.Header1.Caption = "KODE"
.grdGridBapak.Column2.Header1.Caption = "NAMA"
.grdGridAnak.RecordSource = "AnakTmp" && AnakTmp.dbf
.grdGridAnak.RecordSourceType = 1 && alias
.grdGridAnak.ColumnCount = 3 && jumlah kolom
.grdGridAnak.Column1.Width = 50 && lebar kolom 1

134
.grdGridAnak.Column2.Width = 50 && lebar kolom 2
.grdGridAnak.Column3.Width = 210 && lebar kolom 3
.grdGridAnak.Column1.Header1.Caption = "KODE"
.grdGridAnak.Column2.Header1.Caption = "KD.ANAK"
.grdGridAnak.Column3.Header1.Caption = "NAMA ANAK"
.txtNomorAnak.RowSource = "Cucu" && tabel Cucu.dbf
.txtNomorAnak.RowSourceType = 2 && alias
.txtNomorAnak.ColumnCount = 2 && jumlah kolom
.txtNomorAnak.ColumnWidths = "50,200" && lebar kolom
.txtNomorAnak.DisplayCount = 10 && jumlah ditampilkan
.grdGridBapak.Refresh && grid direfresh
.grdGridAnak.Refresh && grid direfresh
ENDWITH
TampilkanAnak() && aktifkan prosedur TampilkanAnak()
TampilkanBapak() && aktifkan prosedur TampilkanBapak()
ENDPROC
*--- prosedur Stop() ---
PROCEDURE Stop
RefreshAnakTmp() && aktifkan prosedur RefreshAnakTmp()
SELECT Bapak && aktifkan tabel Bapak
* jika jumlah record maksimum, maka:
IF RECCOUNT() > nMaxRec
GO (nMaxRec+1) && menuju record nMaxRec + 1
DELETE NEXT RECCOUNT() && hapus beberapa record
PACK && pastikan record dihapus dari tabel
ENDIF
SELECT Cucu && aktifkan tabel Cucu
* jika jumlah record maksimum, maka:
IF RECCOUNT() > nMaxRec
GO (nMaxRec+1) && menuju record nMaxRec + 1
DELETE NEXT RECCOUNT() && hapus beberapa record
PACK && pastikan record dihapus dari tabel
ENDIF
* mengatur form _Screen
WITH _Screen
.grdGridBapak.RecordSource = "" && kosongkan
.grdGridAnak.RecordSource = "" && kosongkan
.txtNomorAnak.RowSource = "" && kosongkan
ENDWITH
CLOSE TABLES ALL && tutup semua tabel
DELETE FILE AnakTmp.DBF && hapus file AnakTmp.dbf
CLEAR EVENTS && hapus semua event
QUIT && selesai, keluar ke Windows
ENDPROC
*--- prosedur NavigasiBapak() ---
PROCEDURE NavigasiBapak
PARAMETERS xPar
SELECT Bapak && aktifkan tabel Bapak.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi, maka:
DO CASE
CASE xPar = "FIRST"
* jika posisi di awal record
IF RECNO() = 1
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju awal record
ENDIF
CASE xPar = "PREV"
* jika posisi di awal record

135
IF RECNO() = 1
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju record sebelumnya
ENDIF
CASE xPar = "NEXT"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju record berikutnya
ENDIF
CASE xPar = "LAST"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju akhir record
ENDIF
ENDCASE
RefreshAnakTmp() && aktifkan RefreshAnakTmp()
TampilkanAnak() && aktifkan TampilkanAnak()
TampilkanBapak() && aktifkan TampilkanBapak()
ENDIF
ENDPROC
*--- prosedur NavigasiAnak() ---
PROCEDURE NavigasiAnak
PARAMETERS xPar && menerima kiriman
SELECT AnakTmp && aktifkan tabel AnakTmp.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
TampilkanFileKosong() && tampilkan pesan
ELSE && jika file isi, maka:
DO CASE
CASE xPar = "FIRST"
* jika posisi di awal record
IF RECNO() = 1
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju awal record
ENDIF
CASE xPar = "PREV"
* jika posisi di awal record
IF RECNO() = 1
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju record sebelumnya
ENDIF
CASE xPar = "NEXT"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju record berikutnya
ENDIF
CASE xPar = "LAST"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju akhir record
ENDIF

136
ENDCASE
* aktifkan prosedur TampilkanAnak()
TampilkanAnak()
ENDIF
ENDPROC
*--- prosedur TampilkanBapak() ---
PROCEDURE TampilkanBapak
SELECT Bapak && aktifkan tabel Bapak.dbf
WITH _Screen
IF RECCOUNT() = 0
.txtNoRecBapak.Value = 0 && isi textbox NoRec
.txtTotRecBapak.Value = 0 && isi textbox TotRec
.txtKodeBapak.Value = "" && isi textbox Kode
.txtNamabapak.Value = "" && isi textbox Nama
ELSE
.txtNoRecBapak.Value = RECNO() && NoRec
.txtTotRecBapak.Value = RECCOUNT() && TotRec
.txtKodeBapak.Value = Bapak.Kode && Kode
.txtNamaBapak.Value = Bapak.Nama && Nama
ENDIF
.grdGridBapak.Refresh && grid direfresh
ENDWITH
ENDPROC
*--- prosedur TampilkanAnak() ---
PROCEDURE TampilkanAnak
SELECT AnakTmp && aktifkan tabel AnakTmp.dbf
* mengatur form _Screen
WITH _Screen
IF RECCOUNT() = 0 && jika file kosong, maka:
.txtNoRecAnak.Value = 0 && isi textbox NoRec
.txtTotRecAnak.Value = 0 && isi textbox TotRec
.txtKodeAnak.Value = "" && isi textbox Kode
.txtNomorAnak.Value = "" && isi textbox Nomor
.txtNamaAnak.Value = "" && isi textbox Nama
ELSE
.txtNoRecAnak.Value = RECNO() && NoRec
.txtTotRecAnak.Value = RECCOUNT() && TotRec
.txtKodeAnak.Value = AnakTmp.Kode && Kode
.txtNomorAnak.Value = AnakTmp.KdAnak && Nomor
.txtNamaAnak.Value = AnakTmp.NmAnak && Nama
ENDIF
.grdGridAnak.Refresh && grid direfresh
ENDWITH
ENDPROC
*--- prosedur BapakRefresh() ---
PROCEDURE BapakRefresh
SELECT Bapak && aktifkan tabel Bapak.dbf
N = RECCOUNT() && jumlah record
xUrut = .F. && variabel penanda (switching)
* proses pengurutan BUBBLE SORT
* untuk jumlah record 1.000 = 00:01:00
DO WHILE xUrut = .F.
xUrut = .T.
FOR I = 1 TO ( N - 1 )
GO I && menuju record I
xKode = Bapak.Kode && ambil nilai Kode
xNama = Bapak.Nama && ambil nilai Nama
GO ( I + 1 ) && menuju record (I+1)
yKode = Bapak.Kode && ambil nilai Kode
yNama = Bapak.Nama && ambil nilai Nama
IF xKode > yKode

137
GO I && menuju record I
REPLACE Bapak.Kode WITH yKode && simpan yKode
REPLACE Bapak.Nama WITH yNama && simpan yNama
GO ( I + 1 ) && menuju record (I+1)
REPLACE Bapak.Kode WITH xKode && simpan xKode
REPLACE Bapak.Nama WITH xNama && simpan xNama
xUrut = .F.
ENDIF
NEXT
ENDDO
ENDPROC
*--- prosedur RefreshAnakTmp() ---
PROCEDURE RefreshAnakTmp
* menghapus data dari tabel Anak
DELETE FROM Anak WHERE Kode=_Screen.txtKodeBapak.Value
* mengisi data ke tabel Anak dari tabel AnakTmp
INSERT INTO Anak (Kode, KdAnak, NmAnak) ;
SELECT Kode, KdAnak, NmAnak ;
FROM AnakTmp && perintah SQL
SELECT Anak && aktifkan tabel Anak
PACK && pastikan data terhapus dari tabel Anak
* memfilter tabel Anak ke dalam tabel AnakTmp
SELECT * FROM Anak INTO TABLE AnakTmp ;
WHERE Kode = Bapak.Kode ;
ORDER BY KdAnak && perintah SQL
SELECT AnakTmp && aktifkan tabel AnakTmp
* mengatur form _Screen
WITH _Screen
.txtKodeAnak.Value = AnakTmp.Kode && textbox Kode
.txtNomorAnak.Value = AnakTmp.KdAnak && textbox Nomor
.txtNamaAnak.Value = AnakTmp.NmAnak && textbox Nama
* memperbaiki grid grdGridAnak
.grdGridAnak.RecordSource = "AnakTmp" && AnakTmp
.grdGridAnak.RecordSourceType = 1 && alias
.grdGridAnak.ColumnCount = 3 && jumlah kolom
.grdGridAnak.Column1.Width = 50 && lebar kolom 1
.grdGridAnak.Column2.Width = 70 && lebar kolom 2
.grdGridAnak.Column3.Width = 300 && lebar kolom 3
.grdGridAnak.Column1.Header1.Caption = "KODE"
.grdGridAnak.Column2.Header1.Caption = "KD.ANAK"
.grdGridAnak.Column3.Header1.Caption = "NAMA ANAK"
.grdGridAnak.Refresh && grid direfresh
ENDWITH
TampilkanAnak() && aktifkan prosedur TampilkanAnak()
ENDPROC
*--- prosedur ButtonBapak() ---
PROCEDURE ButtonBapak
PARAMETERS xPar && menerima variabel True/False
* mengatur Button True/False
WITH _Screen
.cmdTop.Enabled = xPar && button ON/OFF
.cmdPrev.Enabled = xPar && button ON/OFF
.cmdNext.Enabled = xPar && button ON/OFF
.cmdBottom.Enabled = xPar && button ON/OFF
.cmdAdd.Enabled = xPar && button ON/OFF
.cmdEdit.Enabled = xPar && button ON/OFF
.cmdDel.Enabled = xPar && button ON/OFF
.cmdAbout.Enabled = xPar && button ON/OFF
.cmdClose.Enabled = xPar && button ON/OFF
ENDWITH
ENDPROC

138
*--- prosedur ButtonAnak() ---
PROCEDURE ButtonAnak
PARAMETERS xPar && menerima variabel True/False
* mengatur Button True/False
WITH _Screen
.cmdCucu.Enabled = xPar
.cmdTopAnak.Enabled = xPar && button ON/OFF
.cmdPrevAnak.Enabled = xPar && button ON/OFF
.cmdNextAnak.Enabled = xPar && button ON/OFF
.cmdBottomAnak.Enabled = xPar && button ON/OFF
.cmdAddAnak.Enabled = xPar && button ON/OFF
.cmdEditAnak.Enabled = xPar && button ON/OFF
.cmdDelAnak.Enabled = xPar && button ON/OFF
.cmdAboutAnak.Enabled = xPar && button ON/OFF
.cmdCloseAnak.Enabled = xPar && button ON/OFF
ENDWITH
ENDPROC
**************************************
* mendefinisikan form 'myFrmKusForm' *
**************************************
DEFINE CLASS myFrmKusForm AS form
Name = "frmKusForm" && nama form
Caption = "Tabel Cucu" && judul form
Top = 0 && posisi atas
Left = 0 && posisi kiri
Width = 370 && lebar form
Height = 250 && tinggi form
BorderStyle = 2 && border style
BackColor = RGB(236,233,216) && warna dasar
AutoCenter = .T. && form di tengah
ControlBox = .F. && button controbox dihilangkan
Closable = .F. && button close dihilangkan
Movable = .T. && bisa dipindahkan
MinButton = .F. && tombol minimum non-aktif
MaxButton = .F. && tombol maksimum non-aktif
ShowTips = .T. && tampilkan tips pendek
WindowType = 1 && window type
*****************************************************
* mengisi objek ke dalam form dengan cara yang lain *
* mengisi objek beserta atributnya ke dalam form *
*****************************************************
*--- definisi timer myWaktu ---*
ADD OBJECT myWaktu AS Timer WITH ;
Top = 0, ;
Left = 0, ;
Name = "Waktu", ;
Interval = 1000
*--- tambahkan label myJudul ---
ADD OBJECT lblMyJudul AS Label WITH ;
Caption = "TABEL CUCU", ;
FontName = "Arial", ;
FontBold = .T., ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 10, ;
Top = 10, ;
Width = 100, ;
Height = 22, ;
Visible = .T.
*--- definisi label myTanggal ---*
ADD OBJECT myTanggal AS Label WITH ;

139
Top = 10, ;
Left = 100, ;
Width = 185, ;
Height = 20, ;
Caption = "", ;
FontName = "Arial", ;
Name = "Tanggal", ;
Alignment = 1, ;
Visible = .T.
*--- definisi label myJam ---*
ADD OBJECT myJam AS Label WITH ;
Top = 10, ;
Left = 290, ;
Width = 50, ;
Height = 20, ;
Caption = TIME(), ;
FontName = "Arial", ;
Name = "Jam", ;
Alignment = 1, ;
Visible = .T.
*--- tambahkan label myNoRec ---
ADD OBJECT lblMyNoRec AS Label WITH ;
Caption = "No.Rec.:", ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 175, ;
Top = 35, ;
Width = 70, ;
Height = 20, ;
Visible = .T.
*--- tambahkan textbox myNoRec ---
ADD OBJECT txtMyNoRec AS TextBox WITH ;
Name = "txtNoRec", ;
Value = 0, ;
FontName = "Arial", ;
FontSize = 9, ;
DisabledForeColor = RGB(255,0,0), ;
DisabledBackColor = RGB(224,224,224), ;
Enabled = .F., ;
Left = 235, ;
Top = 35, ;
Width = 50, ;
Height = 24, ;
MaxLength = 5, ;
Visible = .T.
*--- tambahkan textbox myTotRec ---
ADD OBJECT txtMyTotRec AS TextBox WITH ;
Name = "txtTotRec", ;
Value = 0, ;
FontName = "Arial", ;
FontSize = 9, ;
DisabledForeColor = RGB(255,0,0), ;
DisabledBackColor = RGB(224,224,224), ;
Enabled = .F., ;
Left = 290, ;
Top = 35, ;
Width = 50, ;
Height = 24, ;
MaxLength = 5, ;
Visible = .T.

140
*--- tambahkan label myKodeCucu ---
ADD OBJECT lblMyKodeCucu AS Label WITH ;
Caption = "1. Kode", ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 10, ;
Top = 35, ;
Width = 50, ;
Height = 20, ;
Visible = .T.
*--- tambahkan label myNamaCucu ---
ADD OBJECT lblMyNamaCucu AS Label WITH ;
Caption = "2. Nama", ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 10, ;
Top = 60, ;
Width = 50, ;
Height = 20
Visible = .T.
*--- tambahkan label myTitik01 ---
ADD OBJECT lblMyTitik01 AS Label WITH ;
Caption = ":", ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 60, ;
Top = 35, ;
Width = 10, ;
Height = 20, ;
Visible = .T.
*--- tambahkan label myTitik02 ---
ADD OBJECT lblMyTitik02 AS Label WITH ;
Caption = ":", ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = RGB(0,0,0), ;
Left = 60, ;
Top = 60, ;
Width = 10, ;
Height = 20, ;
Visible = .T.
*--- tambahkan textbox txtMyKodeCucu ---
ADD OBJECT txtMyKodeCucu AS TextBox WITH ;
Name = "txtKodeCucu", ;
Value = "", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,255), ;
DisabledForeColor = RGB(0,0,255), ;
DisabledBackColor = RGB(224,224,224), ;
Left = 70, ;
Top = 35, ;
Width = 60, ;
Height = 24, ;
InputMask = "999", ;
Format = "999", ;
Visible = .T.
*--- tambahkan textbox txtMyNamaCucu ---

141
ADD OBJECT txtMyNamaCucu AS TextBox WITH ;
Name = "txtNamaCucu", ;
Value = "", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,255), ;
DisabledForeColor = RGB(0,0,255), ;
DisabledBackColor = RGB(224,224,224), ;
Left = 70, ;
Top = 60, ;
Width = 270, ;
Height = 24, ;
MaxLength = 30, ;
Visible = .T.
*--- tambahkan grid grdMyGrid ---
ADD OBJECT grdMyGrid AS grid WITH ;
Name = "grdGrid", ;
Top = 85, ;
Left = 10, ;
Width = 350, ;
Height = 130, ;
ColumnCount = 2, ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,255), ;
HighlightStyle = 2, ;
HighlightForeColor = RGB(0,0,255), ;
HighlightBackColor = RGB(224,224,224), ;
SelectedItemForeColor = RGB(0,0,0), ;
SelectedItemBackColor = RGB(128,255,128), ;
RecordSource = "Cucu", ;
RecordSourceType = 1, ;
AllowAutoColumnFit = 2, ;
AllowHeaderSizing = .F., ;
DeleteMark = .F., ;
ReadOnly = .T., ;
TabStop = .F., ;
SplitBar = .F., ;
Visible = .T.
*--- tambahkan command button cmdMyFisrt ---
ADD OBJECT cmdMyFIRST AS COMMANDBUTTON WITH ;
Top = 215, ;
Left = 10, ;
Width = 25, ;
Height = 25, ;
Name = "cmdFIRST", ;
Caption = "|<", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Record Awal", ;
Visible = .T.
*--- tambahkan command button cmdMyPrev ---
ADD OBJECT cmdMyPREV AS COMMANDBUTTON WITH ;
Top = 215, ;
Left = 35, ;
Width = 25, ;
Height = 25, ;
Name = "cmdPREV", ;
Caption = "<", ;
FontName = "Arial", ;

142
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Record Sebelumnya", ;
Visible = .T.
*--- tambahkan command button cmdMyNext ---
ADD OBJECT cmdMyNEXT AS COMMANDBUTTON WITH ;
Name = "cmdNEXT", ;
Caption = ">", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Record Berikutnya", ;
Top = 215, ;
Left = 60, ;
Width = 25, ;
Height = 25, ;
Visible = .T.
*--- tambahkan command button cmdMyLast ---
ADD OBJECT cmdMyLAST AS COMMANDBUTTON WITH ;
Name = "cmdLAST", ;
Caption = ">|", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Record Akhir", ;
Top = 215, ;
Left = 85, ;
Width = 25, ;
Height = 25, ;
Visible = .T.
*--- tambahkan command button cmdMyAdd ---
ADD OBJECT cmdMyADD AS COMMANDBUTTON WITH ;
Name = "cmdADD", ;
Caption = "Add", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Tambah Data", ;
Top = 215, ;
Left = 110, ;
Width = 60, ;
Height = 25, ;
Visible = .T.
*--- tambahkan command button cmdMyEdit ---
ADD OBJECT cmdMyEDIT AS COMMANDBUTTON WITH ;
Name = "cmdEDIT", ;
Caption = "Edit", ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Ubah Data", ;
Top = 215, ;
Left = 170, ;
Width = 60, ;
Height = 25, ;
Visible = .T.
*--- tambahkan command button cmdMyDelete ---
ADD OBJECT cmdMyDELETE AS COMMANDBUTTON WITH ;
Name = "cmdDELETE", ;
Caption = "Del", ;
FontName = "Arial", ;

143
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Hapus Data", ;
Top = 215, ;
Left = 230, ;
Width = 60, ;
Height = 25, ;
Visible = .T.
*--- tambahkan command button cmdMyClose ---
ADD OBJECT cmdMyCLOSE AS COMMANDBUTTON WITH ;
Name = "cmdCLOSE", ;
Caption = "CLOSE", ;
CANCEL = .T., ;
FontName = "Arial", ;
FontSize = 9, ;
ForeColor = RGB(0,0,0), ;
ToolTipText = "Tutup Form", ;
Top = 215, ;
Left = 290, ;
Width = 60, ;
Height = 25, ;
Visible = .T.
******************************
* definisi prosedur-prosedur *
******************************
*--- prosedur Timer ---
PROCEDURE Waktu.Timer
* label Jam diisi jam 00:00:00
ThisForm.Jam.Caption = TIME()
ENDPROC
*--- prosedur Init ---
PROCEDURE Init && persiapan jika form akan diaktifkan
* isi label Tanggal
ThisForm.Tanggal.Caption = TampilkanTanggal()
* mengatur grid
WITH Thisform.grdGrid
.ReadOnly = .T. && isi grid tidak bisa diubah
.Column1.Width = 50 && lebar kolom 1
.Column2.Width = 260 && lebar kolom 2
.Column1.Header1.Caption = "KODE"
.Column2.Header1.Caption = "NAMA CUCU"
ENDWITH
ENDPROC
*--- prosedur Activate ---
PROCEDURE Activate && jika form diaktifkan
WITH ThisForm
* aktifkan prosedur SetField()
.SetField(.F.)
* aktifkan prosedur TampilkanData()
.TampilkanData()
ENDWITH
ENDPROC
*--- prosedur grsGrid.AfterRowColChange ---
PROCEDURE grdGrid.AfterRowColChange
* parameter ini harus ada, tidak digunakan
LPARAMETERS nColIndex
* aktifkan prosedur TampilkanData()
ThisForm.TampilkanData()
ENDPROC
*--- prosedur grdGrid.MouseMove ---
PROCEDURE grdGrid.MouseMove && jika ada pergerakan mouse

144
* Paramater ini harus ada
LPARAMETERS nDirection, nShift, nXCoord, nYCoord
ThisForm.grdGrid.DoScroll && aktifkan fungsi scroll
ENDPROC
*--- prosedur cmdFIRST.Click ---
PROCEDURE cmdFIRST.Click && jika button First diklik
ThisForm.NavigasiCucu("FIRST")
ENDPROC
*--- prosedur cmdPREV.Click ---
PROCEDURE cmdPREV.Click && jika button Prev diklik
ThisForm.NavigasiCucu("PREV")
ENDPROC
*--- prosedur cmdNEXT.Click ---
PROCEDURE cmdNEXT.Click && jika button Next diklik
ThisForm.NavigasiCucu("NEXT")
ENDPROC
*--- prosedur cmdLAST.Click ---
PROCEDURE cmdLAST.Click && jika button Last diklik
ThisForm.NavigasiCucu("LAST")
ENDPROC
*--- prosedur cmdADD.Click ---
PROCEDURE cmdADD.Click && jika button Add diklik
SELECT Cucu && aktifkan tabel Cucu.dbf
* jika jumlah record sudah maksimal, maka:
IF RECCOUNT() >= 1000
TampilkanRecordMax() && tampilkan pesan
ELSE
* mengatur form
WITH ThisForm
IF .cmdADD.Caption = "Add" && button "ADD"
.SetButton(.F.) && aktifkan SetButton()
.SetGrid(.F.) && aktifkan SetGrid()
.SetField(.T.) && aktifkan SetField()
.TampilkanField(.F.) && TampilkanField()
.grdGrid.Refresh && grid direfresh
.cmdADD.Enabled = .T. && cmdADD aktif
.cmdEDIT.Enabled = .T. && cmdEDIT aktif
.cmdADD.Caption = "Save" && cmdADD
.cmdEDIT.Caption = "Cancel" && cmdEDIT
.cmdADD.ToolTipText = "Simpan Data"
.cmdEDIT.ToolTipText = "Batal"
* kursor berada di field Kode
.txtKodeCucu.SetFocus
ELSE && jika judul button "SAVE"
IF EMPTY(.txtKodeCucu.Value)
* Tampilkan pesan
TampilkanKodeKosong()
* kursor berada di field Kode
.txtKodeCucu.SetFocus
ELSE
nRecPos = RECNO() && record sekarang
* cari Kode Cucu
LOCATE FOR KdCucu = .txtKodeCucu.Value
IF FOUND() && jika ditemukan, maka:
* menuju posisi record sekarang
GO nRecPos
* Tampilkan pesan
TampilkanKodeSama()
* kursor berada di field Kode
.txtKodeCucu.SetFocus
ELSE && jika tidak ditemukan, maka:

145
APPEND BLANK && tambahkan record
.SimpanData() && SimpanData()
.SetButton(.T.) && SetButton()
.SetGrid(.T.) && SetGrid()
.SetField(.F.) && SetField()
.grdGrid.Refresh && direfresh
.cmdADD.Caption = "Add"
.cmdEDIT.Caption = "Edit"
.cmdADD.ToolTipText="Tambah Data"
.cmdEDIT.ToolTipText="Ubah Data"
GO BOTTOM && menuju record akhir
* aktifkan prosedur TampilkanData()
.TampilkanData()
ENDIF
ENDIF
ENDIF
ENDWITH
ENDIF
ENDPROC
*--- prosedur cmdEDIT.Click ---
PROCEDURE cmdEDIT.Click && jika button cmdEDIT diklik
SELECT Cucu && aktifkan tabel Cucu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* Tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
* aktifkan prosedur TampilkanData()
ThisForm.TampilkanData()
ELSE && jika file isi, maka:
* mengatur form
WITH ThisForm
DO CASE
CASE .cmdEDIT.Caption = "Edit" && "Edit"
.SetButton(.F.) && aktifkan SetButton()
.SetGrid(.F.) && aktifkan SetGrid()
.SetField(.T.) && aktifkan SetField()
* aktifkan prosedur TampilkanField()
.TampilkanField(.T.)
.grdGrid.Refresh && grid direfresh
.cmdEDIT.Enabled = .T. && button aktif
.cmdDELETE.Enabled = .T. && button aktif
.cmdEDIT.Caption = "Save" && cmdEDIT
.cmdDELETE.Caption = "Cancel" && cmdDELETE
.cmdEDIT.ToolTipText = "Ubah Data"
.cmdDELETE.ToolTipText = "Hapus Data"
.txtKodeCucu.SetFocus
CASE .cmdEDIT.Caption = "Save" && "Save"
.SimpanData()
.SetButton(.T.) && aktifkan SetButton()
.SetGrid(.F.) && aktifkan SetGrid()
.SetField(.T.) && aktifkan SetField()
.grdGrid.Refresh && grid direfresh
.cmdEDIT.Caption = "Edit"
.cmdDELETE.Caption = "Del"
.cmdEDIT.ToolTipText = "Ubah Data"
.cmdDELETE.ToolTipText = "Hapus Data"
* aktifkan prosedur TampilkanData()
.TampilkanData()
OTHERWISE && isi button "Cancel"
.SetButton(.T.) && aktifkan SetButton()
.SetGrid(.T.) && aktifkan SetGrid()
.SetField(.F.) && aktifkan SetField()

146
.grdGrid.Refresh && grid direfresh
.cmdADD.Caption = "Add"
.cmdEDIT.Caption = "Edit"
.cmdDELETE.Caption = "Del"
.cmdADD.ToolTipText = "Tambah Data"
.cmdEDIT.ToolTipText = "Ubah Data"
.cmdDELETE.ToolTipText = "Hapus Data"
* aktifkan prosedur TampilkanData()
.TampilkanData()
ENDCASE
ENDWITH
ENDIF
ENDPROC
*--- prosedur cmdDELETE.Click ---
PROCEDURE cmdDELETE.Click
SELECT Cucu && aktifkan tabel Cucu
IF RECCOUNT() = 0 && jika file kosong
* Tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
* aktifkan prosedur TampilkanData()
ThisForm.TampilkanData()
ELSE
* simpan posisi record sekarang
xRecPosisi = RECNO()
IF ThisForm.cmdDELETE.Caption = "Del"
IF MESSAGEBOX("Anda ingin menghapus data ini?",;
4+32+256,"Konfirmasi") = 6 && pilih YES
DELETE && hapus record
PACK && pastikan record dihapus dari tabel
* posisi record sekarang
xRecPosisi=IIF(xRecPosisi >= RECCOUNT(),;
RECCOUNT(),xRecPosisi) &&posisi record
ENDIF
ENDIF
IF RECCOUNT() = 0 && jika file kosong
* Tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi
GO xRecPosisi && menuju record xrecPosisi
ENDIF
WITH ThisForm && mengatur _SCREEN
.SetButton(.T.) && aktifkan SetButton()
.SetGrid(.T.) && aktifkan SetGrid()
.SetField(.F.) && aktifkan SetField()
.GridRefresh() && aktifkan GridRefresh()
.grdGrid.Refresh && grdGrid direfresh
.cmdEDIT.Caption = "Edit" && button Edit
.cmdDELETE.Caption = "Del" && button Delete
.cmdEDIT.ToolTipText = "Ubah Data" && tips
.cmdDELETE.ToolTipText = "Hapus Data" && tips
.TampilkanData() && aktifkan TampilkanData()
ENDWITH
ENDIF
ENDPROC
*--- prosedur cmdCLOSE.Click ---
PROCEDURE cmdCLOSE.Click && jika button cmdCLOSE diklik
* variabel lokal
LOCAL I,N,xUrut,xKode,xNama,yKode,yNama
********************************
* proses pengurutan BUBLE SORT *
* berdasarkan Kode - Ascending *

147
********************************
SELECT Cucu && aktifkan tabel Cucu
N = RECCOUNT() && variabel jumlah record
xUrut = .F. && variabel tanda (flag/switch)
DO WHILE xUrut = .F. && lakukan selama belum urut
xUrut = .T. && sudah urut
FOR I = 1 TO (N-1)
GO I && menuju record I
xKode = Cucu.KdCucu && ambil nilai Kode
xNama = Cucu.NmCucu && ambil nilai Nama
GO (I+1) && menuju record (I+1)
yKode = Cucu.KdCucu && ambil nilai Kode
yNama = Cucu.NmCucu && ambil nilai Nama
IF xKode > yKode && jika dipenuhi, maka:
GO I && menuju record I
REPLACE Cucu.KdCucu WITH yKode && yKode
REPLACE Cucu.NmCucu WITH yNama && yNama
GO (I+1) && menuju record (I+1)
REPLACE Cucu.KdCucu WITH xKode && xKode
REPLACE Cucu.NmCucu WITH xNama && xNama
xUrut = .F. && belum urut
ENDIF
NEXT
ENDDO
thisform.grdGrid.RecordSource = "" && grid kosong
thisform.release && form dihapus
ENDPROC
*--- prosedur GridRefresh ---
PROCEDURE GridRefresh
* mengatur Grid
WITH ThisForm.grdGrid
.ReadOnly = .T. && isi grid tidak bisa diubah
.RecordSource = "Cucu" && tabel Cucu.dbf
.RecordSourceType = 1 && alias tabel
* lebar kolom
.Column1.Width = 50 && lebar kolom 1
.Column2.Width = 260 && lebar kolom 2
* judul kolom
.Column1.Header1.Caption = "KODE"
.Column2.Header1.Caption = "NAMA CUCU"
ENDWITH
ENDPROC
*--- prosedur SetButton ---
PROCEDURE SetButton
PARAMETERS xPar && menerima kiriman variabel
* mengatur button (ON/OFF)
WITH ThisForm
.cmdFIRST.Enabled = xPar && cmdFirst ON/OFF
.cmdPREV.Enabled = xPar && cmdPrev ON/OFF
.cmdNEXT.Enabled = xPar && cmdNext ON/OFF
.cmdLAST.Enabled = xPar && cmdLast ON/OFF
.cmdADD.Enabled = xPar && cmdAdd ON/OFF
.cmdEDIT.Enabled = xPar && cmdEdit ON/OFF
.cmdDELETE.Enabled = xPar && cmdDel ON/OFF
.cmdCLOSE.Enabled = xPar && cmdClose ON/OFF
ENDWITH
ENDPROC
*--- prosedur SetField ---
PROCEDURE SetField
PARAMETERS xPar && menerima kiriman variabel
* mengatur field

148
WITH ThisForm
.txtKodeCucu.Enabled = xPar && KodeCucu ON/OFF
.txtNamaCucu.Enabled = xPar && NamaCucu ON/OFF
ENDWITH
ENDPROC
*--- prosedur SetGrid ---
PROCEDURE SetGrid
PARAMETERS xPar && menerima kiriman variabel
* mengatur grid True/False
ThisForm.grdGrid.Enabled = xPar && grid ON/OFF
ENDPROC
*--- prosedur TampilkanData ---
PROCEDURE TampilkanData
IF RECCOUNT() = 0 && jika file kosong, maka:
* tampilkan field kosong
ThisForm.TampilkanField(.F.)
ELSE
* tampilkan field isi
ThisForm.TampilkanField(.T.)
ENDIF
ThisForm.grdGrid.Refresh && grid di-refresh
ENDPROC
*--- prosedur TampilkanField ---
PROCEDURE TampilkanField
PARAMETERS xPar && menerima kiriman variabel
SELECT Cucu && aktifkan tabel Cucu.dbf
* mengatur form
WITH ThisForm
IF xPar = .T. && jika True, maka:
.txtNoRec.Value =RECNO() && isi textbox
.txtTotRec.Value=RECCOUNT() && isi textbox
.txtKodeCucu.Value=Cucu.KdCucu && isi textbox
.txtNamaCucu.Value=Cucu.NmCucu && isi textbox
ELSE && jika False, maka:
.txtNoRec.Value = RECCOUNT() && isi textbox
.txtTotRec.Value = RECCOUNT() && isi textbox
.txtKodeCucu.Value = "" && isi textbox kosong
.txtNamaCucu.Value = "" && isi textbox kosong
ENDIF
ENDWITH
ENDPROC
*--- prosedur SimpanData ---
PROCEDURE SimpanData
SELECT Cucu && aktifkan tabel Cucu
* simpan data ke dalam tabel Cucu.dbf
REPLACE Cucu.KdCucu WITH ThisForm.txtKodeCucu.Value
REPLACE Cucu.NmCucu WITH ThisForm.txtNamaCucu.Value
FLUSH && pastikan data tersimpan
ENDPROC
*--- prosedur NavigasiCucu ---
PROCEDURE NavigasiCucu
PARAMETERS xPar && menerima kiriman variabel
SELECT Cucu && aktifkan tabel Cucu.dbf
IF RECCOUNT() = 0 && jika file kosong, maka:
* Tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ELSE && jika file isi, maka:
DO CASE
CASE xPar = "FIRST"
* jika posisi di awal record
IF RECNO() = 1

149
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju awal record
ENDIF
CASE xPar = "PREV"
* jika posisi di awal record
IF RECNO() = 1
TampilkanTopOfFile() && tampilkan pesan
ELSE && jika tidak diposisi awal record
GoRecord(xPar) && menuju record sebelumnya
ENDIF
CASE xPar = "NEXT"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju record berikutnya
ENDIF
CASE xPar = "LAST"
* jika posisi di akhir record
IF RECNO() = RECCOUNT()
TampilkanEndOfFile() && tampilkan pesan
ELSE && jika tidak diposisi akhir record
GoRecord(xPar) && menuju akhir record
ENDIF
ENDCASE
* aktifkan prosedur TampilkanData()
ThisForm.TampilkanData()
ENDIF
ENDPROC
ENDDEFINE
**********************************
* definisi prosedur di luar form *
**********************************
*--- prosedur TampilkanSorry ---
PROCEDURE TampilkanSorry
PARAMETERS xPar && menerima kiriman variabel
MESSAGEBOX(xPar,0+64,"SORRY") && tampilkan pesan
ENDPROC
*--- prosedur TampilkanFileKosong ---
PROCEDURE TampilkanFileKosong
* Tampilkan pesan
TampilkanSorry("SORRY.....file kosong!")
ENDPROC
*--- prosedur TampilkanTopOfFile ---
PROCEDURE TampilkanTopOfFile
* Tampilkan pesan
TampilkanSorry("SORRY.....top of file!")
ENDPROC
*--- prosedur TampilkanEndOfFile ---
PROCEDURE TampilkanEndOfFile
* Tampilkan pesan
TampilkanSorry("SORRY.....end of file!")
ENDPROC
*--- prosedur TampilkanKodeKosong ---
PROCEDURE TampilkanKodeKosong
* Tampilkan pesan
TampilkanSorry("SORRY.....Kode kosong!")
ENDPROC
*--- prosedur TampilkanKodeSama ---
PROCEDURE TampilkanKodeSama

150
* Tampilkan pesan
TampilkanSorry("SORRY.....Kode sama!")
ENDPROC
*--- prosedur TampilkanRecordMax ---
PROCEDURE TampilkanRecordMax
* Tampilkan pesan
TampilkanSorry("SORRY.....maksimum record 1.000!")
ENDPROC
*--- prosedur GoRecord ---
PROCEDURE GoRecord
PARAMETERS xPar && menerima kiriman variabel
DO CASE
CASE xPar = "FIRST" && button First
GO TOP && menuju record awal
CASE xPar = "PREV" && button Prev
SKIP -1 && menuju record sebelumnya
CASE xPar = "NEXT" && button Next
SKIP && menuju record berikutnya
CASE xPar = "LAST" && button Last
GO BOTTOM && menuju record akhir
OTHERWISE && button lainnya
GO xRecPosisi && menuju record sekarang
ENDCASE
ENDPROC
*--- prosedur TampilkanTanggal ---*
FUNCTION TampilkanTanggal
* variabel lokal
LOCAL cRet,NamaHari(7),NamaPasar(5),NamaBulan(12)
* Nama-nama hari
NamaHari(1) = "Minggu"
NamaHari(2) = "Senin"
NamaHari(3) = "Selasa"
NamaHari(4) = "Rabu"
NamaHari(5) = "Kamis"
NamaHari(6) = "Jum'at"
NamaHari(7) = "Sabtu"
* Nama-nama pasaran
NamaPasar(1) = "Pahing"
NamaPasar(2) = "Pon"
NamaPasar(3) = "Wage"
NamaPasar(4) = "Kliwon"
NamaPasar(5) = "Legi"
* Nama-nama bulan
NamaBulan(1) = "Januari"
NamaBulan(2) = "Februari"
NamaBulan(3) = "Maret"
NamaBulan(4) = "April"
NamaBulan(5) = "Mei"
NamaBulan(6) = "Juni"
NamaBulan(7) = "Juli"
NamaBulan(8) = "Agustus"
NamaBulan(9) = "September"
NamaBulan(10)= "Oktober"
NamaBulan(11)= "Nopember"
NamaBulan(12)= "Desember"
* nama hari dan pasar, tanggal, bulan dan tahun
cRet = NamaHari(DOW(DATE()))+" - "+ ;
NamaPasar((MOD((DATE()-CTOD("01/01/1900")),5)+1))+ ;
", "+ALLTRIM(STR(DAY(DATE())))+" "+ ;
NamaBulan(MONTH(DATE()))+" "+ ;
STR(YEAR(DATE()),4)

151
RETURN (cRet) && mengembalikan nilai tanggal sekarang
ENDFUNC
* End of procedure

Ketik program di atas, simpan dengan nama BapakAnak.prg atau


copy file BapakAnak.prg dari CD pendamping buku ini, kemudian
jalankan di dalam lingkungan Visual FoxPro. Hasilnya pasti me-
muaskan!

152
KOMPILASI PROGRAM

Untuk menjalankan program-program di atas ada dua cara, yaitu:


1. Di dalam lingkungan Visual FoxPro:
Dari menu Visual FoxPro, pilih Program Æ Do Æ pilih
<NamaProgram> Æ OK
Contoh: Program Æ Do Æ pilih JamAnalog (file PRG) Æ OK,
atau;
Dari jendela Command, ketik: DO <NamaProgram>
Contoh: DO JamAnalog (file PRG)

2. Di luar lingkungan Visual FoxPro:


Jika Anda ingin menjalankannya di luar lingkungan Visual
FoxPro, berarti Anda harus membuat file Executable (.EXE).

153
Buat file project, caranya, pilih File Æ New, akan tampil jendela New
seperti berikut ini.

New file

Gambar 8.1 Tampilan jendela New File

Pilih Project Æ New file, akan tampil jendela seperti berikut ini.

JamAnalog

Gambar 8.2 Tampilan jendela Create New File

154
Ketik nama project, misalnya JamAnalog Æ Save, akan muncul
jendela Project Manager seperti gambar berikut ini.
Code

Add

Build

Gambar 8.3 Tampilan jendela Project Manager

Pilih tab Code Æ Add, pilih file PRG Anda (JamAnalog.prg) Æ OK


Pilih Build, akan muncul jendela Build Options, pilih:
• Win32 executable/COM server (exe);
• Recompile All files;
• Display Errors, kemudian klik OK.

OK

Gambar 8.4 Tampilan jendela Build Options

155
Tunggu sebentar ….. Visual FoxPro sedang membuat file
JamAnalog.exe.
Hasilnya file JamAnalog.exe siap digunakan dan didistribusikan!

Jangan lupa menyertakan file-file Run-Time.


Daftar file Run-Time dapat dilihat dalam fasilitas Help
Visual FoxPro.

156
PENUTUP

Dunia pemrograman pada umumnya ‘hampir tanpa batas’, terbuka


kesempatan bagi kita untuk mengembangkan ide dan kreativitas;
yang membatasi hanya minat dan kemampuan kita untuk berkreasi.
Seperti kata pepatah ‘to hear to forget, to see to remember, to do to
understand’ (Confusius). Semakin sering kita melakukan latihan dan
membuat program, kita akan semakin terampil dan pasti menjadi
programmer yang andal dan profesional.
Meskipun penulis sudah mencoba menjelaskan materi dalam buku
ini dengan jelas, namun penulis menyadari bahwa masih banyak
kekurangan di sana-sini. Harapan penulis buku ini dapat menjadi
inspirasi dan merupakan langkah awal untuk dapat meningkatkan
pengetahuan dalam dunia pemrograman, khususnya Visual FoxPro.
Lima program yang dibahas dalam buku ini hanya contoh kecil dari
kompleksitas dalam bidang pemrograman, tentunya masih perlu
untuk dikembangkan lebih lanjut. Fasilitas HELP Visual FoxPro selalu
siap membantu apabila Anda berada dalam kesulitan, Anda dapat

157
menggunakannya setiap saat dalam menyelesaikan masalah
pemrograman di lingkungan Visual FoxPro.
Jika Anda masih mengalami kesulitan dalam mempelajari buku ini,
Anda dapat berkonsultasi langsung dengan mengirimkan email ke
alamat penulis berikut ini.
Email: kusmijanto2003@yahoo.com

158