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 FunctionFungsi 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) TextGambar 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