BAB IX
Visual Foxpro
7.1. Pendahuluan
Pada Gambar 7.1. akan diminta untuk memilih beberapa alternatif pilihan
sebelum memasuki jendela pemrograman, yaitu:
o Open the new component gallery to organize your Visual FoxProi, untuk
mengorganisasi komponen visual FozPro dengan membuka galeri
komponen baru.
o Discover programming solutions by exploring sample applications, untuk
menemukan solusi pemrograman dengan menjelajahi aplikasi-aplikasi
contoh yang sudah disediakan.
o Create a new application, untuk membuat aplikasi baru
o Open an existing project, untuk membuka proyek yang telah dibuat
sebelumnya (yang sudah ada).
o Close this screen, untuk menutup jendela / tampilan selamat datang.
Di bawah pilihan-pilihan tersebut terdapat kotak cek (check box) yang berbunyi
Don’t display this welcome screen again. Jika di-klik (memberi tanda centang)
pada kotak cek tersebut maka berarti memerintahkan Visual FoxPro 6.0 agar
tidak membuka Visual Foxpro untuk yang selanjutnya.
Setelah ditutup jendela tersebut, selanjutnya akan muncul tampilan utama dari
Visual Foxpro.
2
Dari menu dalam tampilan utama tersebut, pilih Option Project dan klik
tombol New File. Dari kotak dialog yang akan muncul, tentukan letak dimana
file project akan disimpan, kemudian tekan Save. Selanjutnya akan muncul
tampilan seperti Gambar 7.3.
PERSIAPAN :
Buatlah tabel MAHASISWA yang akan diisi data lewat form
Buatlah tabel dengan struktur seperti pada Gambar 7.4, kemudian simpanlah
dengan nama MAHASISWA.DBF
MEMBUAT FORM
Ada beberapa metode yang dapat ditempuh untuk form isian data :
1. Dengan menggunakan variabel memori. Data-data isian dilayar ditampung
dalam variabel kemudian disimpan ke tabel dengan printah REPLACE.
Cara ini sudah tergolong lama dan tidak ditunjukkan di modul ini (sudah
tidak direkomendasikan untuk dipakai).
2. dengan menggunakan tabel buffering. Buffering sistem kerjanya dapat
dianggap CACHE pada sistem komputer. Data-data isian dilayar
ditampung dalam BUFFER (yang ditangani secara internal oleh foxpro)
kemudian dengan peringah tertentu (TABLEUPDATE) akan menulis data
di BUFFER ke disk, atau dengan perintah tertentu (TABLEEVERT) akan
4
5. Ubah properti dari masing-masing obyek kontrol data form tersebut sesuai
dengan tabel berikut :
KETERANGAN
Event INIT terjadi sesaat setelah suatu obyek tercipta, hanya terjadi sekali saat obyek
dimuat ke memori. Kode di atas hanyalah sekedar melakukan inisialisasi berikut :
- Atur agar record bertanda hapus tidak ditampilkan
- Atur tanggal ke gaya Inggris, yaitu hari-bulan-tahun (bukan gaya
Amerika)
- Atur semua kotak isian (TEXTBOX) ke posisi tak aktif. Skenarionya
kotak isian hanya aktif pada modus penambahan data/pengeditan data.
- Tombol-tombol yang aktif pertama kali saat form muncul adalah semua
tombol kecuali simpan dan batal. Skenarionya adalah tombol simpan dan
batal hanya aktif setelah ada penambahan record baru atau pengeditan
record.
BtnTambah Click SELECT MAHASISWA
APPEND BLANK
THISFORM.SETALL(“ENABLED”,.T.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .T.
THISFORM.BtnBATAL.ENABLED = .T.
THISFORM.REFRESH()
KETERANGAN
- APPEND BLANK akan menambah 1 record baru ke tabel MAHASIWA
- Aktifkan kotak-kotak isian
- Non-aktifkan tombol-tombol, kecuali SIMPAN dan BATAL (skenarionya
pada penambahan data, hal yang bisa dilakukan adalah menyimpan atau
membatalkan)
BtnSimpan Click SELECT MAHASISWA
= TABELUPDATE(.T.)
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.T.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .F.
THISFORM.BtnBATAL.ENABLED = .F.
THISFORM.REFRESH()
KETERANGAN
- TABLE UPDATE akan menulis data di BUFFER ke disk/file
- Non-aktifkan kotak-kotak isian (setelah disimpan skenarionya kembali ke
modus biasa)
- Aktifkan tombol-tombol, kecuali tombol SIMPAN dan BATAL
BtnBATAL Click SELECT MAHASISWA
= TABELEVERT(.T.)
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.T.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .F.
THISFORM.BtnBATAL.ENABLED = .F.
THISFORM.REFRESH()
KETERANGAN
- TABLE EVERT akan membatalkan perubahan data di BUFFER (tidak
ditulis ke disk/file).
- Non-aktifkan kotak-kotak isian (setelah disimpan skenarionya kembali ke
modus biasa).
- Aktifkan tombol-tombol, kecuali tombol SIMPAN dan BATAL
BtnEDIT Click THISFORM.SETALL(“ENABLED”,.T.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .T.
8
THISFORM.BtnBATAL.ENABLED = .T.
THISFORM.REFRESH()
KETERANGAN
- Aktifkan kotak-kotak isian, agar bisa di EDIT data
- Non-aktifkan tombol-tombol, kecuali SIMPAN dan BATAL (skenarionya
pada pengeditan data, hal yang bisa dilakukan adalah menyimpan atau
membatalkan
BtnTERATAS Click SELECT MAHASISWA
GO TOP
THISFORM.REFRESH
BtnSEBELUMNYA Click SELECT MAHASISWA
IF NOT BOF ()
SKIP –1
ELSE
MESSAGEBOX (“Sudah diposisi
teratas”,48,”INFO”)
END IF
THISFORM.REFRESH
BtnBerikutnya Click SELECT MAHASISWA
IF NOT BOF ()
SKIP 1
ELSE
MESSAGEBOX (“Sudah diposisi
terbawah”,48,”INFO”)
END IF
THISFORM.REFRESH
BtnTERAKHIR Click SELECT MAHASISWA
GO BOTTOM
THISFORM.REFRESH
BtnHAPUS Click SELECT MAHASIWA
IF NOT EOF ()
DELETE
SKIP-1
ELSE
MESSAGEBOX (”Posisikan dulu
recordnya”,32+0,”INFO”)
END IF
THISFORM.REFRESH
BtnKELUAR Click THISFORM.RELEASE
5. Ubah properti dari masing-masing obyek kontrol data form tersebut sesuai
dengan tabel berikut :
Text1 MAHASIWA.NO_MHS
Text2 MAHASISWA.NAMA_MAHASIWA
Text3 MAHASIWA.TGL_LAHIR
KETERANGAN
- END TRANSACTION akan menulis semua perubahan data ke disk/file.
Ini dilakukan terhadap semua tabel yang ada di database (bisa banyak
tabel) yang dilingkupi transaksi.
- Non-aktifkan kotak-kotak isian (setelah disimpan skenarionya kembali
ke modus biasa)
- Aktifkan tombol-tombol, kecuali tombol SIMPAN dan BATAL
BtnBATAL Click ROLLBACK
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.T.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .F.
THISFORM.BtnBATAL.ENABLED = .F.
THISFORM.REFRESH()
KETERANGAN
- ROLLBACK akan membatalkan smua perubahan data dilingkup
transaksi
- Non-aktifkan kotak-kotak isian (setelah disimpan skenarionya kembali
ke modus biasa).
- Aktifkan tombol-tombol, kecuali tombol SIMPAN dan BATAL
BtnEDIT Click THISFORM.SETALL(“ENABLED”,.T.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.BtnSIMPAN.ENABLED = .T.
THISFORM.BtnBATAL.ENABLED = .T.
THISFORM.REFRESH()
KETERANGAN
- Aktifkan kotak-kotak isian, agar bisa di EDIT data
- Non-aktifkan tombol-tombol, kecuali SIMPAN dan BATAL
(skenarionya pada pengeditan data, hal yang bisa dilakukan adalah
menyimpan atau membatalkan
BtnTERATAS Click SELECT MAHASISWA
GO TOP
THISFORM.REFRESH
BtnSEBELUM Click SELECT MAHASISWA
NYA IF NOT BOF ()
SKIP –1
ELSE
MESSAGEBOX (“Sudah diposisi
teratas”,48,”INFO”)
END IF
THISFORM.REFRESH
BtnBerikutnya Click SELECT MAHASISWA
IF NOT BOF ()
SKIP 1
ELSE
MESSAGEBOX (“Sudah diposisi
terbawah”,48,”INFO”)
END IF
THISFORM.REFRESH
BtnTERAKHIR Click SELECT MAHASISWA
GO BOTTOM
THISFORM.REFRESH
BtnHAPUS Click SELECT MAHASIWA
IF NOT EOF ()
DELETE
12
SKIP-1
ELSE
MESSAGEBOX (”Posisikan dulu
recordnya”,32+0,”INFO”)
END IF
THISFORM.REFRESH
BtnKELUAR Click THISFORM.RELEASE
CATATAN :
- TRANSAKSI bisa melibatkan banyak tabel, banyak record
- TRANSAKSI lebih handal dibanding BUFFERING terutama
untuk aplikasi banyak tabel
- Jika menggunakan TRANSAKSI, maka BUFFERING tidak perlu
diaktifkan.
- TRANSAKSI selalu diawali dengan BEGIN TRANSACTION
BEGIN TRANSACTION END
TRANSACTION
Atau
BEGIN TRANSACTION ROLLBACK
- BUFFERING selalu diakhiri dengan TABLEUPDATE /
TABELEVERT
MODUL III
13
SELECT MAHASISWA
INDEXSEEK (THISFORM.TxtNoMhs.VALUE,.F.)
IF FOUND
= MESSAGEBOX (“No_Mhs tersebut telah terpakai”)
RETURN .F.
ELSE
RETURN .T.
END IF
SELECT KODE_POS
INDEXSEEK (THISFORM.TxtKdPos.VALUE,.F.)
IF Not FOUND ( )
= MESSAGEBOX (“Kode Pos tersebut belum terdefinisi”)
Return .F.
Else
Return .T.
14
Endif
MODIFIKASI FORM :
Pada contoh ini akan ditunjukkan proses cek duplikasi nomor mahasiswa.
Kode yang harus ditambahkan adalah pada event VALID dari kotak isian
noor mahasiswa. Pada event VALID, perintah RETURN .T. digunakan untuk
mengindikasikan bahwa validasi sukses / valid dan RETURN .F. jika validasi
gagal / invalid.
15
Langkah- langkah :
1. Buka form pada modul sebelumnya.
2. Buka data enviroment dari form tersebut, dan pastikan
bahwa properti ORDER dari tabel mahasiwa di set ke
URUT_NOMHS (nama tag yang dibuat saat memberi
index).
3. ketik kode berikut pada event VALID dari kotak isian
nomor mahasiwa (TxtNoMhs).
&& diandaikan nomor mahasiswa tidak boleh dobel
SELECT MAHASISWA
INDEXSEEK (THISFORM.TxtNoMhs.Value,.F.)
IF FOUND
= MESSAGEBOX (“No_MHS tersebut telah terpakai”)
RETURN .F.
ELSE
RETURN .T.
ENDIF
MODUL IV
PENGGUNAAN GRID
16
Header
Control
Kolom 2
Header
Control
Kolom ke-N
Header
Control
Masing- masing obyek dalam hirarki tersebut mempunyai properti dan methode
sendiri- sendiri, sehingga kita dapat mengontrol secara penuh setiap elemen pada
grid.
3. Atur data environment dari form tersebut, tambahkan tabel Mahasiswa dan
JURUSAN ke dalamnya. Jangan lupa aktifkan pada TAG untuk masing-
masing tabel tersebut.
4. Atur properti untuk masing- masing obyek sebagai berikut
Obyek Properti
Nilai
Grid Allow AddNew .T.
Nilai TRUE pada properti ini berarti kita
bisa menambahkan record baru dengan cara
menekan tombol panah bawah pada saat
posisi kursor ada di posisi terakhir.
Selanjutnya data dapat diketik langsung
pada GRID
DeleteMark .T.
Nilai TRUE pada properti ini berarti tanda
hapus untuk tiap record tampil di GRID.
Penghapusan record data dapat dilakukan
dengan mengklik pada DeleteMark ini.
RecordSourceType 1 (Alias)
Properti ini menentukan jenis sumber data
untuk GRID.
RecordSource MAHASISWA
Properti ini menetukan darimana sumber
data diambil (pada kasus ini dari tabel
mahasiswa).
ColusmnCount 5
Properti ini menentukan cacah kolom
dimiliki oleh GRID.
Kolom ke-1 Name Kolom1
ControlSource Mahasiswa. No_mhs
Properti sebenarnya bisa juga tidak di isi
dengan konsekuensi urutan tampilan kolom
data akan seperti urutan fieldnya pada tabel
sumber data.
Kolom ke-2 Name Kolom2
ControlSource Mahasiswa.nama mhs
Kolom ke-3 Name Kolom3
ControlSource Mahasiswa.tgl lahir
Kolom ke-4 Mame Kolom4
ControlSource Mahasiswa agama
Kolom ke-5 Name Kolom5
ControlSource Mahasiswa.kd_jurusan
Header Caption No Mhs
kolom ke-1 Header digunakan untuk member keterangan pada
tiap- tiap kolom.
Header Caption Nama Mahasiswa
kolom ke-2
Header Caption Tanggal Lahir
kolom ke-3
Header Caption Agama
18
kolom ke-4
Header Caption Kode Jurusan
kolom ke-5
5. Saatnya melakukan penulisan kode-kode. Pertama kode untuk event INIT dari form :
SET CENTURY ON
SET DATE BRITISH
SELECT MAHASISWA
GO TOP
IF EOF ()
APPEND BLANK
ENDIF
GRID tdak akan dapat disinggahi kursor jika tabel yang menjadi sumber data kosong
sama sekali. Untuk itu minimal harus ada 1 record data. Kode di atas mengecek apakah datanya
kosong sama sekali dan APPEND satu record kosong jika memang demikian.
6. Sampai di sini GRID tersebut sebenarnya sudah dapat dipakai tetapi belum ada kode validasi
sama sekali. Untuk memberi kode validasi dilakukan lewat event VALID pada obyek kontrol
yang merupakan bagian dari kolom (kolom mempunyai dua anggota yaitu Haeder dan Kontrol
secara default biasanya berupa textbox). Sebagai contoh, ketik kode berikut pada event VALID
untuk obyek TEXT 1 pada kolom ke-5 :
SELECT JURUSAN
SEEK THIS. VALUE
IF NOT FOUND ()
=MESSAGEBOX (‘KODE JURUSAN TERSEBUT TAK DI TEMUKAN”,
48, “INFO”)
THIS. VALUE=””
SELECT MAHASISWA
RETURN 0
ENDIF
SELECT MAHASISWA
RETURN .T.
7. Validasi dapat juga dilakukan dengan cara membatasi kursor supaya tidak masuk kedalam
kotak isian jika suatu kondisi dipenuhi. Ini dilakukan lewat event WHEN pada kontrol yang
merupakan bagian dari kolom. Sebagai contoh, ketik kode berikut pada event WHEN untuk
obyek TEXT 1 pada kolom ke-1 :
IF EMPTY (MAHASISWA.NO_MHS)
RETURN .T.
19
ELSE
RETURN .F.
ENDIF
Kode ini akan menolak masuknya kursor (RETURN .F.) ke isian nomor mahasiswa jika nomor
mahasiswanya sudah ada isi (tak boleh tambah baru).
ControlSource Jurusan.nm_jurusan
Properti ini jika diisi dari tabel lain yang bukan
merupakan recorderSource dari GRID (dan sudah
relasikan sebelumnya) akan menampilkan tabel
referensi.
Header kolom ke-1 Caption Jurusan
Header digunakan untuk memberi keterangan pada
tiap- tiap kolom.
4. Saatnya melakukan modifikasi kode- kode. Salah satu modifikasi yang diperlukan adalah
mencegah masuknya korsor ke kolom 6 apapun kondisinya (tak ada data asli, hanya
tampilkan dari tabel referensi agar komunikatif). Ini dilakukan lewat event WHEN pada
obyek TEXT 1 di kolom 6 :
20
RETURN .F.
Kolom 6 sekarang tidak bisa disinggahi kursor sama sekali (tak bisa diedit).
No MHS Character 10
Nama MHS Character 45
TGL LAHIR Date 8
AGAMA Character 15
KD JURUSAN Character 2
KELAMIN Character 1
Setelah itu, isikan data-data jenis kelaminnya (L untuk laki- laki dan P untuk perempuan)
2. Buka kembali form dari bagian 2, lalu save as ke nama lain.
3. Lakukan beberapa modifikasi terhadap properti GRID sebagai berikut :
5. Saat melakukan modifikasi kode- kode. Salah satu modifikasi yang diperlukan adalah
mencegah masuknya kursor ke kolom 7 dan 8 apapun kondisinya. Ini dilakukan lewat event
WHEN pada obyek TEXT1 di kolom 7 maupun di kolom 8.
Kolom 7 dan 8 sekarang tidak bisa disinggahi kursor sama sekali (tak bisa diedit).
Catatan :
Combo bukan satu- satunya kontrol yang dapat dipakai pada kolom GRID. Beberapa
kontrol lain seperti EditBox (biasanya untuk tipe data memo). Spinner (khusus isian
numeris). Check Box (khusus isian numeris atau logika), dan bahkan Obyek
Gambar(Image). Metode penggantian identik dengan Combo di atas.
Dengan teknik ini, kita tidak takut untuk SET DELETED ON. Pada pengeditan langsung di
GRID jika seting ini diaktifkan akan kesulitan dalam refreshnya.
5. Ketik kode berikut untuk event Klik pada tombol + sebagai berikut : (+)
DO FORM TAMBAH_DATA
THISFORM.REFRESH
Perintah ini akan memunculkan perintah lain (yang akan kita rancang dalam langkah
berikutnya yang akan digunakan untuk memasukkan data. Sebaiknya dihindari penggunaan nama
drive dan folder secara langsung seperti :
DO FORM C :\PROGRAM\TAMBAH_DATA
Lebih baik form tersebut di simpan ke folder yang sam dengan form induk, lalu diberi
perintah untuk ataur folder default sebelum menjalankan proram.
SET DEFAULT TO C :\PROGRAM
23
6. Ketik kode berikut pada event Klik untuk tombol – sebagai berikut : ( - )
SELECT MAHASISWA
IF EOF ()
RETURN
ENDIF
DELETE
THISFORM. REFRESH
7. Rancang form penambahan data dengan lay-out seperti pada gambar di bawah ini :
8. Pada data environment dari form tambah data tersebut, tambahkan tabel mahasiswa dan tabel
jurusan.
9. Tambahkan properti kd_jurusan, lalu beri nilai awal
10.Atur properti tersebut sehingga sebagai berikut:
11. Ketik kode berikut pada event Valid pada combo jurusan :
Thisform.kd_jurusan- jurusan.kd_jurusan
Ini menyimpan kode jurusan yang dipilih (kita tidak menghedaki nama tersebut).
SELECT MAHASISWA
APPEND BLANK
REPLACE NO_ MHS WITH THISFORM. TEXT1.VALUE
REPLACE NAMA MHS WITH THISFORM.TEXT2.VALUE
REPLACE TGL LAHIR WITH THISFORM.TEXT3.VALUE
REPLACE AGAMA WITH THISFORM.COMBO1.VALUE
REPLACE KD_JURUSAN WITH THISFORM.KD_JURUSAN
REPLACE KELAMIN WITH THISFORM.TEXT4.VALUE
THISFORM.RELEASE
MODUL V
25
SQL merupakan suatu pengelolaan data dengan bahasa yang terstruktur yang hampir
mirip dengan bahasa yang dipakai sehari-hari. Biasanya SQL digunakan untuk memfilter atau
membangun suatu tabel baru dari tabel yang sudah ada (bisa dari satu atau lebih tabel).
Jika kita menghendaki membangun satu tabel yang baru (tetapi datanya tetap berdasarkan dari
tabel yang suda ada yaitu mahasiswa.dbf) dengan nama file1.dbf yang susunan fieldnya sebagai
berikut :
• No_Mhs
• Nama
• Jenis_kel
Maka kita dapat membangun tabel baru tersebut dengan SQL, tanpa harus mengentry ulang data
dengan perintah :
Syarat untuk menggabung 2 tabel atau lebih adalah tabel-tabel tersebut harus mempunyai kunci
yang saling terkait dengan relasi.
Dalam suatu basis data terdiri dari dua tabel mhs.dbf dan dosen.dbf
• Kd_dosen
• Nama_dosen
Jika kita mengehendaki untuk membangun satu tabel yang baru (tetapi datanya tetap
berdasarkan dari tabel yang sudah ada yaitu mhs.dbf dan dosen.dbf) dengan nama file2.dbf
yang susunan fieldnya sebagai berikut
• No_Mhs
• Nama
• Alamat
• Jenis_kel
• Nama_dosen
Maka kita dapat membangun tabel baru tersebut dengan SQL, tanpa harus mengentry ulang
data dengan perintah :
Contoh 3 : Membangun tabel baru dengan menggabung 2 tabel atau lebih kemudian
memfilternya
Jika kita menghendaki untuk membangun satu tabel yang baru (tetapi datanya tetap
berdasarkan dari tabel yang sudah ada yaitu mhs.dbf dan dosen.dbf) dengan nama file2.dbf
yang susunan fieldnya sebagai berikut :
• No_Mhs
• Nama
• Alamat
• Jenis_kel
• Nama_dosen
Dengan filter : tabel baru hanya berisikan data-data dengna jenis kelamin (jenis_kel) =
“L” (laki-laki)
Maka kita dapat membangun tabel baru tersebut dengan SQL, tanpa harus mengentry ulang
data dengna perintah :
From mhs,dosen;
Where dosen.kd_dosen = mhs.kd_dosen;
and mhs.jenis_kel=”L”;
Into table2.dbf
Catatan :
• SQL bisa ditulis langsung pada layar command (secara interaktif).
• SQL dapat disimpan sebagai bagian dari alur program.
Pada foxpro perintah bisa juga dilakukan dengan meng-generate SQL dengan perintah query
sebagai berikut :
Maka akan tampil layar sebagai berikut (diasumsikan file mhs.dbf sudah ada)
28
MODUL VI
BUG SISTEM & PENANGANANNYA
1. Redudansi
Redudansi data didefinisikan sebagai kerangkapan data pada basis data kumpulan
data/file) dan bukan pada tabel.
Contoh :
Tabel 1 (mhs.dbf) tersusun atas field :
• No_Mhs
• Nama
• Alamat
• Jenis_kel
• Kd_dosen
• Nama_dosen *****
Pada tanda ***** (Nama_dosen) terdapat kerangkapan data, dimana seharusnya field
nama_dosen pada tabel 1 (mhs.dbf) dihilangkan, karena pada dasarnya nama_dosen pada tabel
1 dapat dicari dengan merelasikan field kd_dosen pada tabel 1 kepada field kd_dosen pada
tabel 2 sehingga didapat nilai nama_dosen.
29
Efek redudancy data tidak secara langsung akan merusak data, tetapi akan mengurangi nilai
efesiensi data yang berakibat pada pembengkakan ukuran file data.
Penanganan Redudancy Data biasanya dilakukan pada saat proses perancangan data itu
sendiri dengna melakukan normalisasi data.
2. Penghapusan data
Ada dua jenis penghapusan di dalam file data :
• Penghapusan dengan menandai record tetapi tidak dihapus secara fisik
Penghapusan seperti ini dilakukan dengan maksud agar data yang telah dihapus masih
dapat dipanggil ulang dengan perintah RECALL, karena pada dasarnya tidak setiap
record yang telah dihapus akan menjadi sampah, bahkan bisa saja suatu saat record
tersebut masih dibutuhkan untuk suatu proses.
Persoalan muncul ketika proses pencarian (baik terindex ataupun tidak) dilakukan tanpa
menambahkan logika data sudah terhapus atau belum terhapus. Karena ketika proses
pencarian, record yang sudah terhapus tetap saja merupakan bagian dari file data.
If found ()
Tampikan data
Endif
Maka data ‘Sigit’ yang sudah terhapus tetap akan ditampilkan, karena secara fisik belum
terhapus. Untuk menanganinya, perlu ditambahkan logika pada proses pencarian menjadi
‘jika ditemukan dan belum terhapus’, sintaksnya sebagai berikut :
Penghapusan seperti ini dilakukan dengan maksud agar data yang telah dihapus benar-benar
hilang secara fisik.
Dengan mengambil contoh tabel diatas (file mhs.dbf), perintah penghapusan secara fisik
dilakukan dengan sintaks :
Persoalan muncul ketika kita menjalankan aplikasi untuk multi user (dalam sebuah jaringan),
perintah Pack hanya bisa dilakukan secara exlusive (otoritas penuh pada file data atau dengan
kata lain file data hanyadapat diakses oleh satuorang dan yang lain harus menunggusampai
proses selesai).
Penanganan, penghapusan secara fisik hendaknya dilakukan secara hati-hati, dan dilakukan
pada saat pemeliharaan data, sehingga tidak menimbulkan gangguan bagi pemakai file data
lainnya.
Reindex adalah proses meng-index ulang data agar data dbf dan data index tetap sama,
sehingga data dbf dan data index menjadi konsisten, karena perbedaan antara data dbf dengan
data index akan menyebabkan program menjadi error.
Dikatakan sifat exclusive adalah bahwa suatu file hanyaboleh diakses oleh satu orang dan yang
lain harus menunggu. Sama dengan perintah pack, perintah reindex yang dilakukan secara
sembarangan akan mengakibatkan penolakan akses terhadap suatu file bagi pengguna file
lainnya, sehingga mengurangi nilai efesiensi.
Penanganan masalah ini adalah dengan memberikan waktu penuh bagi proses reindex yang
dilakukan oleh orang yang berwewenang, biasanya proses reindex dilakukan pada saat
pemeliharaan data, atau pada saat sistem sangan membutuhkan index file yang aktual.
Disinilah kita memerlukan penguncian file/record diperlukan, sehingga kasus diatas berubah
cerita menjadi
Sebelum si “A” sedang mengedit reocord “x” pada file mhs.dbf, si “A” harus mengunci record
“x” terlebih dahulu, sehingga pada saat si “B” akan menghapus record “x” tersebut, si “B”
harus menunggu proses penghapusan sampai si “A” selesai dan membuka penguncian terhadap
file / record
Penanganan masalah ini adalah seorang programmer harus selalu memahami proses dimana
yang bersifat kritis yang akan mengakibatkan prubahan fisik terhadap data (seperti proses edit,
hapus dan tambah). Akan lebih baik jika sistem yang dibangun mampu membagi otoritas atau
wewenang terhadap pengguna data sehingga tidak setiap pengguna data dapat secara langsung
menambah / mengedit /menghapus data.
5. Pemeliharaan data
Ketika kita membangun suatu sistem basis data dengan tingkat perubahan fisik data yang
sangat cepat (retail, banking, dan lain-lain), pemeliharaan data menjadi sesuatu yang sangat
mutlak dilakukan. Data yang tidak terpelihara akan lebih rentan dan mengakibatkan sistem
menjadi crash. Pemeliharaan data hendaknya dilakukan secara rutin dan dilakukan oleh orang
yang berwewenang atau orang yang punya otoritas.
• Backup Data
Proses backup data dilakukan dengan maksud agar sistem mempunyai data kedua
(secondary) yang dapat dijadikan sebagai data cadangan jika data utama (primary)
mengalami kerusakan fisik. Backup data pada sstem yang sangat besar biasanya
dilakukan secara berlapis (backup dilakukan tidak pada satu tempat / media)
32
• Restore Data
Merupakan kebalikan dari proses backup data, dimana data secondary dirubah menjadi data
primary. Restore data biasanya dilakukan ketika data primary mengalami kerusakan fisik.
• Reindex
(Seperti yang telah dijelaskan pada bagian sebelumnya).
MODUL VI
CONTOH KASUS
33
Struktur tabel :
******* TRANSAKSI.DBF
NO_NOTA CHARACTER 10
TANGGAL DATE 8
KD_TELLER CHARACTER 5
TOTAL NUMERIC 10
INDEX :
NO.NOTA CANDIDATE
******* TRANSAKSI.DBF
NO_NOTA CHARACTER 10
TANGGAL DATE 8
KD_TELLER CHARACTER 5
TOTAL NUMERIC 10
INDEX :
NO.NOTA CANDIDATE
******* DETAIL_TRANSAKSI.DBF
NO_NOTA CHARACTER 10
BARANG DATE 25
HARGA_SAT CHARACTER 10
VOLUME NUMERIC 5
JUMLAH NUMERIC 10
34
INDEX :
NO.NOTA REGULER
Modify Form :
****** * TRANSAKSI.SCX
NAMA = “FORM1”
AUTOCENTER = .T.
CAPTION = “TRANSAKSI PENJUALAN”
MODE = 0
PROCEDURE ACTIVATE
SELECT TRANSAKSI
&& HANYA TOMBOL TAMBAH DAN KELUAR SAJA YANG AKTIF
&& JIKA TABEL TIDAK BERISI RECORD.
IF EOF ()
THISFORM.SETALL (“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL (“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.TAMBAH.ENABLED=.T.
THISFORM.KELUAR.ENABLED=.T.
ELSE
THISFORM.SETALL (“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL (“ENABLED”,.T.,”COMMANDBUTTON”)
THISFORM.SIMPAN.ENABLED=.F.
THISFORM.BATAL.ENABLED=.F.
ENDIF
SCATTER MEMVAR
THISFORM.REFRESH ()
PROCEDURE INIT
SET TALK OFF
SET DELETED ON
NAME = “LABEL1”
AUTOSIZE = .T.
CAPTION = “NO NOTA”
NAME = “LABEL2”
35
AUTOSIZE = .T.
CAPTION = “TANGGAL”
NAME = “LABEL3”
AUTOSIZE = .T.
CAPTION = “KODE TELLER”
NAME = “LABEL4”
AUTOSIZE = .T.
CAPTION = “TOTAL”
NAME = “TXTNO_NOTA”
CONTROLSOURCE = “M.TANGGAL”
NAME = “TXTTANGGAL”
CONTROLSOURCE = “M.TANGGAL”
FORMAT = :E”
VALUE = {}
NAME = “TXTTELLER”
CONTROLSOURCE = “M.KD_TELLER”
NAME = “TXTTOTAL”
VALUE = 0
CONTROLSOURCE = “M.TOTAL”
ENABLED = .F.
INPUTMASK = “RP 9,999,999,999.-“
NAME = “GRID1”
COLUMNCOUNT = 4
CHILDORDER = “NO_NOTA”
DELETEMARK = .F.
LINKMASTER = “TRANSAKSI”
READONLY = .T.
RECORDSOURCE = “DETAIL_TRANSAKSI”
RELATIONALEXPR = “TRANSAKSI.”
SCROLLBARS = 2
36
COLUMN1.CONTROLSOURCE = “DETAIL_TRANSAKSI.BARANG”
NAME = “HEADER1”
CAPTION = “BARANG”
FONTBOLD = .T.
COLUMN2.CONTROLSOURCE = “DETAIL_TRANSAKSI.HARGA_SAT”
COLUMN2.INPUTMASK = “9,999,999,999.-“
NAME = “HEADER1”
CAPTION = “HARGA”
FONTBOLD = .T.
COLUMN3.CONTROLSOURCE = “DETAIL_TRANSAKSI.VOLUME”
NAME = “HEADER1”
CAPTION = “VOLUME”
FONTBOLD = .T.
COLUMN4.CONTROLSOURCE = “DETAIL_TRANSAKSI.JUMLAH”
COLUMN4.INPUTMASK = “9,999,999,999.-“
NAME = “HEADER1”
CAPTION = “JUMLAH”
FONTBOLD = .T.
NAME = “TAMBAH”
CAPTION = “\<TAMBAH”
PROCEDURE CLICK
SELECT TRANSAKSI
SCATTER MEMVAR BLANK
THISFORM.SETALL (“ENABLED”,.T.,”TEXTBOX)
THISFORM.SETALL (“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.TXTTOTAL.ENABLED=.F.
THISFORM.SIMPAN.ENABLED=.T.
THISFORM.BATAL.ENABLED=.T.
THISFORM.MODE=1
THISFORM.TXTNO_NOTA.SETFOCUS ()
THISFORM.REFRESH ()
NAME = “SIMPAN”
CAPTION = “\<SIMPAN”
PROCEDURE CLICK
SELECT TRANSAKSI
37
IF THISFORM.MODE=1
APPEND BLANK
ENDIF
GATHER MEMVAR
THISFORM.SETALL (“ENABLED”,.T.,”TEXTBOX”)
THISFORM.SETALL (“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.TXTTOTAL.ENABLED=.F.
THISFORM.SIMPAN.ENABLED=.T.
THISFORM.BATAL.ENABLED=.T.
THISFORM.MODE=1
THISFORM.TXTNO_NOTA.SETFOCUS ()
THISFORM.REFRESH ()
NAME = “BATAL”
CAPTION = “\<BATAL”
PROCEDURE CLICK
SELECT TRANSAKSI
SCATTER MEMVAR
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.T.,”COMMANDBUTTON”)
THISFORM.SIMPAN.ENABLED = .F.
THISFORM.BATAL.ENABLED = .F.
THISFORM.REFRESH()
IF EOF()
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”),.F.,”COMMANDBUTTON”)
THISFORM.TAMBAH.ENABLED=.T.
THISFORM.KELUAR.ENABLED=.T.
ENDIF
NAME = “EDIT”
CAPTION = “\<EDIT”
PROCEDURE CLICK
THISFORM.SETALL(“ENABLED”,.T.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.TXTTOTAL.ENABLED = .F.
THISFORM.SIMPAN.ENABLED = .T.
38
THISFORM.BATAL.ENABLED = .T.
THISFORM.MODE=0
THISFORM.TXTNO_NOTA.SETFOCUS()
THISFORM.REFRESH()
NAME = “AWAL”
CAPTION = “\<AWAL”
FONTBOLD = .T.
FONTNAME = “COURIER NEW”
PROCEDURE CLICK
SELECT TRANSAKSI
GO TOP
SCATTER MEMVAR
THISFORM.REFRESH()
NAME = “NAIK”
CAPTION = “\<NAIK”
FONTBOLD = .T.
FONTNAME = “COURIER NEW”
PROCEDURE CLICK
SELECT TRANSAKSI
SKIP -1
IF EOF()
=MESSAGEBOX(“INI RECORD YANG PALING AWAL”, 48,”PERHATIAN”)
GO TOP
ENDIF
SCATTER MEMVAR
THISFORM.REFRESH()
NAME = “TURUN”
CAPTION = “\<TURUN”
FONTBOLD = .T.
FONTNAME = “COURIER NEW”
PROCEDURE CLICK
SELECT TRANSAKSI
SKIP 1
IF EOF()
39
NAME = “AKHIR”
CAPTION = “\<AKHIR”
FONTBOLD = .T.
FONTNAME = “COURIER NEW”
PROCEDURE CLICK
SELECT TRANSAKSI
GO BOTTOM
SCATTER MEMVAR
THISFORM.REFRESH()
NAME = “HAPUS”
CAPTION = “\<HAPUS”
PROCEDURE CLICK
SELECT DETAIL_TRANSAKSI
DELETE ALL FOR DETAIL_TRANSAKSI.NO_NOTA = ALLTRIM(M.NO_NOTA)
SELECT TRANSAKSI
DELETE
THISFORM.TURUN.CLICK()
IF EOF()
THISFORM.SETALL(“ENABLED”,.F.,”TEXTBOX”)
THISFORM.SETALL(“ENABLED”,.F.,”COMMANDBUTTON”)
THISFORM.TAMBAH.ENABLED =.T.
THISFORM.KELUAR.ENABLED = .T.
ENDIF
NAME = “KELUAR”
CAPTION = “\<KELUAR”
PROCEDURE CLICK
THISFORM.RELEASE
NAME = “PLUS
CAPTION = “+”
40
NAME = “PLUS
CAPTION = “-”
FONTNAME= “COURIER NEW”
PROCEDURE CLICK
SELECT DETAIL_TRANSAKSI
DELETE
CALCULATE SUM(DETAIL_TRANSAKSI.JUMLAH);
FOR DETAIL_TRANSAKSI.NO_NOTA = ALLTRIM(M.NO_NOTA) TO A
THISFORM.TXTTOTAL.VALUE=A
SELECT TRANSAKSI
GATHER MEMVAR
SCATTER MEMVAR
THISFORM.REFRESH()
MODIFY FORM :
***************DETAIL_TRANSAKSI.SCX
NAME = “FORM1”
AUTOCENTER = .T.
CAPTION =”PENAMBAHAN”
WINDOWTYPE = 1
PROCEDURE INIT
PARAMETER A
SCATTER MEMVAR BLANK
41
THISFORM.TXTNO_NOTA.VALUE = A
NAME = “LABEL1”
AUTOSIZE = .T.
CAPTION =”NO NOTA”
NAME = “LABEL2”
AUTOSIZE = .T.
CAPTION =”BARANG”
NAME = “LABEL3”
AUTOSIZE = .T.
CAPTION =”HARGA SATUAN”
NAME = “LABEL4”
AUTOSIZE = .T.
CAPTION =”VOLUME”
NAME = “LABEL5”
AUTOSIZE = .T.
CAPTION =”JUMLAH”
NAME = “TXTNO_NOTA”
CONTROL SOURCE = “M.NO_NOTA”
NAME = “TXTBARANG”
CONTROL SOURCE = “M.BARANG”
NAME = “TXTHARGA_SAT”
CONTROL SOURCE = “M.HARGA_SAT”
INPUTMASK = “RP 9,999,999,999,-“
VALUE = 0
NAME = “TXTVOLUME”
VALUE = 0
PROCEDURE INTERACTIVECHANGE
THISFORM.TXTJUMLAH.VALUE =
THISFORM.TXTHARGA_SAT.VALUE*THIS.VALUE
42
NAME = “TXTJUMLAH”
CONTROL SOURCE = “M.JUMLAH”
INPUTMASK = “RP 9,999,999,999,-“
VALUE = 0
NAME = “OK”
CAPTION = “\<OK”
PROCEDURE CLICK
THISFORM INTO DETAIL_TRANSAKSI;
VALUES (M.NO_NOTA,M.BARANG.M.HARGA_SAT,M.VOLUME,M.JUMLAH)
THISFORM.RELEASE
NAME = “BATAL”
CAPTION = “\<BATAL”
PROCEDURE CLICK
THISFORM.RELEASE