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:
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.
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:
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.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.
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 FunctionAda tiga fungsi lain yang terlibat dalam fungsi ini:
- 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#saat akan disimpan, nilai field di form (antar muka pengguna) adalah sebagai berikut:
field1='a' field2=22 field3=#12/10/2017#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.
Comments
Post a Comment