Di MS Access, bila kita membuat form dengan menggunakan sebuah tabel atau query sebagai record sourcenya, maka properti field yang terkait langsung dengan control yang ada di form akan diikutsertakan pada control yang terkait dengan field itu.
Misalnya, properti field name pada tabel akan berkaitan dengan properti control source pada sebuah form. Contoh lainnya:
Pada lingkungan front-end, keterkaitan properti field tabel dengan form control seperti ini sangat diperlukan. Sebagai misal, kita ingin mengubah nilai validasi beserta teks validasi yang ada di dalamnya. Dengan membuat fungsi VBA, kita bisa memanggil nilai validasi dan teks validasi yang ada di field di sebuah tabel untuk ditampilkan di form (pada form control yang terkait dengan field di tabel itu). Jadi untuk mengubah nilai validasi, kita hanya perlu mengubah properti validation value yang ada di field untuk ditampilkan di form control. Cara ini mungkin terasa ribet sekali (kompleks), tetapi akan membantu kelancaran trafik jaringan saat pemasukkan data dari client (front-end) ke server (back-end). Dengan menampilkan nilai validasi di form (front-end), maka proses validasi dilakukan di komputer client (front-end). Bila belum valid, data tidak akan bisa dimasukkan dan disimpan pada sebuah tabel ditempatkan di server (database back-end). Dengan cara ini pula, database menjadi reliable, karena hanya data yang memenuhi syarat saja (data yang valid) yang bisa dimasukkan ke database back-end.
Berikut ini adalah fungsi yang digunakan untuk mengatur properti field secara dinamis pada sebuah form:
Database back-end ini posisinya benar-benar terpisah dari front-end. Dengan mengacu pada penjelasan seperti di gambar 1 di atas, kita bisa mengaplikasikan fungsi arrayTampilkanPropertiField di sebuah form saat form dibuka (menggunakan event On Open). Kita hanya perlu memasukkan properti form control yang berkaitan (atau sama) dengan nama field sebuah tabel. Dengan cara ini, untuk mengubah properti form control, kita hanya perlu mengubah properti field pada sebuah tabel, tanpa perlu mengubah satu per satu properti field yang ada di form control, yang tentu saja melelahkan. Fungsi arrayTampilkanPropertiField akan mengaturnya secara dinamis, bila properti field di tabel diubah, maka properti form control yang berkaitan dengan field tabel ini juga akan berubah.
Terakhir, kita bisa saja menambahkan berbagai macam nilai pada Public Enum enumProperti di fungsi di atas. Jadi, silakan bereksperimen sendiri.
Misalnya, properti field name pada tabel akan berkaitan dengan properti control source pada sebuah form. Contoh lainnya:
- Properti input mask field pada tabel akan berkaitan dengan properti input mask pada sebuah form.
- Properti validation rule dan text akan berkaitan dengan properti validation rule dan text pada sebuah form.
![]() |
| Gambar 1. Keterkaitan form dengan desain tabel di Access |
Pada lingkungan front-end, keterkaitan properti field tabel dengan form control seperti ini sangat diperlukan. Sebagai misal, kita ingin mengubah nilai validasi beserta teks validasi yang ada di dalamnya. Dengan membuat fungsi VBA, kita bisa memanggil nilai validasi dan teks validasi yang ada di field di sebuah tabel untuk ditampilkan di form (pada form control yang terkait dengan field di tabel itu). Jadi untuk mengubah nilai validasi, kita hanya perlu mengubah properti validation value yang ada di field untuk ditampilkan di form control. Cara ini mungkin terasa ribet sekali (kompleks), tetapi akan membantu kelancaran trafik jaringan saat pemasukkan data dari client (front-end) ke server (back-end). Dengan menampilkan nilai validasi di form (front-end), maka proses validasi dilakukan di komputer client (front-end). Bila belum valid, data tidak akan bisa dimasukkan dan disimpan pada sebuah tabel ditempatkan di server (database back-end). Dengan cara ini pula, database menjadi reliable, karena hanya data yang memenuhi syarat saja (data yang valid) yang bisa dimasukkan ke database back-end.
Berikut ini adalah fungsi yang digunakan untuk mengatur properti field secara dinamis pada sebuah form:
Option Compare Database 'Abaikan pernyataan ini bila sudah ada
Public daoDbs As DAO.Database 'Abaikan pernyataan ini bila sudah ada
Public Enum enumProperti
prpAll = 0
prpName = 1
prpTypeGlobal = 2
prpTypeDetail = 3
prpSize = 4
prpDescription = 5
prpRangeMin = 6
prpRangeMax = 7
prpValidationRule = 8
prpValidationText = 9
prpDefaultValue = 10
prpCaption = 11
End Enum
Public Enum enumMinMaks 'Abaikan pernyataan ini bila sudah ada
angkaMinimum = 1
angkaMaksimum = 2
angkaNol = 0
End Enum
Function arrayTampilkanPropertiField(strNamaFieldArray As String, strNamaTabel As String, Optional intenumProperti As enumProperti) As Variant
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Dim prp As DAO.Property
Dim boolPrp As Boolean
Dim strDescription As String, strDefaultValue As String, strValidationRule As String
Dim strNamaField As String
Dim varRangeMin, varRangeMax As Variant
Dim varFieldPropertyArray As Variant
On Error GoTo Err_Msg
If InStr(1, strNamaFieldArray, ".") <> 0 Then strNamaField = Split(strNamaFieldArray, ".")(1) Else strNamaField = strNamaFieldArray
Set rs = membukaRecordset(strNamaTabel)
For Each fld In rs.Fields
If fld.name = strNamaField Then
boolPrp = False
For Each prp In fld.Properties
If prp.name = "Description" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp Then
strDescription = fld.Properties("Description").Value
Else
For Each prp In fld.Properties
If prp.Name = "Caption" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp = True Then
strDescription = fld.Properties("Caption").Value
Else
strDescription = "Properti ini tidak ada/belum diisi"
End If
End If
boolPrp = False
For Each prp In fld.Properties
If prp.Name = "Caption" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp Then
strCaption = fld.Properties("Caption").Value
Else
strCaption = "Properti Caption ini tidak ada/belum diisi"
End If
boolPrp = False
For Each prp In fld.Properties
If prp.name = "DefaultValue" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp Then
strDefaultValue = fld.Properties("DefaultValue").Value
Else
strDefaultValue = vbNullString
End If
boolPrp = False
For Each prp In fld.Properties
If prp.name = "ValidationRule" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp Then
strValidationRule = fld.Properties("ValidationRule").Value
Else
strValidationRule = vbNullString
End If
boolPrp = False
For Each prp In fld.Properties
If prp.name = "ValidationText" Then
boolPrp = True
Exit For
End If
Next prp
If boolPrp Then
strValidationText = fld.Properties("ValidationText").Value
Else
strValidationText = vbNullString
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Text" Then
varRangeMin = 0
varRangeMax = fld.Size
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Memo" Then
varRangeMin = CVar(rangeMemo)
varRangeMax = CVar(rangeMemo(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(0) = "Numeric" Then
If arrrayTampilkanTipeField(fld.Type)(1) = "Byte" Then
varRangeMin = CVar(rangeAngkaByte)
varRangeMax = CVar(rangeAngkaByte(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Double" Then
varRangeMin = CVar(rangeAngkaDouble)
varRangeMax = CVar(rangeAngkaDouble(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Single" Then
varRangeMin = CVar(rangeAngkaSingle)
varRangeMax = CVar(rangeAngkaSingle(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Currency" Then
varRangeMin = CVar(rangeAngkaCurrency)
varRangeMax = CVar(rangeAngkaCurrency(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Long Integer" Then
varRangeMin = CVar(rangeAngkaLong)
varRangeMax = CVar(rangeAngkaLong(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Replication Id (GUID)" Then
varRangeMin = 0
varRangeMax = 0
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Integer" Then
varRangeMin = CVar(rangeAngkaInt)
varRangeMax = CVar(rangeAngkaInt(angkaMaksimum))
End If
If arrrayTampilkanTipeField(fld.Type)(1) = "Decimal" Then
Dim varDecimalPrp As Variant
varDecimalPrp = tampilkanPrecisionScaleArrayADO(strNamaField, strNamaTabel)
varRangeMin = CVar(rangeangkaDecimal)
varRangeMax = CDec(rangeangkaDecimal(angkaMaksimum, CByte(varDecimalPrp(0)), CByte(varDecimalPrp(1))))
End If
End If
varFieldPropertyArray = Array(fld.name, _
arrrayTampilkanTipeField(fld.Type)(0), _
arrrayTampilkanTipeField(fld.Type)(1), _
fld.Size, _
strDescription, _
Nz(varRangeMin, 0), _
Nz(varRangeMax, 0), _
strValidationRule, _
strValidationText, _
strDefaultValue _
)
Exit For
End If
Next fld
If intenumProperti = prpAll Then
arrayTampilkanPropertiField = varFieldPropertyArray
Else
arrayTampilkanPropertiField = varFieldPropertyArray(intenumProperti - 1)
End If
Set rs = Nothing
Exit_Function:
Exit Function
Err_Msg:
MsgBox "Function arrayTampilkanPropertiField, Error # " & str(Err.Number) & ", source: " & Err.Source & _
Chr(13) & Err.Description
Resume Exit_Function
End Function
Function rangeMemo(Optional intEnumMinMaks As enumMinMaks) As Long
If intEnumMinMaks = 0 Then rangeMemo = 0
If intEnumMinMaks = angkaMinimum Then rangeMemo = 0
If intEnumMinMaks = angkaMaksimum Then rangeMemo = 65400
End Function
Fungsi di atas melibatkan berbagai macam fungsi yang telah dibuat di posting terdahulu. Berbagai macam fungsi itu adalah sebagai berikut:- membukaRecordset untuk membuka recordset
- arrrayTampilkanTipeField untuk menampilkan tipe field
- rangeMemo untuk menampilkan size dari tipe data Memo
- rangeAngkaByte untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Byte
- rangeAngkDouble untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Double
- rangeAngkaSingle untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Single
- rangeAngkaCurrency untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Currency
- rangeAngkaLong untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Long Integer
- rangeAngkaInt untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Integer
- rangeAngkaDecimal untuk menampilkan size minimum dan maksimum dari field dengan tipe data number dan size Decimal
- tampilkanPrecisionScaleArrayADO untuk menampilkan properti Precision dan Scale dari tipe data number dan size Decimal.
Implementasi
Berikut ini adalah contoh aplikasi fungsi arrayTampilkanPropertiField:?membukaDbs
?arrayTampilkanPropertiField("NamaRek","tblRekUtama",prpDescription)
Nama atau deskripsi rekening
?arrayTampilkanPropertiField("NamaRek","tblRekUtama",prpSize)
100
?arrayTampilkanPropertiField("NamaRek","tblRekUtama",prpTypeDetail)
Text
Gambar di bawah ini mungkin dapat menjelaskan jalannya fungsi di atas. Kotak Immediate pada gambar adalah cuplikan dari Immmediate Window (berada di front-end), sedangkan kotak di latar belakang adalah Design View dari tabel tblRekUtama yang ada di database back-end bernama Akunting.accdb. ![]() |
| Gambar 2. Immediate Window membaca properti field tabel |
Terakhir, kita bisa saja menambahkan berbagai macam nilai pada Public Enum enumProperti di fungsi di atas. Jadi, silakan bereksperimen sendiri.



Comments
Post a Comment