Senin, 10 Agustus 2009






Desain Program Dengan M vfr9.0

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.


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.

Fasilitas yang tersedia, antara lain navigasi record, tambah data,
ubah data, hapus data, tentang program dan tutup form, kembali ke
tampilan Bapak-Anak.

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 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 tabel BapakAnak dapat digambarkan
sebagai berikut.

Persiapan
Menampilkan
Data
Start
Stop
Mengatur form _SCREEN
Menampilkan semua data
dalam objek Grid dan
menampilkan satu data
dalam objek TextBox
Navigasi
Record ADD EDIT DELETE SORT ABOUT CLOSE
Menampilkan
Data Cucu
Pengelolaan tabel Cucu.dbf
Navigasi
Record ADD EDIT DELETE ABOUT CLOSE


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")
.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,


optiongroup dan command butto


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 Labe

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
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
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
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 + ;
_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


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


kursor 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.
.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"

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

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.)



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
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
126
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
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
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
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:
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
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"
.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
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")
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
.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
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
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
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
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



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

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 ;
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.



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

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", ;
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", ;
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

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:
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()
.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

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

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


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)

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

Ketik program di atas dan simpan.