Foreign Key kdBarang references HargaBeli (kdBarang)
Foreign Key kdSupplier references HargaBeli (kdSupplier)
Tabel 4.6 Dokumentasi relasi dan atribut foreign key pada tahap penurunan relasi model data logikal
No. Relations
1. Pelanggan (kdPelanggan, nama, alamat, kota, telp, fax, HP, blacklist, KTP, jenisPelanggan)
Primary Key kdPelanggan
2. DetailMember (noMember, tglMasuk, tglJatuhTempo, status, kdPelanggan) Primary Key noMember
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) 3. Mobil (noPlat, tipe, warna, tahun, kilometer, status, kdPelanggan)
Primary Key noPlat
Foreign Key kdPelanggan references Pelanggan (kdPelanggan)
4. RegistrasiMember (noRegistrasi, tanggal, jmlhBayar, kdPelanggan, kdKaryawan)
Primary Key noRegistrasi
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) Foreign Key kdKaryawan references Karyawan (kdKaryawan)
No. Relations
piutang, kdPelanggan, noPlat, kdKasir, kdMontir, noDO) Primary Key noFaktur
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) Foreign Key noPlat references Mobil (noPlat)
Foreign Key kdKasir references Karyawan (kdKaryawan) Foreign Key kdMontir references Karyawan (kdKaryawan) Foreign Key noDO references DeliveryOrder (noDO) 6. DetailPenjualan (noFaktur, kdBarang, qty, hargaJual)
Primary Key noFaktur, kdBarang
Foreign Key noFaktur references FakturPenjualan (noFaktur) Foreign Key kdBarang references Barang (kdBarang)
7. DeliveryOrder (noDO, tanggal, status, kdPelanggan, kdKasir, kdGudang, kdSupir)
Primary Key noDO
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) Foreign Key kdKasir references Karyawan (kdKaryawan) Foreign Key kdGudang references Karyawan (kdKaryawan) Foreign Key kdSupir references Karyawan (kdKaryawan) 8. DetailDO (noDO, kdBarang, qty)
Primary Key noDO, kdBarang
Foreign Key noDO references DeliveryOrder (noDO) Foreign Key kdBarang references Barang (kdBarang)
No. Relations
9. Karyawan (kdKaryawan, nama, alamat, kota, telp, fax, HP, KTP, tglLahir, status, kdDivisi)
Primary Key kdKaryawan
Foreign Key kdDivisi references Divisi (kdDivisi) 10. Divisi (kdDivisi, divisi)
Primary Key kdDivisi
11. PelunasanPiutang (noPelunasan, tanggal, jmlhBayar, noFaktur, kdKaryawan) Primary Key noPelunasan
Foreign Key noFaktur references FakturPenjualan (noFaktur) Foreign Key kdKaryawan references Karyawan (kdKaryawan) 12. JenisBarang (kdJenisBarang, jenisBarang)
Primary Key kdJenisBarang
13. Barang (kdBarang, namaBarang, hargaJual, stok, stokMin, stokMax, kdJenisBarang)
Primary Key kdBarang
Foreign Key kdJenisBarang references JenisBarang (kdJenisBarang) 14. HargaBeli (kdBarang, kdSupplier, hargaBeli, kurs)
Primary Key kdBarang, kdSupplier
Foreign Key kdBarang references Barang (kdBarang) Foreign Key kdSupplier references Supplier (kdSupplier)
15. Pembelian (noPO, tanggalPO, status, kdKasirPO, kdSupplier, noFaktur, tanggalFB, kurs, total, jmlhBayar, utang, kdKasirFB)
No. Relations
Primary Key noPO
Foreign Key kdKasirPO references Karyawan (kdKaryawan) Foreign Key kdKasirFB references Karyawan (kdKaryawan) Foreign Key kdSupplier references Supplier (kdSupplier) 16. DetailPO (noPO, kdBarang, qty)
Primary Key noPO, kdBarang
Foreign Key noPO references PurchaseOrder (noPO) Foreign Key kdBarang references Barang (kdBarang)
17. DetailPembelian (noPO, kdBarang, kdSupplier, hargaBeli, qty) Primary Key noPO, kdBarang, kdSupplier
Foreign Key noPO references Pembelian (noPO)
Foreign Key kdBarang references HargaBeli (kdBarang) Foreign Key kdSupplier references HargaBeli (kdSupplier)
18. Supplier (kdSupplier, namaPerusahaan, alamat, kota, telp, fax, HP, contactPerson, status)
Primary Key kdSupplier
19. PelunasanUtang (noPelunasan, tanggal, jmlhBayar, kdKaryawan, noFaktur) Primary Key noPelunasan
Foreign Key kdKaryawan references Karyawan (kdKaryawan) Foreign Key noFaktur references Pembelian (noFaktur)
4.1.2.2. Validasi relasi menggunakan normalisasi
Tujuan normalisasi adalah memastikan tiap-tiap relasi memiliki jumlah atribut minimal yang dapat mendukung kebutuhan data perusahaan, dan memiliki redundansi data yang minimal di dalamnya. Namun perlu ditekankan bahwa redundansi yang minimal diperlukan untuk meningkatkan kinerja basisdata dalam pencarian data. Berdasarkan langkah-langkah perancangan basisdata yang telah dilakukan, mayoritas relasi-relasi yang terbentuk telah memenuhi kriteria normalisasi sampai pada tahap 3NF, namun masih ada beberapa relasi yang memerlukan validasi menggunakan normalisasi.
Pelanggan
3NF: kdPelanggan + nama + alamat + kota + telp + fax + HP + blacklist + KTP + jenisPelanggan
Ket: jenisPelanggan tidak dibedakan menjadi entitas baru, karena jumlah jenisPelanggan sedikit (4 jenis) dan tidak akan bertambah di masa yang akan datang.
DetailMember
UNF: noMember + nama + alamat + kota + telp + fax + HP + blacklist + KTP + tglMasuk + tglJatuhTempo + status
1NF: noMember + kdPelanggan + nama + alamat + kota + telp + fax + HP + blacklist + KTP + tglMasuk + status
2NF: noMember + kdPelanggan +nama + alamat + kota + telp + fax + HP + blacklist + KTP + tglMasuk + status
3NF:
DetailMember: noMember + tglMasuk + status + kdPelanggan Pelanggan: kdPelanggan + nama + alamat + kota + telp + fax + HP + blacklist + KTP + jenisPelanggan
Mobil
3NF: noPlat + tipe + warna + tahun + kilometer + status + kdPelanggan
Divisi
3NF: kdDivisi + divisi
Karyawan
3NF: kdKaryawan + nama + alamat + kota + telp + fax + HP + KTP + tglLahir + status + kdDivisi
RegistrasiMember
3NF: noRegistrasi + tanggal + jmlhBayar + kdPelanggan + kdKaryawan
JenisBarang
Barang
3NF: kdBarang + namaBarang + hargaJual + stok + stokMin + stokMax + kdJenisBarang
DeliveryOrder
3NF: noDO + tanggal + status + kdPelanggan + kdKasir + kdGudang + kdSupir
Ket: kdKasir, kdGudang, dan kdSupir merupakan referensi ke table Karyawan (kdKaryawan)
DetailDO
3NF: noDO + kdBarang + qty
FakturPenjualan
UNF: noFaktur + tanggal + nama + alamat + kota + jenisPelanggan + {namaBarang + hargaJual + qty +subtotal} + diskon + biayaServis + total + jmlhBayar + piutang + noPlat + tipe + kilometer + namaKasir + namaMontir + noDO
1NF: noFaktur + tanggal + kdPelanggan + nama + alamat + kota + jenisPelanggan + kdBarang + namaBarang + hargaJual + qty + diskon + biayaServis + jmlhBayar + piutang + noPlat + tipe + kilometer + kdKaryawan1 + nama1 + kdKaryawan2 + nama2 + noDO
FakturPenjualan: noFaktur + tanggal + kdPelanggan + nama + alamat + kota + jenisPelanggan + diskon + biayaServis + jmlhBayar + piutang + noPlat + tipe + kilometer + kdKaryawan1 + nama1 + kdKaryawan2 + nama2 + noDO
Barang: kdBarang + namaBarang
DetailPenjualan: noFaktur + kdBarang + hargaJual + qty 3NF:
FakturPenjualan: noFaktur + tanggal + diskon + biayaServis + jmlhBayar + piutang + noPlat + kdKasir + kdMontir + noDO + kdPelanggan
Pelanggan: kdPelanggan + nama + alamat + kota + jenisPelanggan
DeliveryOrder: noDO
Mobil: noPlat + tipe + kilometer Karyawan: kdKaryawan + nama
Barang: kdBarang + namaBarang + hargaJual
DetailPenjualan: noFaktur + kdBarang + hargaJual + qty Ket:
1. kdKasir dan kdMontir merupakan referensi ke tabel Karyawan (kdKaryawan)
2. Walaupun atribut piutang dapat dihitung dari total penjualan dikurangi dengan jumlah pembayaran, atribut piutang juga digunakan untuk memantau sisa piutang pelanggan. Atribut tersebut akan di-update setiap kali pelanggan melakukan
cicilan piutang, sehingga atribut tersebut perlu dimasukkan ke dalam basisdata.
3. Atribut hargaJual dimasukkan ke dalam relasi DetailPenjualan karena harga jual suatu barang bisa berubah di masa yang akan datang.
DetailPenjualan
3NF: noFaktur + kdBarang + hargaJual + qty
PelunasanPiutang
3NF: noPelunasan + tanggal + jmlhBayar + noFaktur + kdKaryawan
Supplier
3NF: kdSupplier + namaPerusahaan + alamat + kota + telp + fax + HP + contactPerson + status
HargaBeli
3NF: kdBarang + kdSupplier + hargaBeli + kurs
Pembelian
UNF: noFaktur + tanggal + namaPerusahaan + alamat + kota + kurs + {namaBarang + hargaBeli + qty + subtotal} + total + jmlhBayar + utang + namaKasir + noPO
1NF: noFaktur + tanggal + kdSupplier1 + namaPerusahaan + alamat + kota + kurs + kdSupplier2 + kdBarang + namaBarang + hargaBeli + qty + jmlhBayar + utang + kdKaryawan + nama + noPO
Ket: kdSupplier1 berfungsi untuk menentukan perusahaan yang menjadi supplier, sedangkan kdSupplier2 berfungsi untuk menentukan hargaBeli barang.
2NF:
Pembelian: noFaktur + tanggal + noPO + kdSupplier + namaPerusahaan + alamat + kota + kurs + jmlhBayar + utang + kdKaryawan + nama
Barang: kdBarang + namaBarang
HargaBeli: kdBarang + kdSupplier + hargaBeli
DetailPembelian: noPO + kdBarang + kdSupplier + qty + hargaBeli
3NF:
Pembelian: noFaktur + tanggalFB + noPO + kurs + jmlhBayar + utang + kdKasirFB
PurchaseOrder: noPO + kdSupplier
Supplier: kdSupplier + namaPerusahaan + alamat + kota Barang: kdBarang + namaBarang
HargaBeli: kdBarang + kdSupplier + hargaBeli
DetailPembelian: noPO + kdBarang + kdSupplier + qty + hargaBeli
Karyawan: kdKaryawan + nama Ket:
1. Walaupun atribut utang dapat dihitung dari total pembelian dikurangi dengan jumlah pembayaran, atribut utang juga digunakan untuk memantau sisa utang terhadap supplier. Atribut tersebut akan di-update setiap kali perusahaan melakukan cicilan utang, sehingga atribut tersebut perlu dimasukkan ke dalam basisdata.
2. Atribut hargaBeli dimasukkan ke dalam relasi DetailPembelian karena harga beli suatu barang bisa berubah di masa yang akan datang.
DetailPO
3NF: noPO + kdBarang + qty
DetailPembelian
3NF: noPO + kdBarang + kdSupplier + hargaBeli + qty
PelunasanUtang
3NF: noPelunasan + tanggal + jmlhBayar + kdKaryawan + noFaktur
4.1.2.3. Validasi relasi terhadap transaksi user
Tujuan langkah ini adalah untuk memastikan model data logikal mendukung transaksi-transaksi yang diperlukan perusahaan. Transaksi-transaksi yang diperlukan dalam prosedur pembelian, persediaan, dan penjualan antara lain:
Data entry
Memasukkan data pelanggan baru.
Memasukkan data transaksi registrasi member baru, memasukkan detail member baru, dan update jenis pelanggan menjadi member. Memasukkan data mobil yang dimiliki pelanggan.
Memasukkan data karyawan baru. Memasukkan divisi baru.
Memasukkan data supplier baru. Memasukkan data barang baru. Memasukkan jenis barang baru.
Menambah barang yang dijual oleh suatu supplier.
Memasukkan data transaksi registrasi member seorang pelanggan yang sudah pernah menjadi member sebelumnya, mengupdate detail member, dan mengubah jenis pelanggan menjadi member. Memasukkan data delivery order.
Memasukkan data transaksi penjualan non servis, update stok barang, dan update status delivery order menjadi ‘processed’ jika faktur memiliki referensi pada suatu delivery order.
Memasukkan data transaksi penjualan servis, update stok barang, dan update atribut kilometer pada mobil yang diservis.
Memasukkan data transaksi pelunasan piutang, dan update atribut jumlah piutang pada faktur penjualan yang dilunasi.
Memasukkan data purchase order.
Memasukkan data transaksi pembelian, update stok barang, dan update status purchase order yang direferensikan menjadi ‘processed’.
Memasukkan data transaksi pelunasan utang dan update atribut jumlah utang pada faktur pembelian yang dilunasi.
Data update/ deletion
Update data pelanggan. Update data supplier. Update data karyawan. Update data mobil. Update data barang.
Update status blacklist pelanggan menjadi ‘Y’ jika pelanggan memiliki faktur penjualan yang belum dilunasi selama 1 bulan sejak tanggal pembuatan faktur.
Update status member menjadi ‘S’ jika masa jatuh tempo seorang member sudah lewat.
Update barang.
Delete data Faktur Penjualan. Update/ delete data Purchase Order.
Data queries
a. Menampilkan pelanggan-pelanggan member yang masa berlaku membernya akan habis dalam jangka waktu 1 bulan ke depan
b. Menampilkan data suatu registrasi member tertentu secara mendetail
c. Menampilkan daftar registrasi member beserta nama pelanggan yang melakukan registrasi
d. Menampilkan data delivery order tertentu
e. Menampilkan daftar delivery order beserta nama pelanggannya, diurut berdasarkan nomor DO
f. Menampilkan daftar delivery order yang memiliki status ’queue’ beserta nama pelanggannya, diurut berdasarkan nomor DO
g. Menampilkan daftar barang yang jumlah on hand stock-nya sudah mencapai jumlah stok minimum
h. Menampilkan data faktur penjualan tertentu
i. Menampilkan daftar faktur penjualan beserta nama pelanggan yang melakukan transaksi, diurut berdasarkan nomor faktur
j. Menampilkan daftar faktur penjualan yang belum lunas beserta nama pelanggannya diurut berdasarkan nomor faktur penjualan
k. Menampilkan sejarah penjualan terhadap suatu customer l. Menampilkan sejarah perbaikan terhadap suatu mobil
m. Menampilkan daftar mobil yang pernah ditangani seorang kepala montir
n. Menampilkan data purchase order tertentu
o. Menampilkan daftar purchase order beserta nama suppliernya, diurut berdasarkan nomor PO
p. Menampilkan daftar purchase order yang memiliki status ’queue’ beserta nama suppliernya, diurut berdasarkan nomor PO
q. Menampilkan data faktur pembelian tertentu
r. Menampilkan daftar faktur pembelian beserta nama suppliernya, diurut berdasarkan nomor faktur pembelian
s. Menampilkan daftar faktur pembelian yang belum lunas beserta nama suppliernya, diurut berdasarkan nomor faktur pembelian
t. Menampilkan data pelunasan piutang tertentu
u. Menampilkan daftar transaksi pelunasan piutang beserta nama pelanggan yang melakukan transaksi pelunasan, diurut berdasarkan nomor pelunasan piutang
w. Menampilkan daftar transaksi pelunasan utang beserta nama supplier yang dilunasi, diurut berdasarkan nomor pelunasan utang
x. Menampilkan barang-barang yang dijual supplier tertentu y. Menampilkan daftar mobil yang dimiliki seorang pelanggan z. Menampilkan barang berdasarkan jenis barangnya
aa. Menampilkan karyawan berdasarkan divisinya
bb. Menampilkan laporan penjualan selama periode tertentu cc. Menampilkan laporan pembelian selama periode tertentu dd. Menampilkan laporan pemasukan dan pengeluaran selama
4.1.2.4. Memeriksa integrity constraints
Tujuan langkah ini adalah untuk merepresentasikan integrity constraint pada relasi model data logikal. Ada beberapa pertimbangan dalam merepresentasikan integrity constraint, yaitu :
1. Required data: Memastikan atribut-atribut tertentu yang tidak diperbolehkan bernilai null. Batasan ini sudah dipenuhi pada langkah 4.1.1.3, yaitu tahap identifikasi dan asosiasi atribut dengan entitas atau relationship tertentu.
2. Attribute domain constraints: Menentukan domain (Nilai yang diperbolehkan) untuk tiap-tiap atribut. Batasan ini sudah dipenuhi pada langkah 4.1.1.4, yaitu tahap menentukan domain atribut.
3. Multiplicity: Merupakan batasan jumlah yang ditempatkan pada hubungan antar data di dalam basisdata. Batasan ini sudah dipenuhi pada langkah 4.1.1.2, yaitu tahap identifikasi tipe hubungan (relationship).
4. Entity Integrity: Memastikan primary key suatu entitas tidak bernilai null. Batasan ini sudah dipenuhi pada langkah 4.1.1.5, yaitu tahap menentukan atribut candidate, alternate, dan primary key.
5. Referential Integrity: Memastikan nilai yang tersimpan dalam atribut foreign key, menunjuk row tertentu pada parent entity-nya. Pelaksanaan batasan ini akan dibahas lebih lanjut.
6. General Constraints: Batasan yang berasal dari persyaratan-persyaratan bisnis perusahaan. Penanganan general constraints akan dibahas lebih lanjut.
Ada dua hal mengenai foreign key yang perlu diperhatikan. Hal pertama adalah kemungkinan foreign key bernilai null. Hal ini ditentukan oleh batasan partisipasi foreign key tersebut, apakah bersifat mandatory atau optional. Dalam kasus ini, ditemukan empat foreign key yang bersifat optional, yaitu kdGudang pada entitas DeliveryOrder, kdSupir pada entitas DeliveryOrder, NoPlat pada entitas FakturPenjualan, dan noDO pada entitas FakturPenjualan. Maka, keempat foreign key tersebut bisa bernilai null.
Hal kedua adalah bagaimana menjamin referential integrity. Yaitu dengan membuat existence constraints, yang menentukan tindakan apa yang diambil saat suatu baris di parent entity yang menjadi referensi untuk foreign key di entitas lain mengalami update atau delete. Tabel relasi berikut menggambarkan referential integrity pada relasi-relasi yang telah terbentuk:
Tabel 4.7 Tabel relasi dengan referential integrity No. Relations
1. Pelanggan (kdPelanggan, nama, alamat, kota, telp, fax, HP, blacklist, KTP, jenisPelanggan)
Primary Key kdPelanggan
2. DetailMember (noMember, tglMasuk, tglJatuhTempo, status, kdPelanggan) Primary Key noMember
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION
3. Mobil (noPlat, tipe, warna, tahun, kilometer, status, kdPelanggan) Primary Key noPlat
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION
4. RegistrasiMember (noRegistrasi, tanggal, jmlhBayar, kdPelanggan, kdKaryawan)
Primary Key noRegistrasi
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdKaryawan references Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION
5. FakturPenjualan (noFaktur, tanggal, diskon, biayaServis, total, jmlhBayar, piutang, kdPelanggan, noPlat, kdKasir, kdMontir, noDO)
No. Relations
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key noPlat references Mobil (noPlat)
Foreign Key kdKasir references Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdMontir references Karyawan (kdKaryawan Foreign Key noDO references DeliveryOrder (noDO) 6. DetailPenjualan (noFaktur, kdBarang, qty, hargaJual)
Primary Key noFaktur, kdBarang
Foreign Key noFaktur references FakturPenjualan (noFaktur) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdBarang references Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION
7. DeliveryOrder (noDO, tanggal, status, kdPelanggan, kdKasir, kdGudang, kdSupir)
Primary Key noDO
Foreign Key kdPelanggan references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdKasir references Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdGudang references Karyawan (kdKaryawan) Foreign Key kdSupir references Karyawan (kdKaryawan)
No. Relations
8. DetailDO (noDO, kdBarang, qty) Primary Key noDO, kdBarang
Foreign Key noDO references DeliveryOrder (noDO) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdBarang references Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION
9. Karyawan (kdKaryawan, nama, alamat, kota, telp, fax, HP, KTP, tglLahir, status, kdDivisi)
Primary Key kdKaryawan
Foreign Key kdDivisi references Divisi (kdDivisi) ON UPDATE CASCADE ON DELETE NO ACTION
10. Divisi (kdDivisi, divisi) Primary Key kdDivisi
11. PelunasanPiutang (noPelunasan, tanggal, jmlhBayar, noFaktur, kdKaryawan) Primary Key noPelunasan
Foreign Key noFaktur references FakturPenjualan (noFaktur) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdKaryawan references Karyawan (kdKaryawan) 12. JenisBarang (kdJenisBarang, jenisBarang)
Primary Key kdJenisBarang
13. Barang (kdBarang, namaBarang, hargaJual, stok, stokMin, stokMax, kdJenisBarang)
No. Relations
Primary Key kdBarang
Foreign Key kdJenisBarang references JenisBarang (kdJenisBarang) ON UPDATE CASCADE ON DELETE NO ACTION
14. HargaBeli (kdBarang, kdSupplier, hargaBeli, kurs) Primary Key kdBarang, kdSupplier
Foreign Key kdBarang references Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdSupplier references Supplier (kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION
15. Pembelian (noPO, tanggalPO, status, kdKasirPO, kdSupplier, noFaktur, tanggalFB, kurs, total, jmlhBayar, utang, kdKasirFB)
Primary Key noPO
Foreign Key kdKasirPO references Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdKasirFB references Karyawan (kdKaryawan)
Foreign Key kdSupplier references Supplier (kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION
16. DetailPO (noPO, kdBarang, qty) Primary Key noPO, kdBarang
Foreign Key noPO references PurchaseOrder (noPO) ON UPDATE CASCADE ON DELETE NO ACTION
No. Relations
CASCADE ON DELETE NO ACTION
17. DetailPembelian (noPO, kdBarang, kdSupplier, hargaBeli, qty) Primary Key noPO, kdBarang, kdSupplier
Foreign Key noPO references Pembelian (noPO) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdBarang references HargaBeli (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key kdSupplier references HargaBeli (kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION
18. Supplier (kdSupplier, namaPerusahaan, alamat, kota, telp, fax, HP, contactPerson, status)
Primary Key kdSupplier
19. PelunasanUtang (noPelunasan, tanggal, jmlhBayar, kdKaryawan, noFaktur) Primary Key noPelunasan
Foreign Key kdKaryawan references Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION
Foreign Key noFaktur references Pembelian (noFaktur)
4.1.2.5. Melakukan review model data logikal dengan user
Untuk menyelesaikan tahap ini, perlu dilakukan review model data logikal yang telah dibuat dengan pengguna untuk memastikan bahwa model data logikal yang dibuat telah
memenuhi semua persyaratan data pengguna. Untuk itu, maka dilakukan diskusi dengan perwakilan perusahaan dan telah disetujui bahwa model data logikal telah memenuhi semua persyaratan yang diperlukan oleh perusahaan, mulai dari proses pembelian, proses persediaan, dan proses penjualan.
4.1.2.6. Mempertimbangkan perkembangan di masa depan
Tujuan dari langkah ini adalah untuk menentukan apakah ada terjadi perubahan yang signifikan di masa yang akan datang, dan apakah model data logikal sudah bisa mengakomodasi perubahan tersebut. Dengan melakukan diskusi dengan perwakilan perusahaan, telah disetujui bahwa model data logikal telah dapat mengakomodasi perubahan-perubahan yang mungkin terjadi di masa depan, yaitu kemungkinan adanya penambahan divisi, penambahan jenis barang, dan kemungkinan adanya kebutuhan akan laporan penjualan atau pembelian berdasarkan kriteria tertentu.
4.1.2.7. Pemilihan Database Management System (DBMS)
Untuk pemilihan DBMS diperlukan beberapa pertimbangan. Berikut ini akan dibandingkan antara penggunaan SQL Server 2000, Oracle 9i, dan MySQL v4.1. Tabel berikut adalah tabel perbandingan dalam hal spesifikasi perangkat keras yang diperlukan SQL Server 2000, Oracle 9i, dan MySQL v4.1.
Tabel 4.8 Spesifikasi perangkat keras SQL Server 2000 (sumber : www.mssqlcity.com)
Hardware Requirements Processor Pentium 166MHz or higher
Memory 32MB RAM (Minimum) 64MB RAM
128MB RAM or more recommended Hardisk Space 270MB (Full installation)
250MB (Typical) 95MB (Minimum) Desktop engine : 44MB
Analysis services : 50MB (Minimum) 130MB (Typical)
English query : 80MB
Tabel 4.9 Spesifikasi perangkat keras Oracle 9i (sumber : www.mssqlcity.com)
Hardware Requirements Processor Pentium 166MHz or higher
Memory RAM : 128MB (256 recommended)
Virtual memory : Initial size 200MB, maximum size 400MB
Hardisk Space 140MB on the system drive
Plus 4.5GB for Oracle Home Drive (FAT) or 2.8GB for Oracle Home Drive (NTFS)
Tabel 4.10 Spesifikasi perangkat keras MySQL v4.1 (sumber : www.mssqlcity.com)
Hardware Requirements Processor Pentium 166MHz or higher
Memory RAM : 32MB Hardisk Space 60MB
Performa dari basisdata bergantung dari pengguna basisdata, pengembang basisdata, dan administrator basisdata. Bukan dari penyedia DBMS. Baik SQL Server 2000, Oracle 9i, dan MySQL v4.1, ketiganya dapat digunakan untuk membuat suatu basisdata yang stabil dan efisien. Tabel berikut akan menjelaskan fitur-fitur yang terdapat pada SQL Server 2000, Oracle 9i, dan MySQL v4.1. Dialek SQL yang didukung oleh Microsoft SQL Server 2000 dinamakan T-SQL, sedangkan dialek SQL yang didukung oleh Oracle 9i dinamakan PL/ SQL, dan dialek SQL yang didukung oleh MySQL v4.1 dinamakan MySQL dialect.
Tabel 4.11 Fitur-fitur SQL Server 2000 dan Oracle 9i (sumber : www.mssqlcity.com)
Feature T-SQL PL/ SQL
Index B-Tree Indexes B-Tree Indexes, Bitmap Indexes, Partitioned Indexes, Function-based Indexes, Domain Indexes
Partitioned tables Object tables, Temporary tables, Partitioned tables, External tables, Index organized tables Triggers AFTER triggers,
INSTEAD OF triggers
BEFORE triggers, AFTER triggers, INSTEAD OF triggers, Database Event triggers Procedures T-SQL Statements PL/ SQL Statements,
Java methods,
3rd Generation Language (3GL) routines
Arrays Not supported Supported
Tabel 4.12 Fitur-fitur SQL Server 2000 dan MySQL v4.1 (sumber : www.mssqlcity.com)
Feature T-SQL MySQL dialect
Views General Views, Indexed Views, Distributed Partitioned Views
Not supported
Triggers AFTER triggers, INSTEAD OF triggers
Not supported
Procedures T-SQL Statements Not supported User-defined functions Scalar functions, Inline table-valued functions, Multistatement table-valued functions C, C++ external libraries
Foreign Keys Supported Supported for only InnoDB tables
Cursors Supported Not supported Arrays Not supported Supported
Tabel 4.13 Limit dari SQL Server 2000 dan Oracle 9i (sumber : www.mssqlcity.com)
Feature SQL Server 2000 Oracle 9i Database name length
Column name length Index name length Table name length View name length
Stored procedure name length Max columns per index Max char() size
Max varchar() size Max columns per table Max table row length Max query size Recursive subqueries 128 128 128 128 128 128 16 8000 8000 1024 8036 16777216 40 8 30 30 30 30 30 32 2000 4000 1000 255000 16777216 64
Tabel 4.14 Limit dari SQL Server 2000 dan MySQL v4.1 (sumber : www.mssqlcity.com)
Feature SQL Server 2000 MySQL v4.1 Column name length
Index name length Table name length Max indexes per table Index length 128 128 128 250 900 64 64 64 32 1024
Max index column length Column per index
Max char() size Max varchar() size Max blob size
Max columns per table Max table row length Longest SQL statement 900 16 8000 8000 2147483647 1024 8036 16777216 255 16 1048543 1048543 1048543 2599 65534 1048574
Tabel 4.15 Perbandingan harga SQL Server 2000 dan Oracle 9i (sumber : www.mssqlcity.com)
Number of CPU’s SQL Server 2000 Oracle 1 2 4 8 16 32 $4,999 $9,998 $19,996 $39,992 $79,984 $159,968 $15,000 $30,000 $60,000 $120,000 $240,000 $480,000
Sedangkan MySQL v4.1 merupakan software Open Source/ produk free software, dibawah persetujuan GNU General Public License.
Dari beberapa perbandingan diatas dapat ditarik kesimpulan yaitu dengan menggunakan SQL Server 2000 maka biaya yang dikeluarkan lebih murah dibanding menggunakan Oracle 9i; SQL Server 2000 juga mudah di install dan mudah digunakan;
sedangkan apabila dibandingkan dengan MySQL v4.1, T-SQL memiliki kemampuan yang lebih baik daripada MySQL dialect.
Keuntungan Oracle 9i yaitu dapat berjalan di semua platform, dan dilihat dari dialek SQL yang didukung Oracle 9i yaitu PL/ SQL yang memiliki kemampuan lebih baik daripada dialek SQL yang didukung Microsoft SQL Server 2000 yaitu T-SQL.
Sedangkan keuntungan MySQL v4.1 yaitu dapat berjalan di semua platform, kebutuhan kapasitas hardware yang lebih rendah daripada SQL Server 2000, dapat digunakan tanpa perlu membayar (free software).
Maka dari kesimpulan diatas, dipilihlah Microsoft SQL Server 2000 sebagai DBMS untuk penulisan skripsi ini.
4.1.3. Perancangan Basisdata Fisikal
Perancangan basisdata fisikal merupakan proses pembuatan deskripsi implementasi basisdata pada secondary storage, mencakup relasi-relasi dasar, organisasi file, dan index yang digunakan untuk mencapai akses data yang efisien, beserta semua integrity constraints, dan langkah-langkah yang dilakukan untuk menjamin keamanan data. Perancangan basisdata fisikal terdiri dari beberapa langkah, yaitu :
1. Menerjemahkan model data logikal untuk DBMS yang digunakan a. Merancang relasi dasar
c. Merancang general constraints 2. Merancang organisasi file dan index
a. Menganalisa transaksi b. Memilih organisasi file c. Memilih index
d. Memperkirakan kebutuhan disk space 3. Merancang view pengguna
4. Merancang mekanisme keamanan
4.1.3.1. Menerjemahkan model data logikal untuk DBMS yang digunakan
Tujuan langkah ini adalah untuk menghasilkan skema basisdata relasional dari model data logikal yang dapat diterapkan pada DBMS yang akan digunakan.
4.1.3.1.1. Merancang relasi dasar
Tujuan langkah ini adalah untuk menentukan bagaimana representasi relasi dasar, yang telah diidentifikasi pada model data logikal, di dalam DBMS yang akan digunakan. Berikut ini adalah Database Definition Language (DBDL) untuk masing-masing relasi dengan dasar penggunaan SQL Server 2000 sebagai DBMS.
Tabel 4.16 Database Definition Language untuk relasi dasar Domain KodeMaster : integer with identity function
Domain NomorMember : fixed length character string, length 9 Domain KodeTransaksi : fixed length character string, length 10 Domain KodeForeign : integer
Domain Nama : variable length character string, length 25 Domain NamaPerusahaan : variable length character string, length 50 Domain NamaBarang : variable length character string, length 300 Domain Jenis : variable length character string, length 40 Domain Alamat : variable length character string, length 100 Domain Kota : variable length character string, length 15 Domain NomorTelepon : variable length character string, length 15 Domain NomorPlat : variable length character string, length 10 Domain WarnaMobil : variable length character string, length 15 Domain TipeMobil : variable length character string, length 20 Domain KilometerMobil : integer
Domain JumlahBarang : small integer
Domain StatusBlacklist : single character, must be one of ‘Y’ or ‘N’ Domain Status : single character, must be one of ‘A’ or ‘S’ Domain StatusProses : single character, must be one of ‘Q’ or ‘P’ Domain NomorKTP : variable length character string, length 20 Domain Tanggal : datetime
Domain Uang : monetary value
Domain Kurs : fixed length character string, length 3 must be one of ‘IDR’ or ‘USD’
1. Pelanggan (
kdPelanggan KodeMaster NOT NULL,
nama Nama NOT NULL,
alamat Alamat ,
kota Kota,
telp NomorTelepon,
fax NomorTelepon,
HP NomorTelepon,
blacklist StatusBlacklist NOT NULL DEFAULT ‘N’,
KTP NomorKTP,
jenisPelanggan Jenis NOT NULL, PRIMARY KEY (kdPelanggan) );
2. DetailMember (
noMember NomorMember NOT NULL,
tglMasuk Tanggal NOT NULL,
tglJatuhTempo Tanggal NOT NULL,
status Status NOT NULL DEFAULT ‘A’, kdPelanggan KodeForeign NOT NULL,
FOREIGN KEY (kdPelanggan) REFERENCES Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION );
3. Mobil (
noPlat NomorPlat NOT NULL,
tipe TipeMobil NOT NULL,
warna WarnaMobil,
tahun Tahun,
kilometer KilometerMobil,
status Status NOT NULL DEFAULT ‘A’, kdPelanggan KodeForeign NOT NULL,
PRIMARY KEY (noPlat),
FOREIGN KEY (kdPelanggan) references Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION );
4. Divisi (
kdDivisi KodeMaster NOT NULL,
divisi Jenis NOT NULL,
PRIMARY KEY (kdDivisi) );
5. Karyawan (
kdKaryawan KodeMaster NOT NULL,
nama Nama NOT NULL,
kota Kota,
telp NomorTelepon,
fax Nomor Telepon,
HP Nomor Telepon,
KTP NomorKTP,
tglLahir Tanggal,
status Status NOT NULL DEFAULT ‘A’, kdDivisi KodeForeign NOT NULL,
PRIMARY KEY (kdKaryawan),
FOREIGN KEY (kdDivisi) REFERENCES Divisi (kdDivisi) ON UPDATE CASCADE ON DELETE NO ACTION );
6. RegistrasiMember (
noRegistrasi KodeTransaksi NOT NULL,
tanggal Tanggal NOT NULL,
jmlhBayar Uang NOT NULL,
kdPelanggan KodeForeign NOT NULL, kdKaryawan KodeForeign NOT NULL, PRIMARY KEY (noRegistrasi),
FOREIGN KEY (kdPelanggan) REFERENCES Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdKaryawan) REFERENCES Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION );
7. JenisBarang (
kdJenisBarang KodeMaster NOT NULL, jenisBarang Jenis NOT NULL, PRIMARY KEY (kdJenisBarang) );
8. Barang (
kdBarang KodeMaster NOT NULL, namaBarang NamaBarang NOT NULL, hargaJual Uang,
stok JumlahBarang NOT NULL, stokMin JumlahBarang,
stokMax JumlahBarang,
kdJenisBarang KodeForeign NOT NULL, PRIMARY KEY (kdBarang),
FOREIGN KEY (kdJenisBarang) REFERENCES JenisBarang (kdJenisBarang) ON UPDATE CASCADE ON DELETE NO ACTION );
9. DeliveryOrder (
noDO KodeTransaksi NOT NULL,
tanggal Tanggal NOT NULL,
status StatusProses NOT NULL DEFAULT ‘Q’, kdPelanggan KodeForeign NOT NULL,
kdKasir KodeForeign NOT NULL, kdGudang KodeForeign,
kdSupir KodeForeign, PRIMARY KEY (noDO),
FOREIGN KEY (kdPelanggan) REFERENCES Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdKasir) REFERENCES Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdGudang) REFERENCES Karyawan (kdKaryawan), FOREIGN KEY (kdSupir) REFERENCES Karyawan (kdKaryawan) );
10. DetailDO (
noDO KodeTransaksi NOT NULL, kdBarang KodeForeign NOT NULL, qty JumlahBarang NOT NULL, PRIMARY KEY (noDO, kdBarang),
FOREIGN KEY (noDO) REFERENCES DeliveryOrder (noDO) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdBarang) REFERENCES Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION );
11. FakturPenjualan (
noFaktur KodeTransaksi NOT NULL,
tanggal Tanggal NOT NULL,
diskon Uang NOT NULL DEFAULT 0, biayaServis Uang NOT NULL DEFAULT 0,
total Uang NOT NULL,
jmlhBayar Uang NOT NULL,
piutang Uang NOT NULL DEFAULT 0, kdPelanggan KodeForeign NOT NULL,
noPlat NomorPlat,
kdKasir KodeForeign NOT NULL, kdMontir KodeForeign,
noDO KodeTransaksi, PRIMARY KEY (noFaktur),
FOREIGN KEY (kdPelanggan) REFERENCES Pelanggan (kdPelanggan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (noPlat) REFERENCES Mobil (noPlat),
FOREIGN KEY (kdKasir) REFERENCES Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdMontir) REFERENCES Karyawan (kdKaryawan), FOREIGN KEY (noDO) REFERENCES DeliveryOrder (noDO) );
12. DetailPenjualan (
noFaktur KodeTransaksi NOT NULL, kdBarang KodeForeign NOT NULL, qty JumlahBarang NOT NULL,
hargaJual Uang NOT NULL,
FOREIGN KEY (noFaktur) REFERENCES FakturPenjualan (noFaktur) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdBarang) REFERENCES Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION );
13. PelunasanPiutang (
noPelunasan KodeTransaksi NOT NULL,
tanggal Tanggal NOT NULL,
jmlhBayar Uang NOT NULL,
noFaktur KodeTransaksi NOT NULL, kdKaryawan KodeForeign NOT NULL, PRIMARY KEY (noPelunasan),
FOREIGN KEY (noFaktur) REFERENCES FakturPenjualan (noFaktur) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdKaryawan) REFERENCES Karyawan (kdKaryawan) );
14. Supplier (
kdSupplier KodeMaster NOT NULL, namaPerusahaan NamaPerusahaan NOT NULL, alamat Alamat ,
kota Kota,
telp NomorTelepon,
fax NomorTelepon,
contactPerson Nama,
status Status NOT NULL DEFAULT ‘A’, PRIMARY KEY (kdSupplier) );
15. HargaBeli (
kdBarang KodeForeign NOT NULL, kdSupplier KodeForeign NOT NULL,
hargaBeli Uang NOT NULL,
kurs Kurs NOT NULL DEFAULT ‘IDR’, PRIMARY KEY (kdBarang, kdSupplier),
FOREIGN KEY (kdBarang) REFERENCES Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdSupplier) REFERENCES Supplier (kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION );
16. Pembelian (
noPO KodeTransaksi NOT NULL, tanggal PO Tanggal NOT NULL,
status StatusProses NOT NULL DEFAULT ‘Q’, kdKasirPO KodeForeign NOT NULL,
kdSupplier KodeForeign NOT NULL, noFaktur KodeTransaksi NOT NULL, tanggalFB Tanggal NOT NULL,
total Uang NOT NULL,
jmlhBayar Uang NOT NULL,
utang Uang NOT NULL DEFAULT 0, kdKasirFB KodeForeign NOT NULL,
PRIMARY KEY (noPO),
FOREIGN KEY (kdKasirPO) REFERENCES Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdKasirFB) REFERENCES Karyawan (kdKaryawan), FOREIGN KEY (kdSupplier) REFERENCES Supplier (kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION );
17. DetailPO (
noPO KodeTransaksi NOT NULL, kdBarang KodeForeign NOT NULL, qty JumlahBarang NOT NULL, PRIMARY KEY (noPO, kdBarang),
FOREIGN KEY (noPO) REFERENCES PurchaseOrder (noPO) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (kdBarang) REFERENCES Barang (kdBarang) ON UPDATE CASCADE ON DELETE NO ACTION );
18. DetailPembelian (
noPO KodeTransaksi NOT NULL, kdBarang KodeForeign NOT NULL,
kdSupplier KodeForeign NOT NULL, qty JumlahBarang NOT NULL,
hargaBeli Uang NOT NULL DEFAULT 0, Primary Key (noPO, kdBarang, kdSupplier),
Foreign Key (noPO) references Pembelian (noPO) ON UPDATE CASCADE ON DELETE NO ACTION,
Foreign Key (kdBarang, kdSupplier) references HargaBeli (kdBarang, kdSupplier) ON UPDATE CASCADE ON DELETE NO ACTION );
19. PelunasanUtang (
noPelunasan KodeTransaksi NOT NULL,
tanggal Tanggal NOT NULL,
jmlhBayar Uang NOT NULL,
kdKaryawan KodeForeign NOT NULL, noFaktur KodeTransaksi NOT NULL, PRIMARY KEY (noPelunasan),
FOREIGN KEY (kdKaryawan) REFERENCES Karyawan (kdKaryawan) ON UPDATE CASCADE ON DELETE NO ACTION,
FOREIGN KEY (noFaktur) REFERENCES Pembelian (noFaktur) );
4.1.3.1.2. Merancang representasi derived data
Tujuan langkah ini adalah untuk memutuskan bagaimana representasi derived data yang terdapat pada model data logikal, di dalam DBMS yang akan
digunakan. Atribut-atribut derived yang dimasukkan ke dalam relasi model data logikal yaitu :
a. Atribut tglJatuhTempo pada relasi DetailMember. Atribut tglJatuhTempo dapat diperoleh dengan cara menambah 1 tahun pada tanggal registrasi member terakhir pelanggan tertentu. Atribut ini digunakan untuk transaksi “Menampilkan pelanggan-pelanggan member yang masa berlaku membernya akan habis dalam jangka waktu 1 bulan ke depan”. Dengan menempatkan atribut tglJatuhTempo di dalam DetailMember, akan menghemat waktu proses query pencarian dan pengolahan tanggal registrasi di tabel RegistrasiMember yang harus di-join kembali dengan tabel Pelanggan.
b. Atribut total pada relasi FakturPenjualan, dapat diperoleh dengan melakukan penjumlahan (hargaJual * qty) pada relasi DetailPenjualan untuk suatu faktur penjualan tertentu. Atribut total pada FakturPenjualan digunakan pada banyak transaksi, salah satunya untuk menghasilkan laporan keuangan bulanan. Dengan menempatkan atribut total di dalam relasi FakturPenjualan, akan menghemat waktu proses pencarian dan
pengolahan data DetailPenjualan, yang harus dilakukan perhari dalam satu bulan.
c. Atribut total pada relasi Pembelian, dapat diperoleh dengan melakukan penjumlahan (hargaBeli * qty) pada relasi DetailPembelian untuk suatu faktur pembelian tertentu. Atribut total pada Pembelian digunakan pada banyak transaksi, salah satunya untuk menghasilkan laporan pemasukan/ pengeluaran bulanan. Dengan menempatkan atribut total di dalam relasi Pembelian, akan menghemat waktu proses pencarian dan pengolahan data DetailPembelian, yang harus dilakukan perhari dalam satu bulan.
4.1.3.1.3. Merancang general constraints
Tujuan langkah ini adalah untuk merancang general constraints perusahaan untuk diterapkan pada DBMS yang akan digunakan. Beberapa general constraints yang ditemukan pada prosedur pembelian, persediaan, dan penjualan adalah :
a. Masing-masing faktur penjualan bisa memiliki nol atau satu referensi terhadap satu delivery order, dan masing-masing DO hanya bisa direferensikan terhadap satu faktur penjualan. Batasan ini
diterapkan dengan membuat trigger yang akan memeriksa status DO yang direferensikan saat dilakukan insert pada tabel FakturPenjualan.
CREATE TRIGGER cekDO ON FakturPenjualan FOR insert AS
DECLARE @noDO char(10), @status char SELECT @noDO = noDO FROM inserted IF @noDO is not null
BEGIN
SELECT @status = status FROM DeliveryOrder WHERE noDO = @noDO IF @status = 'Q'
BEGIN
PRINT 'Insert Berhasil.' COMMIT TRANSACTION END
ELSE BEGIN
PRINT 'Purchase Order tersebut sudah diproses. Insert gagal.'
ROLLBACK TRANSACTION END
END
b. Pemesanan atau pembelian barang melalui purchase order atau faktur pembelian tidak boleh melampaui batasan stok maksimum suatu barang. Batasan ini diterapkan dengan membuat trigger yang akan memeriksa apakah jumlah stok ditambah jumlah barang yang dipesan akan melebih jumlah stok maksimum saat dilakukan insert pada tabel DetailPembelian dan DetailPO.
CREATE TRIGGER cekstokDB ON DetailPembelian FOR insert AS
DECLARE @kodebrg int, @stok smallint, @stokmax smallint, @qty smallint
SELECT @kodebrg = kdbarang, @qty = qty FROM inserted
SELECT @stok = stok, @stokmax = stokmax FROM Barang WHERE kdbarang = @kodebrg IF (@stok + @qty) > @stokmax
BEGIN
PRINT 'Pembelian Barang Melampaui Stok Maksimum'
ROLLBACK TRANSACTION END
ELSE BEGIN
PRINT 'Insert Berhasil'
COMMIT TRANSACTION
END
CREATE TRIGGER cekstokDP ON DetailPO FOR insert
AS
DECLARE @kodebrg int, @stok smallint, @stokmax smallint, @qty smallint
SELECT @kodebrg = kdbarang, @qty = qty FROM inserted
SELECT @stok = stok, @stokmax = stokmax FROM Barang WHERE kdbarang = @kodebrg IF (@stok + @qty) > @stokmax
BEGIN
PRINT 'Pembelian Barang Melampaui Stok Maksimum'
ROLLBACK TRANSACTION END
ELSE BEGIN
PRINT 'Insert Berhasil'
COMMIT TRANSACTION
c. Pengiriman atau penjualan barang melalui delivery order atau faktur penjualan tidak boleh dilakukan jika akan mengakibatkan stok barang menjadi minus. Batasan ini diterapkan dengan membuat trigger yang akan memeriksa apakah jumlah stok mencukupi jumlah barang yang akan dijual saat dilakukan insert pada tabel DetailPenjualan dan DetailDO.
CREATE TRIGGER cekstokDJ ON DetailPenjualan FOR insert AS
DECLARE @kodebrg int, @stok smallint, @qty smallint
SELECT @kodebrg = kdbarang, @qty = qty FROM inserted
SELECT @stok = stok FROM Barang WHERE kdbarang = @kodebrg
IF @qty > @stok BEGIN
PRINT 'Stok Barang Tidak Cukup' ROLLBACK TRANSACTION END
ELSE BEGIN
COMMIT TRANSACTION END
CREATE TRIGGER cekstokDD ON DetailDO FOR insert
AS
DECLARE @kodebrg int, @stok smallint, @qty smallint
SELECT @kodebrg = kdbarang, @qty = qty FROM inserted
SELECT @stok = stok FROM Barang WHERE kdbarang = @kodebrg
IF @qty > @stok BEGIN
PRINT 'Stok Barang Tidak Cukup' ROLLBACK TRANSACTION END
ELSE BEGIN
PRINT 'Insert Berhasil'
COMMIT TRANSACTION
END
d. Format nomor member pada detail member berupa ’MBXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan
dengan menambah constraint di dalam tabel DetailMember.
CONSTRAINT formatnomember
CHECK (noMember like ‘MB[0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
e. Format nomor faktur pada faktur penjualan berupa ’FJXXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan dengan menambah constraint di dalam tabel FakturPenjualan.
CONSTRAINT formatnofakturjual
CHECK (noFaktur like ’FJ[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
g. Format nomor DO pada delivery order berupa ’DOXXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan dengan menambah constraint di dalam tabel DeliveryOrder.
CONSTRAINT formatnoDO
CHECK (noDO like ‘DO[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
h. Format nomor pelunasan pada pelunasan piutang berupa ’PPXXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan
dengan menambah constraint di dalam tabel PelunasanPiutang.
CONSTRAINT formatnopiutang
CHECK (noPelunasan like ‘PP[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
i. Format nomor PO pada purchase order berupa ‘POXXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan dengan menambah constraint di dalam tabel Pembelian. CONSTRAINT formatnoPO
CHECK (noPO like ‘PO[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
j. Format nomor faktur pada faktur pembelian berupa ’FBXXXXXXXX’ di mana X mewakili karakter berupa digit 0-9. Batasan ini diterapkan dengan menambah constraint di dalam tabel Pembelian.
CONSTRAINT formatnofakturbeli
CHECK (noFaktur like ‘FB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
k. Format nomor pelunasan pada pelunasan utang berupa ’PUXXXXXXXX’ di mana XX mewakili karakter berupa digit 0-9. Batasan ini diterapkan
dengan menambah constraint di dalam tabel PelunasanUtang.
CONSTRAINT formatnoutang
CHECK (noPelunasan like ’PU[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
l. Format nomor registrasi pada registrasi member berupa ’RMXXXXXXXX’ di mana XX mewakili karakter berupa digit 0-9. Batasan ini diterapkan dengan menambah constraint di dalam tabel RegistrasiMember.
CONSTRAINT formatnoregistrasi
CHECK (noRegistrasi like ’RM[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’)
m. Memastikan stok ter-update saat dilakukan transaksi penjualan dan kilometer mobil ter-update jika ada mobil yang diservis. Batasan ini diterapkan dengan membuat Stored Procedure yang akan mengurangi stok saat DetailPenjualan terisi.
CREATE PROC updatestok @nofaktur char(10), @kdbarang int, @hargajual varchar(15), @qty smallint, @kilo int, @noPlat varchar(15) AS
INSERT INTO DetailPenjualan VALUES (@nofaktur, @kdbarang, @qty, CAST(@hargajual AS money));
UPDATE Barang SET stok = stok - @qty WHERE kdbarang = @kdbarang;
IF @kilo <> -1 AND @noPlat <> '-' BEGIN
UPDATE Mobil SET kilometer = @kilo WHERE noPlat = @noPlat
END END
n. Secara otomatis mengubah status blacklist seorang pelanggan menjadi ’Y’ untuk Yes jika pelanggan tersebut memiliki faktur penjualan yang belum lunas saat 1 bulan sejak faktur dibuat. Batasan ini ditangani dengan pembuatan Stored Procedure. CREATE PROC set_blacklist @tgl varchar(15) AS
BEGIN
DECLARE cursor1 cursor
FOR SELECT kdpelanggan FROM view_penjualan WHERE DATEDIFF (day,CONVERT(datetime, tanggal,105), @tgl) >= 30 and piutang > 0
OPEN cursor1
DECLARE @kode int
FETCH NEXT FROM cursor1 INTO @kode WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE pelanggan SET blacklist = 'Y' WHERE kdpelanggan = @kode
FETCH NEXT FROM cursor1 INTO @kode END
CLOSE cursor1
DEALLOCATE cursor1 END
o. Secara otomatis mengubah status member seorang pelanggan menjadi ’S’ untuk Suspended jika tanggal saat ini sudah melewati masa berlaku member tersebut. Batasan ini ditangani dengan pembuatan Stored Procedure.
CREATE PROC unreg_member @tgl varchar(15) AS
BEGIN
DECLARE cursor1 cursor
FOR SELECT kdpelanggan FROM detailmember WHERE @tgl > tglJatuhTempo OPEN cursor1
DECLARE @kode int
FETCH NEXT FROM cursor1 INTO @kode WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE detailmember SET status = 'S' WHERE kdpelanggan = @kode
UPDATE pelanggan SET jenispelanggan = 'Biasa' WHERE kdpelanggan = @kode
FETCH NEXT FROM cursor1 INTO @kode END
CLOSE cursor1
DEALLOCATE cursor1 END
p. Secara otomatis mengubah status member pelanggan dan tanggal jatuh temponya jika pelanggan tersebut melakukan registrasi member atau membuat nomor member baru jika pelanggan baru pertama kali melakukan registrasi member. Batasan ini ditangani dengan pembuatan Stored Procedure.
CREATE PROC register_member @noReg varchar(10), @tgl varchar(15), @kode int, @bayar varchar(20), @kasir int AS
INSERT INTO registrasimember VALUES (@noReg, CONVERT(datetime,@tgl,103), CAST(@bayar AS money), @kode, @kasir) IF EXISTS (SELECT * FROM detailmember WHERE kdpelanggan = @kode)
BEGIN
UPDATE detailmember SET tglJatuhTempo = DATEADD(year,1,CONVERT(datetime,@tgl,10 3)) WHERE kdpelanggan = @kode
UPDATE detailmember SET status = 'A' WHERE kdpelanggan = @kode
UPDATE pelanggan SET jenisPelanggan = 'Member' WHERE kdpelanggan = @kode
END
ELSE BEGIN
DECLARE @no varchar(10) DECLARE @tgl2 datetime
SET @tgl2 = (CONVERT(datetime, @tgl, 103)) IF EXISTS (SELECT * FROM detailmember WHERE MONTH(tglMasuk) = MONTH(@tgl2) AND YEAR(tglMasuk) = YEAR(@tgl2))
BEGIN
SET @no = (SELECT 'MB' + CAST (MONTH(@tgl2) AS varchar) + SUBSTRING
(CAST (YEAR (@tgl2) AS varchar),3,2) + RIGHT('00' + CAST (CAST (MAX (RIGHT (nomember, 3)) AS integer) + 1 AS varchar),3) FROM detailmember WHERE MONTH (tglMasuk) = MONTH (@tgl2) AND YEAR (tglMasuk) = YEAR (@tgl2))
END
ELSE BEGIN SET @no = 'MB' + CAST (MONTH(@tgl2) AS varchar) + SUBSTRING(CAST(YEAR(@tgl2) AS varchar),3,2) + '001' END
INSERT INTO detailmember VALUES (@no, @tgl2, CAST (DATEADD (year,1,@tgl2) AS varchar), 'A', @kode)
UPDATE pelanggan SET jenisPelanggan = 'Member' WHERE kdpelanggan = @kode
END END
4.1.3.2. Merancang Organisasi File dan Index
Tujuan langkah ini adalah untuk menentukan pilihan organisasi file yang optimal untuk menyimpan relasi-relasi dasar dan index yang diperlukan untuk mencapai kinerja yang
memuaskan, atau dengan kata lain, bagaimana relasi dan record akan disimpan di dalam secondary storage.
4.1.3.2.1. Menganalisa transaksi
Tujuan langkah ini adalah untuk memahami fungsionalitas transaksi yang akan berjalan di dalam basisdata dan menganalisa transaksi-transaksi yang penting. Transaksi-transaksi yang akan berjalan di dalam basisdata yaitu :
Data entry
A. Memasukkan data pelanggan baru.
B. Memasukkan data transaksi registrasi member baru, memasukkan detail member baru, dan update jenis pelanggan menjadi member.
C. Memasukkan data mobil yang dimiliki pelanggan. D. Memasukkan data karyawan baru.
E. Memasukkan divisi baru.
F. Memasukkan data supplier baru. G. Memasukkan data barang baru. H. Memasukkan jenis barang baru.
I. Menambah barang yang dijual oleh suatu supplier. J. Memasukkan data transaksi registrasi member seorang
sebelumnya, meng-update detail member, dan mengubah jenis pelanggan menjadi member.
K. Memasukkan data delivery order.
L. Memasukkan data transaksi penjualan non servis, update stok barang, dan update status delivery order menjadi ‘processed’ jika faktur memiliki referensi pada suatu delivery order.
M. Memasukkan data transaksi penjualan servis, update stok barang, dan update atribut kilometer pada mobil yang diservis.
N. Memasukkan data transaksi pelunasan piutang, dan update atribut jumlah piutang pada faktur penjualan yang dilunasi.
O. Memasukkan data purchase order.
P. Memasukkan data transaksi pembelian, update stok barang, dan update status purchase order yang direferensikan menjadi ‘processed’.
Q. Memasukkan data transaksi pelunasan utang dan update atribut jumlah utang pada faktur pembelian yang dilunasi.
Data update/ deletion
R. Update data pelanggan. S. Update data supplier.
T. Update data karyawan. U. Update data mobil. V. Update data barang.
W. Update status blacklist pelanggan menjadi ‘Y’ jika pelanggan memiliki faktur penjualan yang belum dilunasi selama 1 bulan sejak tanggal pembuatan faktur.
X. Update status member menjadi ‘S’ jika masa jatuh tempo seorang member sudah lewat.
Y. Update barang
Z. Update/ Delete data Delivery Order AA. Delete data Faktur Penjualan BB. Update/ Delete data Purchase Order
Data queries
CC. Menampilkan pelanggan-pelanggan member yang masa berlaku membernya akan habis dalam jangka waktu 1 bulan ke depan
DD. Menampilkan data suatu registrasi member tertentu secara mendetail
EE. Menampilkan daftar registrasi member beserta nama pelanggan yang melakukan registrasi
GG. Menampilkan daftar delivery order beserta nama pelanggannya, diurut berdasarkan nomor DO
HH. Menampilkan daftar delivery order yang memiliki status ’queue’ beserta nama pelanggannya, diurut berdasarkan nomor DO
II. Menampilkan daftar barang yang jumlah on hand stock-nya sudah mencapai jumlah stok minimum
JJ. Menampilkan data faktur penjualan tertentu
KK. Menampilkan daftar faktur penjualan beserta nama pelanggan yang melakukan transaksi, diurut berdasarkan nomor faktur
LL. Menampilkan daftar faktur penjualan yang belum lunas beserta nama pelanggannya diurut berdasarkan nomor faktur penjualan
MM. Menampilkan sejarah penjualan terhadap suatu customer
NN. Menampilkan sejarah perbaikan terhadap suatu mobil OO. Menampilkan daftar mobil yang pernah ditangani
seorang kepala montir
PP. Menampilkan data purchase order tertentu
QQ. Menampilkan daftar purchase order beserta nama suppliernya, diurut berdasarkan nomor PO
RR. Menampilkan daftar purchase order yang memiliki status ’queue’ beserta nama suppliernya, diurut berdasarkan nomor PO
SS. Menampilkan data faktur pembelian tertentu
TT. Menampilkan daftar faktur pembelian beserta nama suppliernya, diurut berdasarkan nomor faktur pembelian
UU. Menampilkan daftar faktur pembelian yang belum lunas beserta nama suppliernya, diurut berdasarkan nomor faktur pembelian
VV. Menampilkan data pelunasan piutang tertentu
WW. Menampilkan daftar transaksi pelunasan piutang beserta nama pelanggan yang melakukan transaksi pelunasan, diurut berdasarkan nomor pelunasan piutang
XX. Menampilkan data pelunasan utang tertentu
YY. Menampilkan daftar transaksi pelunasan utang beserta nama supplier yang dilunasi, diurut berdasarkan nomor pelunasan utang
ZZ. Menampilkan barang-barang yang dijual supplier tertentu
AB. Menampilkan daftar mobil yang dimiliki seorang pelanggan
AD. Menampilkan karyawan berdasarkan divisinya
AE. Menampilkan laporan penjualan selama periode tertentu
AF. Menampilkan laporan pembelian selama periode tertentu
AG. Menampilkan laporan pemasukan dan pengeluaran selama periode tertentu
Tabel 4.17 Analisis transaksi (A) (B) (C) (D) (E) (F) (G) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X X X Detail_Member X Mobil X Divisi X X Karyawan X Registrasi_ Member X JenisBarang X Barang X Delivery_Order DetailDO Faktur_ Penjualan Detail_ Penjualan Pelunasan_ Piutang Supplier X HargaBeli Pembelian DetailPO Detail_ Pembelian Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.) (H) (I) (J) (K) (L) (M) (N) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X X X X Detail_Member X X X X Mobil X X Divisi Karyawan X X X X Registrasi_ Member X JenisBarang X Barang X X X X X X Delivery_Order X X DetailDO X Faktur_ Penjualan X X X X Detail_ Penjualan X X Pelunasan_ Piutang X Supplier X HargaBeli X Pembelian DetailPO Detail_ Pembelian Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.) (O) (P) (Q) (R) (S) (T) (U) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X Detail_Member Mobil X Divisi X Karyawan X X X X Registrasi_ Member JenisBarang Barang X X X Delivery_Order DetailDO Faktur_ Penjualan Detail_ Penjualan Pelunasan_ Piutang Supplier X X X HargaBeli X Pembelian X X X X X X DetailPO X Detail_ Pembelian X Pelunasan_ Utang X
Tabel 4.17 Analisis transaksi (lanj.) (V) (W) (X) (Y) (Z) (AA) (BB) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X Detail_Member X X Mobil Divisi Karyawan Registrasi_ Member JenisBarang X Barang X X X Delivery_Order X X X DetailDO X Faktur_ Penjualan X X Detail_ Penjualan X Pelunasan_ Piutang Supplier X HargaBeli Pembelian X X DetailPO X Detail_ Pembelian Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.) (CC) (DD) (EE) (FF) (GG) (HH) (II) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X X X X X Detail_Member X X Mobil Divisi Karyawan X X Registrasi_ Member X X JenisBarang Barang X Delivery_Order X X X DetailDO X Faktur_ Penjualan Detail_ Penjualan Pelunasan_ Piutang Supplier HargaBeli Pembelian DetailPO Detail_ Pembelian Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.) (JJ) (KK) (LL) (MM) (NN) (OO) (PP) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X X X X X Detail_Member X Mobil X X X Divisi Karyawan X X X Registrasi_ Member JenisBarang Barang X X X X X Delivery_Order DetailDO Faktur_ Penjualan X X X X X X Detail_ Penjualan X X X X Pelunasan_ Piutang Supplier X HargaBeli Pembelian X DetailPO X Detail_ Pembelian Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.) (QQ) (RR) (SS) (TT) (UU) (VV) (WW) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X Detail_Member Mobil Divisi Karyawan X X Registrasi_ Member JenisBarang Barang X Delivery_Order DetailDO Faktur_ Penjualan X X Detail_ Penjualan Pelunasan_ Piutang X X Supplier X X X X X HargaBeli X Pembelian X X X X X DetailPO Detail_ Pembelian X Pelunasan_ Utang
Tabel 4.17 Analisis transaksi (lanj.)
(XX) (YY) (ZZ) (AB) (AC) (AD) (AE) Transaction/ Relation I R U D I R U D I R U D I R U D I R U D I R U D I R U D Pelanggan X X Detail_Member Mobil X Divisi X Karyawan X X Registrasi_ Member JenisBarang X Barang X X Delivery_Order DetailDO Faktur_ Penjualan X Detail_ Penjualan Pelunasan_ Piutang Supplier X X X X HargaBeli X X Pembelian X X DetailPO Detail_ Pembelian Pelunasan_ Utang X X
Tabel 4.17 Analisis transaksi (lanj.) (AF) (AG) Transaction/ Relation I R U D I R U D Pelanggan X Detail_Member Mobil Divisi Karyawan Registrasi_ Member X JenisBarang Barang Delivery_Order DetailDO Faktur_ Penjualan X Detail_ Penjualan Pelunasan_ Piutang Supplier X X HargaBeli Pembelian X X DetailPO Detail_ Pembelian Pelunasan_ Utang
Berdasarkan matriks korelasi transaksi/ relasi di atas, dapat disimpulkan bahwa transaksi-transaksi yang banyak melakukan akses terhadap relasi adalah :
K. Memasukkan data delivery order.
L. Memasukkan data transaksi penjualan non servis, update stok barang, dan update status delivery order menjadi ‘processed’ jika faktur memiliki referensi pada suatu delivery order.
M. Memasukkan data transaksi penjualan servis, update stok barang, dan update atribut kilometer pada mobil yang diservis.
O. Memasukkan data purchase order.
P. Memasukkan data transaksi pembelian, update stok barang, dan update status purchase order yang direferensikan menjadi ‘processed’.
FF. Menampilkan data faktur penjualan tertentu. OO. Menampilkan data faktur pembelian tertentu.
Dan relasi-relasi yang banyak diakses adalah: • Pelanggan • Karyawan • Barang • FakturPenjualan • Supplier • Pembelian
4.1.3.2.2. Memilih organisasi file (Opsional)
Tujuan langkah ini adalah menentukan organisasi file yang efisien untuk tiap-tiap relasi dasar jika diperbolehkan oleh DBMS yang akan digunakan. Dalam banyak kasus, DBMS relasional memberikan sedikit atau tidak ada pilihan untuk memilih organisasi file. Dalam kasus ini, DBMS yang digunakan adalah SQL Server 2000 dan organisasi file yang digunakan telah ditentukan oleh SQL Server 2000.
4.1.3.2.3. Memilih index
Tujuan langkah ini adalah memutuskan apakah penambahan index akan meningkatkan kinerja sistem basisdata.
Tabel 4.18 Pemilihan index
No. Relasi Clustered Index Nonclustered Index
1. Pelanggan kdPelanggan -
2. DetailMember noMember tglJatuhTempo, kdPelanggan
3. Mobil noPlat kdPelanggan
4. Divisi kdDivisi -
5. Karyawan kdKaryawan kdDivisi
6. RegistrasiMember noRegistrasi tanggal, kdPelanggan
7. JenisBarang kdJenisBarang -