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:
Fungsi di atas melibatkan berbagai macam fungsi yang telah dibuat di posting terdahulu. Berbagai macam fungsi itu adalah sebagai berikut:
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.
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
- 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 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