کنترلهای تعاملی فرم و سطوح امنیت کاربر
کنترلهای تعاملی فرم و سطوح امنیت کاربر
فصل ۳۹ — تعاملی کردن Controlهای Form
VBA میتواند Controlهای Form را Interactive کند. انتخاب User در یک Drop-down میتواند انتخابهای Drop-down دیگر را تعیین کند یا باعث Hidden/Disabled شدن Controlهای دیگر شود. اگر درست پیادهسازی شود، هنگام Browse رکوردها نیز Controlها خودکار واکنش نشان میدهند.
ساخت Table ساده
Tableای با سه Field متنی SupplierName، SupplierSize و SupplierRef بسازید و با نام tblSupplier ذخیره کنید. Primary Key لازم نیست. SupplierSizeها باید Small، Medium یا Large باشند.
شکل ۳۹-۱ — پنجرهٔ طراحی Table تأمینکنندگان
شکل ۳۹-۲ — دادههای Table تأمینکنندگان
ساخت Form برای Table
Form Design بسازید، Record Source را tblSupplier قرار دهید و دو Combo Box و یک Text Box اضافه کنید. Control Source اولی SupplierSize، دومی SupplierName و Text Box برابر SupplierRef باشد. Row Sourceِ SupplierSize:
SELECT DISTINCT SupplierSize FROM tblSupplier;
شکل ۳۹-۳ — Form تأمینکننده در Design mode
برای Combo0 (فرض شده Combo مربوط به SupplierSize است) Eventِ Change را انتخاب کنید:
Private Sub Combo0_Change()
Dim strTemp As String
Me.Combo0.SetFocus
strTemp = Me.Combo0.text
Me.Combo2.SetFocus
Me.Combo2.RowSource = _
"select distinct SupplierName from tblSupplier where SupplierSize='" _
& strTemp & "'"
If strTemp = "Small" Then
Me.Text4.Visible = False
Else
Me.Text4.Visible = True
End If
Me.Combo0.SetFocus
End Sub
نامهای پیشفرض مثال Combo0، Combo2 و Text4 هستند. مقدار SupplierSize در String گرفته و Row Sourceِ SupplierName بر اساس آن Filter میشود. اگر Size برابر Small باشد Text4 پنهان میشود.
در Eventِ Current فرم بنویسید:
Private Sub Form_Current()
Combo0_Change
End Sub
در نتیجه هنگام Browse رکوردهای tblSupplier نیز فرم خودکار مطابق SupplierSize Update میشود. تغییر SupplierSize نیز List مربوط به SupplierName را فوراً تغییر میدهد.
فصل ۴۰ — تنظیم سطوح امنیت کاربر
چون Application احتمالاً Multiuser است، باید مشخص شود هر User چه چیزی را میتواند ببیند یا تغییر دهد. ممکن است Userهای Basic فقط اطلاعات پایه ببینند، گروهی بیشتر ببینند اما نتوانند Edit کنند، گروهی رکوردها را تغییر دهند و Administratorها User و Privilege بسازند.
Tableای به نام tblUserRights با دو Text Field به نامهای UserName و UserLevel بسازید. Windows Login ID هر User و Level او را وارد کنید. Levelهای مثال: administrator، expert، novice و basic.
Declaration گرفتن User Name:
Public Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function عمومی گرفتن User Level:
Public Function ReturnUserLevel()
Dim strUser As String, X As Integer, RecSet as Recordset
strUser = Space$(256)
X = GetUserName(strUser, 256)
strUser = RTrim(strUser)
strUser = Left(strUser, Len(strUser) - 1)
Set RecSet = CurrentDb.OpenRecordset _
("select * tblUserRights where UserName='" & strUser & "'")
If RecSet.RecordCount Then
ReturnUserLevel = RecSet!UserLevel
Else
ReturnUserLevel = "unknown"
End If
Set RecSet = Nothing
End Function
Function، Windows Login را میگیرد و Recordset را بر اساس tblUserRights Filter میکند؛ اگر رکورد وجود داشته باشد UserLevel و در غیر این صورت unknown برگردانده میشود.
برای Form مخصوص Administrator:
If ReturnUserLevel <> "administrator" Then
MsgBox "You are not authorized to view this screen", vbCritical
DoCmd.Close
End If
برای دسترسی Read-only کاربر Basic و Edit برای بقیه:
If ReturnUserLevel = "unknown" then DoCmd.Close
If ReturnUserLevel = "basic" Then
Me.AllowAdditions = False
Me.AllowEdits = False
Me.AllowDeletions = False
Else
Me.AllowAdditions = True
Me.AllowEdits = True
Me.AllowDeletions = True
End If
برای مخفیکردن بعضی Controlها از Basic و Novice:
If ReturnUserLevel = "unknown" then DoCmd.Close
If ReturnUserLevel = "basic" Or ReturnUserLevel = "novice" Then
Me.Text1.Visible = False
Me.Label2.Visible = False
Else
Me.Text1.Visible = True
Me.Label2.Visible = True
End If
وقتی Control پنهان میشود Label همراه آن نیز باید پنهان شود. این روش همراه با قفلکردن Database در فصل ۲۴، Discipline مناسبی برای محدودکردن مسیرها و عملیات کاربران ایجاد میکند.
صفحهٔ پایانی این بخش در نسخهٔ اصلی عمداً خالی است.