Home, Forum diskusi, Chatting, Download


Pengaturan MultiUser pada Data Kontrol

Suatu program MultiUser sangat tergantung pada bagaimana file database sebagai sumber daya yang digunakan dapat dibuka oleh lebih dari satu pemakai pada saat yang bersamaan.

Pengaturan modus pembukaan file database pada Data kontrol dapat dilakukan dengan menentukan nilai dari properti Exclusive menjadi True (Single User) atau False (Multi User).

Sesuatu hal yang perlu diperhatikan dalam pengaktifan file Database secara Share (Exclusive False) adalah mekanisme penguncian ketika data di Edit. Mekanisme penguncian pada Data kontrol dapat menggunakan dua jenis strategi, yaitu :

  1. Optimistik Locks, penguncian dilakukan sesaat pada saat metoda .Update 
  2. Pesimistik Locks, penguncian dilakukan sesaat setelah pemakaian metoda .Edit 

Pemakaian strategi penguncian ini dapat ditentukan pada Properti LockEdits dengan mengubah nilainya menjadi True (Pesimistik Locks) atau False (Optimistik Locks).

Contoh :

Private Sub Form_Load()
RsForum.Refresh
RsForum.Recordset.LockEdits = True	'Menggunakan Strategi Pesimistik Locks
End Sub

Catatan :
Penguncian dilakukan oleh Visual Basic secara per Page (Halaman) dimana terdiri dari 2 Kilobyte Page dimana record tersebut berada. Pada saat suatu Page sedang dikunci, maka usaha penguncian oleh pemakai lain terhadap data lain yang berada pada Page yang sama akan gagal.


Perhatikan kembali potongan program berikut yang diambil dari Latihan 3 Modul 9, dimana mekanisme masing-masing Locks dapat dijelaskan sebagai berikut : 

Private Sub cmdEdit_Click()
Flag = flEdit
RsForum.Recordset.Edit                        ' Penguncian terjadi disini pada Pesimistik Locks
Call Kunci(False)
Call AturTombol(False, False, False, True, True)
End Sub
Private Sub cmdUpdate_Click()
On Error GoTo ErrUpdate_click
If txtForumID.Text = "" Then
   MsgBox "Forum ID tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
If txtKeterangan.Text = "" Then
   MsgBox "Keterangan tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
If txtAlamat.Text = "" Then
   MsgBox "Alamat tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
RsForum.Recordset.Update                ' Penguncian terjadi disini pada Optimistik Locks
Flag = flNone
Call Kunci(True)
Call AturTombol(True, True, True, False, False)
RsForum.Recordset.Bookmark = RsForum.Recordset.LastModified
Exit Sub
ErrUpdate_click:
Select Case Err.Number
    Case 3022
    MsgBox "Telah terjadi duplikasi pada Forum ID", vbOKOnly + vbInformation, "Warning"
    Case Else
    MsgBox Err.Number & vbCrLf & Err.Description
End Select
End Sub

Pada Pesimistik Locks, penguncian dilakukan sesaat setelah metoda Edit, dan penguncian dibuka kembali sampai metoda Update maupun Cancel Update, sedangkan Optimistik Locks, penguncian dilakukan sesaat metoda Update dilakukan.

Masalah pada Pesimistik Locks

Masalah pada Pesimistik Locks adalah kegagalan penguncian karena Page sedang dikunci oleh pemakai lain, sehingga permintaan Locks pada saat Edit (Pesimistik) maupun Delete gagal dilakukan.

Anda dapat menggunakan Error Handling untuk menangani kegagalan ini dengan mengevaluasi nilai Err yang dihasilkan, dalam hal ini adalah 3260.

Contoh :

Private Sub cmdEdit_Click()
On Error GoTo ErrcmdEdit_Click
Flag = flEdit
RsForum.Recordset.Edit		'Sumber Error pada Pesimistik Locks
Call Kunci(False)
Call AturTombol(False, False, False, True, True)

CancelcmdEdit:
Exit Sub

ErrcmdEdit_Click:
Select Case Err
    'Data telah dihapus pemakai lain
    Case 3167
         MsgBox "Data telah dihapus pemakai lain" & vbCrLf & _
                "Lakukan refresh data anda !", vbOKOnly + vbInformation
    'Data Page (2 kb) telah dikunci oleh pemakai lain
    Case 3260
         nHitung = nHitung + 1
         'Memungkinkan pemakai membuat keputusan ulangi
         'Penguncian atau batal, maksimum 2 kali
         If nHitung > 2 Then
            nPilih = MsgBox("Ulangi penguncian ?", vbYesNo + _
                            vbQuestion)
            If nPilih = vbYes Then
               nHitung = 1
            Else
               Resume CancelcmdEdit
            End If
         End If
         DoEvents 'menjalankan event windows
         'menunda sejumlah waktu random
         nTunda = nHitung ^ 2 * Int(Rnd * 3000 + 1000)
         For i = 1 To nTunda: Next i
         Resume
    Case Else
         MsgBox "Error " & Err & ":" & Error, vbOKOnly
         Resume CancelcmdEdit
End Select
End Sub
Private Sub cmdDelete_Click()
On Error GoTo ErrCmdDelete_Click
RsForum.Recordset.Delete		'Sumber Error pada Pesimistik Locks
RsForum.Recordset.MoveNext
If RsForum.Recordset.EOF Then
   RsForum.Recordset.MoveLast		'Sumber Error kalau data telah habis
