Membuat Program Multiuser Dengan Front-End Microsoft Access dan Back-End Microsoft SQL Server (Bagian 1)
Access sebagai program database sebenarnya dapat digunakan sebagai frontend maupun backend database. Namun permasalahannya, ketika jumlah user bertambah dan data semakin besar, maka proses akan menjadi lambat. Oleh karena itu, solusinya adalah menjadikan SQL Server sebagai backend database. Sebab Access bekerja sebagai file, data akan ditarik ke client kemudian diproses diclient, sedangkan SQL Server adalah seperti Google, data diproses di server, kemudian yang dikirim ke client hanya yang diperlukan saja.
PERSIAPAN AWAL: BUAT TABLE-TABLE YANG DIPERLUKAN
Sahabat harus membuat table-table yang diperlukan di SQL Server. Pastikan data type yang digunakan sudah sesuai dengan yang sahabat inginkan. Jangan menggunakan data type integer untuk data desimal, dsb. Sempurnakan juga default value, index, primary key, dan hal-hal lainnya. Jangan dulu beralih ke yang lain sebelum table-table sudah dibuat dengan sempurna.
MEMBUAT TRIGGER
Wajib bagi sahabat untuk membuat "relationshipnya" menggunakan trigger pada table-table yang saling berkaitan. Trigger adalah pemicu otomatis. Sebagai contoh, jika kulit tangan kita tersentuh bara api, maka akan langsung di trigger oleh sel syaraf ke otak, kemudian data akan diproses sedemikian cepatnya jauh melebihi kecepatan server Google, kemudian dikirim balik ke tulang tangan, agar segera menggerakan tangan ke arah yang berlawanan dengan bara api.
Tanpa trigger, maka table akan bekerja masing-masing. Trigger yang dibuat meliputi trigger untuk menambah data (insert), trigger untuk edit data (update) dan trigger untuk menghapus data (delete). Mungkin diantara sahabat ada yang membuat relationshipnya menggunakan Diagram View. Saran saya sebaiknya menggunakan trigger, karena ia dibuat menggunakan syntax Transact SQL, sehingga sangat banyak variasinya. Adapun diagram terbatas pada fasilitas yang ada.
CONTOH TRIGGER INSERT
Pada contoh dibawah, saya ingin menambah dua record data secara otomatis dari table Master Item (IMA) ke table Lokasi Barang (LOC), dimana syaratnya bila flag Lokasi (IMA_LocPromptFlag ) diberi tanda centang.
/****** Contoh Trigger Insert ******/
CREATE TRIGGER IMA_ITrig ON dbo.IMA FOR INSERT AS
/* Cek bila check box lokasi dicentang */
IF UPDATE(IMA_LocPromptFlag)
/* Maka akan dilakukan proses sbb: */
BEGIN
/* Tambahkan ke table Lokasi: ItemID, Lokasi Gudang, dll, khusus WIP Inspect */
INSERT INTO LOC ( LOC.LOC_ItemID, LOC.LOC_WarehouseLoc, LOC.LOC_LocTransDate )
/* Dimana data berasal dari table Item Master (IMA) */
SELECT inserted.IMA_ItemID, 'WIPInspect', getdate()
FROM inserted
/*Table Inserted adalah table temporary yang terbentuk oleh trigger itu sendiri */
WHERE inserted.IMA_LocPromptFlag = 1
AND inserted.IMA_ItemID NOT IN ( SELECT inserted.IMA_ItemID
FROM LOC JOIN inserted
ON LOC.LOC_ItemID = inserted.IMA_ItemID
WHERE LOC.LOC_WarehouseLoc = 'WIPInspect' )
/*Tambahkan data lainnya ke table lokasi khusus PO Inspect */
INSERT INTO LOC ( LOC.LOC_ItemID, LOC.LOC_WarehouseLoc, LOC.LOC_LocTransDate )
SELECT inserted.IMA_ItemID, 'POInspect', getdate()
FROM inserted
WHERE inserted.IMA_LocPromptFlag = 1
AND inserted.IMA_ItemID NOT IN ( SELECT inserted.IMA_ItemID
FROM LOC JOIN inserted
ON LOC.LOC_ItemID = inserted.IMA_ItemID
WHERE LOC.LOC_WarehouseLoc = 'POInspect' )
END
Anda bisa bayangkan, jika procedure trigger diatas dibuat di diagram view, cukup sulit diwujudkan, sebab ada syarat-syarat yang harus dipenuhi ketika data dari table Master Item hendak ditambahkan ke table Lokasi.
CONTOH TRIGGER UPDATE
Pada contoh dibawah, saya ingin menambah data dua record data secara otomatis dari table Master Item (IMA) ke table Lokasi Barang (LOC), dimana syaratnya bila flag Lokasi (IMA_LocPromptFlag ) diberi tanda centang. Kemudian setelah itu, update ItemID ditable-table lainnya yang berhubungan, syaratnya bilamana ItemID di table Item Master (IMA) diubah.
/****** Contoh Trigger Update ******/
CREATE TRIGGER IMA_UTrig ON dbo.IMA FOR UPDATE AS
/* Trigger ini sama persis dengan trigger insert diatas, tinggal copy paste saja */
IF UPDATE(IMA_LocPromptFlag)
BEGIN
INSERT INTO LOC ( LOC.LOC_ItemID, LOC.LOC_WarehouseLoc, LOC.LOC_LocTransDate )
SELECT inserted.IMA_ItemID, 'WIPInspect', getdate()
FROM inserted
WHERE inserted.IMA_LocPromptFlag = 1
AND inserted.IMA_ItemID NOT IN ( SELECT inserted.IMA_ItemID
FROM LOC JOIN inserted
ON LOC.LOC_ItemID = inserted.IMA_ItemID
WHERE LOC.LOC_WarehouseLoc = 'WIPInspect' )
INSERT INTO LOC ( LOC.LOC_ItemID, LOC.LOC_WarehouseLoc, LOC.LOC_LocTransDate )
SELECT inserted.IMA_ItemID, 'POInspect', getdate()
FROM inserted
WHERE inserted.IMA_LocPromptFlag = 1
AND inserted.IMA_ItemID NOT IN ( SELECT inserted.IMA_ItemID
FROM LOC JOIN inserted
ON LOC.LOC_ItemID = inserted.IMA_ItemID
WHERE LOC.LOC_WarehouseLoc = 'POInspect' )
END
/* Update ItemID pada table-table yang berkaitan */
IF UPDATE(IMA_ItemID)
/*Table Inserted dan Deleted adalah table temporary yang terbentuk oleh trigger itu sendiri */
IF (select count(*) from inserted, deleted where inserted.IMA_ItemID != deleted.IMA_ItemID) > 0
BEGIN
/* UPDATE ITEM ID KE TABLE 'IMV' */
UPDATE IMV
SET IMV.IMV_ItemID = inserted.IMA_ItemID
FROM IMV, deleted, inserted
WHERE deleted.IMA_ItemID = IMV.IMV_ItemID
/* UPDATE ITEM ID KE TABLE 'MEV' */
UPDATE MEV
SET MEV.MEV_ItemID = inserted.IMA_ItemID
FROM MEV, deleted, inserted
WHERE deleted.IMA_ItemID = MEV.MEV_ItemID
/* UPDATE ITEM ID KE TABLE 'IMC' */
UPDATE IMC
SET IMC.IMC_ItemID = inserted.IMA_ItemID
FROM IMC, deleted, inserted
WHERE deleted.IMA_ItemID = IMC.IMC_ItemID
/* UPDATE ITEM ID KE TABLE 'IMS' */
UPDATE IMS
SET IMS.IMS_ItemID = inserted.IMA_ItemID
FROM IMS, deleted, inserted
WHERE deleted.IMA_ItemID = IMS.IMS_ItemID
/* UPDATE ITEM ID KE TABLE 'IMD' */
UPDATE IMD
SET IMD.IMD_ItemID = inserted.IMA_ItemID
FROM IMD, deleted, inserted
WHERE deleted.IMA_ItemID = IMD.IMD_ItemID
/* UPDATE ITEM ID KE TABLE 'IMO' */
UPDATE IMO
SET IMO.IMO_ItemID = inserted.IMA_ItemID
FROM IMO, deleted, inserted
WHERE deleted.IMA_ItemID = IMO.IMO_ItemID
END
CONTOH TRIGGER DELETE
Pada contoh dibawah, saya ingin menjaga penghapusan record, bilamana Item ID tersebut masih terdapat pada table-table lainnya yang berkaitan. Kemudian bila data dihapus, maka data pada table lainnya yang berkaitan juga harus ikut dihapus.
/****** Contoh Trigger Delete ******/
CREATE TRIGGER IMA_DTrig ON dbo.IMA FOR DELETE AS
/* Cek table lainnya yang berkaitan */
IF (Select count(*) from IPF, deleted where IPF_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPF.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPL, deleted where IPL_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPL.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPM, deleted where IPM_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPM.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPP, deleted where IPP_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPP.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPR, deleted where IPR_CompItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPR.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPS, deleted where IPS_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPS.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPU, deleted where IPU_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPU.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from IPW, deleted where IPW_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table IPW.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from PST, deleted where PST_ParentItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table PST.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from PST, deleted where PST_CompItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table PST.'
ROLLBACK TRANSACTION
END
ELSE
IF (Select count(*) from RTG, deleted where RTG_ItemID = deleted.IMA_ItemID) > 0
BEGIN
RAISERROR 44444 'Record tdk dpt dihapus karena Item ID masih digunakan di table RTG.'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
/* HAPUS RECORD DI TABLE 'IMV' */
DELETE IMV FROM deleted, IMV WHERE deleted.IMA_ItemID = IMV.IMV_ItemID
/* HAPUS RECORD DI TABLE 'MEV' */
DELETE MEV FROM deleted, MEV WHERE deleted.IMA_ItemID = MEV.MEV_ItemID
/* HAPUS RECORD DI TABLE 'IMC' */
DELETE IMC FROM deleted, IMC WHERE deleted.IMA_ItemID = IMC.IMC_ItemID
/* HAPUS RECORD DI TABLE 'IMS' */
DELETE IMS FROM deleted, IMS WHERE deleted.IMA_ItemID = IMS.IMS_ItemID
/* HAPUS RECORD DI TABLE 'IMD' */
DELETE IMD FROM deleted, IMD WHERE deleted.IMA_ItemID = IMD.IMD_ItemID
/* HAPUS RECORD DI TABLE 'IMO' */
DELETE IMO FROM deleted, IMO WHERE deleted.IMA_ItemID = IMO.IMO_ItemID
/* HAPUS RECORD DI TABLE 'IMY' */
DELETE IMY FROM deleted, IMY WHERE deleted.IMA_ItemID = IMY.IMY_ItemID
END
Jika telah selesai membuat trigger, lanjutkan ketahap berikutnya. Bila belum, maka jangan beralih dahulu, karena trigger itu sangat penting, sama seperti relationship pada Microsoft Access, wajib dibuat juga. Insya Allah saya sambung lagi nanti ke bagian 2.
/* --------------------------------------------------------------- */
Penyusun: Sofyan Efendi. Alhamdulillah, telah berpengalaman 10 tahun lebih diaplikasi multiuser berbasis Microsoft Access sebagai front-end dan Microsoft SQL Server sebagai back-end. Sahabat bisa mengunjungi blog penyusun di: http://imopi.wordpress.com/. Terima kasih.
/* --------------------------------------------------------------- */
Wassalamu'alaikum Warahmatullahi Wabarakatuh,
Sofyan Efendi
Access DVD Collections ; Access Course by Request
--
Email: harry.siswanto@gmail.com
http://www.facebook.com/harry.siswanto
http://www.harry-siswanto.blogspot.com/?view=classic
http://accessindonesia.blogspot.com/
Reply via web post | Reply to sender | Reply to group | Start a New Topic | Messages in this topic (2) |
Tidak ada komentar:
Posting Komentar