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.

Leave a Reply

%d bloggers like this: