Ada berbagai macam cara (atau dalam istilah VBA di Access sering disebut metode) untuk menambah dan memperbaharui sebuah record. Secara umum, penggunaan VBA untuk menambah dan memperbaharui record dapat dilakukan dengan dua cara yaitu melalui pernyataan SQL dan recordset.
Pada posting berikut ini kita menggunakan recordset untuk menambah dan memperbaharui record. Kita tidak menggunakan cara yang umum dilakukan, yaitu menuliskan nama tiap field dalam recordset seperti di bawah ini misalnya:
atau seperti yang MSDN lakukan di gambar berikut ini:
Cara di atas dalam penerapannya sangat tidak praktis, apalagi bila ada banyak field dari sebuah tabel yang ingin diperbaharui. Belum lagi satu tabel dengan tabel yang lain mempunyai field yang berbeda.
Jadi, kita akan sedikit memodifikasi cara umum di atas menjadi lebih sederhana dan bisa diaplikasikan ke berbagai macam tabel sebagai media penyimpanannya dan form sebagai antar mukanya. Untuk itu, kita membuat fungsi VBA yang dinamai memperbaharuiData seperti berikut ini. Dengan fungsi ini, kita hanya perlu menggunakan dua parameter saja, nama form yang aktif dan sumber tabel yang digunakan untuk memperbaharui record. Berikut ini adalah fungsi lengkapnya.
Ada tiga fungsi lain yang terlibat dalam fungsi ini:
Satu kelebihan lain dari fungsi ini, tidak semua nilai field yang dismpan di tabel akan diperbaharui. Bila nilai field yang ditampilkan di form sama dengan nilai field yang disimpan di tabel, kita bisa melewatkannya. Hanya field yang mempunyai nilai yang berbeda saja yang disimpan. Dengan demikian, waktu yang diperlukan untuk menyimpan menjadi lebih singkat.
Misalnya seperti ini:
Nilai awal field saat masih tersimpan di tabel:
saat akan disimpan, nilai field di form (antar muka pengguna) adalah sebagai berikut:
Mengingat nilai field1 dan field3 tidak berubah, maka hanya nilai field2 saja yang akan disimpan. Nilai field2 berubah dari 2 menjadi 22. Jadi, supaya mencerminkan data terbaru, maka nilai field2 harus disimpan di tabel. Nah, fungsi di atas hanya menyimpan nilai field yang berbeda dengan nilai awal field saat masih tersimpan di tabel.
Pada posting berikut ini kita menggunakan recordset untuk menambah dan memperbaharui record. Kita tidak menggunakan cara yang umum dilakukan, yaitu menuliskan nama tiap field dalam recordset seperti di bawah ini misalnya:
- rs!field1=nilai1
- rs!field2=nilai2
- rs!field3=nilai3
- dst.
Cara di atas dalam penerapannya sangat tidak praktis, apalagi bila ada banyak field dari sebuah tabel yang ingin diperbaharui. Belum lagi satu tabel dengan tabel yang lain mempunyai field yang berbeda.
Jadi, kita akan sedikit memodifikasi cara umum di atas menjadi lebih sederhana dan bisa diaplikasikan ke berbagai macam tabel sebagai media penyimpanannya dan form sebagai antar mukanya. Untuk itu, kita membuat fungsi VBA yang dinamai memperbaharuiData seperti berikut ini. Dengan fungsi ini, kita hanya perlu menggunakan dua parameter saja, nama form yang aktif dan sumber tabel yang digunakan untuk memperbaharui record. Berikut ini adalah fungsi lengkapnya.
- Function memperbaharuiData(frm As Form, strSql As String)
- Dim rs As Recordset
- Dim fld As Field
- Dim ctl As Control
- On Error GoTo Err_Msg
- If Not cekDbsTerbuka Then membukaDbs
- Set rs = membukaRecordset(strSql, True)
- If rs.RecordCount = 0 Then
- rs.AddNew
- With frm
- For Each fld In rs.Fields
- For Each ctl In .Controls
- If fld.Name = ctl.Name And fld.Type <> DB_OLE Then
- fld.Value = ctl.Value
- End If
- Next ctl
- Next fld
- End With
- Else
- rs.Edit
- With frm
- For Each fld In rs.Fields
- For Each ctl In .Controls
- If fld.Name = ctl.Name And fld.Type <> DB_OLE Then
- If fld.Value <> ctl.Value Or (IsNull(fld.Value) And Not IsNull(ctl.Value)) Then
- fld.Value = ctl.Value
- End If
- End If
- Next ctl
- Next fld
- End With
- End If
- rs.Update
- Exit_Function:
- rs.Close
- Set rs = Nothing
- Exit Function
- Err_Msg:
- MsgBox "Function memperbaharuiData, Error # " & str(Err.Number) & ", source: " & Err.Source & _
- Chr(13) & Err.description
- Resume Exit_Function
- End Function
- cekDbsTerbuka, memeriksa apakah database back-end dalam keadaan sudah terbuka atau belum.
- membukaDbs, bila database back-end masih belum terbuka, maka fungsi ini akan membuka database back-end
- membukaRecordset, membuka recordset (yang sesuai dengan kriteria tertentu)
- Buatlah form seperti dijelaskan di Fungsi Menampilkan Satu Record Dalam Aplikasi Database Back-end dan Front-end.
- Di bagian bawah dari control Kode Rekening, tambahkan dengan menyisipkan beberapa control berikut ini:
- Command Button (Form Control):
- Name=cmdSimpan
- Caption untuk label=Simpan
- Command Button (Form Control):
- Name=cmdTambahBaru
- Caption=Tambah
- Command Button (Form Control):
- Hasil akhir seperti gambar di bawah ini:
- Atur properti form untuk event Time Interval=3000 (sama dengan 3 detik)
- Berikut ini adalah kode VBA yang ada di modul form frmRekUtama
- 'Abaikan 3 baris di bawah ini, bila sudah ada di modul form
- Option Compare Database
- Private Const strNamaTabel = "tblRekUtama"
- Private Const strPrimaryKey = "KodeRek"
- Private Sub cmdSimpan_Click()
- Private Sub cmdSimpan_Click()
- Dim strKriteria As Variant
- Dim strSql As String
- If IsNull(Me.KodeRek) Or Me.KodeRek = vbNullString Then
- MsgBox "Anda tidak bisa menyimpan record ini karena tidak ada primary key.", vbExclamation
- Cancel = True
- Exit Sub
- End If
- strKriteria = membuatKriteriaString(strPrimaryKey, strNamaTabel, Me.KodeRek)
- strSql = "SELECT * FROM " & strNamaTabel & " WHERE " & strKriteria
- memperbaharuiData Me, strSql
- Me.txtInfo = "Record sudah disimpan, Kode Rekening: " & Me.KodeRek
- End Sub
- Private Sub cmdTambahBaru_Click()
- Dim ctl As Control
- Dim prp As Property
- For Each ctl In Me.Controls
- For Each prp In ctl.Properties
- If prp.Name = "ControlSource" Then ctl.Value = ctl.Properties("DefaultValue").Value
- Next prp
- Next ctl
- Me.KodeRek.SetFocus
- End Sub
Satu kelebihan lain dari fungsi ini, tidak semua nilai field yang dismpan di tabel akan diperbaharui. Bila nilai field yang ditampilkan di form sama dengan nilai field yang disimpan di tabel, kita bisa melewatkannya. Hanya field yang mempunyai nilai yang berbeda saja yang disimpan. Dengan demikian, waktu yang diperlukan untuk menyimpan menjadi lebih singkat.
Misalnya seperti ini:
Nilai awal field saat masih tersimpan di tabel:
- field1='a'
- field2=2
- field3=#12/10/2017#
- field1='a'
- field2=22
- field3=#12/10/2017#
Comments
Post a Comment