Senin, 27 Mei 2013

[belajar-access] Membuat Program Multiuser Dengan Front-End Microsoft Access dan Back-End Microsoft SQL Server (Bagian 1)

 

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 

__._,_.___
Reply via web post Reply to sender Reply to group Start a New Topic Messages in this topic (1)
Recent Activity:
SPAM IS PROHIBITED
.

__,_._,___

Tidak ada komentar:

Posting Komentar