End If

CancelcmdDelete:
Exit Sub

ErrCmdDelete_Click:
Select Case Err.Number
    'Data telah kosong
    Case 3021
         MsgBox "Data telah kosong", vbOKOnly + vbInformation, "Warning"
    'Data Page (2 kb) telah dikunci oleh pemakai lain
    Case 3260
         MsgBox "Data dikunci user lain, hapus tidak dapat dilakukan !", vbOKOnly + vbInformation
         Resume CancelcmdDelete
    Case Else
         MsgBox "Error" & Err.Number & vbCrLf & Err.Description
End Select
End Sub

Masalah pada Optimistik Locks

Masalah pada Optimistik Locks adalah kegagalan penguncian karena Page sedang dikunci oleh pemakai lain, sehingga permintaan Locks pada saat Update (Optimistik) gagal dilakukan, ataupun data telah diubah oleh pemakai lain sejak metoda Edit, karena pada Optimistik Locks, tetap terbuka pemakai lain melakukan Edit terhadap data yang sama.

Anda dapat menggunakan Error Handling untuk menangani kegagalan ini dengan mengevaluasi nilai Err yang dihasilkan, dalam hal ini adalah 3260 (kegagalan penguncian) dan 3197 (data telah berubah sejak metoda edit). Untuk merefresh data yang telah berubah, anda dapat menggunakan metoda Move 0.

Contoh :

Private Sub cmdUpdate_Click()
On Error GoTo ErrcmdUpdate_click
If txtForumID.Text = "" Then
   MsgBox "Forum ID tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
If txtKeterangan.Text = "" Then
   MsgBox "Keterangan tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
If txtAlamat.Text = "" Then
   MsgBox "Alamat tidak boleh kosong", vbCritical, "Warning"
   Exit Sub
End If
RsForum.Recordset.Update		'Sumber Error Pada Optimistik Locks
Flag = flNone
Call Kunci(True)
Call AturTombol(True, True, True, False, False)
RsForum.Recordset.Bookmark = RsForum.Recordset.LastModified
CancelcmdUpdate:
Exit Sub
ErrcmdUpdate_click:
Select Case Err.Number
    'Terjadi duplikasi pada Primary Key
    Case 3022
         MsgBox "Telah terjadi duplikasi pada Forum ID", vbOKOnly + vbInformation, "Warning"
    'Data telah dihapus pemakai lain	
    Case 3167
         MsgBox "Data telah dihapus pemakai lain" & vbCrLf & _
                "Lakukan refresh data anda !", vbOKOnly + vbInformation
    'Data telah berubah sejak metoda Edit
    Case 3197
         'Data pada recordset telah berubah
         'sejak ditampilkan.
         MsgBox "Data telah diubah oleh pemakai lain !", vbOKOnly + vbInformation
         'Hal ini secara otomatis akan menyegarkan
         'kembali recordset untuk menampilkan data terakhir
         RsForum.Recordset.Move 0
         Resume CancelcmdUpdate
    'Data Page (2 kb) telah dikunci oleh pemakai lain
    Case 3260
         'Record dikunci pemakai lain
         nHitung = nHitung + 1
         'Mencoba mengunci dua kali
         'Memungkinkan pemakai membuat keputusan ulangi, batal
         If nHitung > 2 Then
            nPilih = MsgBox("Data sedang dikunci pemakai lain" & vbCrLf & _
                            "Ulangi penguncian ?", vbYesNo + _
                            vbQuestion)
            If nPilih = vbYes Then
               nHitung = 1
            Else
               Resume CancelcmdUpdate
            End If
         End If
         DoEvents 'menjalankan event windows
         'menunda sejumlah waktu random
         nTunda = nHitung ^ 2 * Int(Rnd * 3000 + 1000)
         For i = 1 To nTunda: Next i
         Resume
    Case Else
         MsgBox "Error " & Err & ":" & Error, vbOKOnly
         Resume CancelcmdUpdate
End Select
End Sub

Recordset pada lingkungan MultiUser

Table

Suatu Recordset jenis Tabel mengambil data dari suatu tabel, anda dapat melakukan tambah, perbaiki maupun hapus data dari tabel, Hanya record yang aktif yang dimuat ke memori. Sehingga perubahan, penambahan dan penghapusan data oleh pemakai lain dapat langsung diakses.

Dynaset

Recordset jenis Dynaset adalah himpunan dari record-record secara dinamis yang dapat mengandung field-field dari satu atau lebih tabel maupun query yang dapat di update. Ketika user mengupdate data, maka tabel yang berkaitan akan berubah. Pada lingkungan MultiUser, perubahan data tersebut dapat langsung diakses, tetapi jika seorang user melakukan penambahan data, data tersebut tidak akan kelihatan sama user lain, sampai pemakaian metoda Requery (pada Data Kontrol digunakan Refresh). Jika seorang user menghapus suatu record, user lain akan diberitahu ketika akan mengakses record tersebut.

Contoh :

Private Sub cmdRefresh_Click()
RsForum.Refresh
End Sub

 

Latihan 1, Pengaturan Program MultiUser dengan Pesimistik Locks

Latihan 2, Pengaturan Program MultiUser dengan Optimistik Locks

Latihan 3, Judul : Mencoba Dynaset di lingkungan MultiUser


Dibuat  oleh hendra@indoprog.com
Medan - Sumatera Utara
Indonesia