با سلام
دوست عزیز روال شما اشتباه است.!!!
من توی برنامه ای که نوشتم نیازی مثل همین پیشنهاد شما داشتم منتها با یک روش ابتکاری و خیلی ساده تونستم ساده و کارامدتر ایجادش کنم.
برنامه :
https://barnamenevis.org/showthread.p...5%D9%84/page11
و اما روش من :
همه ی فرمهای شما یک نام بخصوصی دارن و دوتا فرم همنام ندارید (غیرممکنه)
شما یک جدول درست کنید و فیلدهای آن را به تعداد مورد نیاز :
1 - ID از نوع کلید اصلی
2 - username و یا هر نام دلخواه که برای ذخیره نام کاربری استفاده می شود
3 - pass و یا ...
4 - فرض میکنیم شما یک فرم به نام Frmain دارید و یک فرم بنام Frstartup فرم Frstartup همان فرمی است که از آن بعنوان فرم ورود استفاده میکنیم و یوزر و پسورد را در آن اعتبار سنجی میکنیم
و اگر نام کاربری و رمز درست بود (بر فرض فعال بودن کاربر) فرم Frmain نمایش داده میشه و روال frstartup پایان میگیره خب چکار کنیم ؟
خب سادست شما به تعداد فرمهایی که دارید فیلد درست میکنید منتها فیلدی که نوعش Yes/No هستش و اسمش دقیقاً اسم فرمتون مثل Frmain Or another
خب تا اینجا معلومه، حالا فرض کنید یوزر ATA قابلیت مشاهده و یا حتی ویرایش و یا حتی اعمالهای دیگر را در فرم Frmain بعضی رو بله و بعضی رو خیر هست.
اعتبار هر کدام به سادگی یک چک کردن / و آنچک کردن قابلیت یک فرم هست.
حالا بریم سر اصل موضوع ورود، فرم استارتاپ رو Load میکنیم با باز شدن برنامه
فیلدهای Username and password textbox's رو validate میکنیم و اعتبارسنجی میکنیم
حالا بریم سر اصل موضوع
خب اول ببنیم کاربر فعال است یا نه (Optional)
Dim isactiv As Boolean
isactiv = DLookup("active", "user", "id=" & txt_user.Column(2))
خب فرض کنید مقدار برگشتی برابر True می باشد خب Next Level
If IsNull(isactiv) = True Then
MsgBoxFa Space(40) & " ÎØÇíí ÏÑ ÇÌÑÇí ÈÑäÇãå ÑÎ ÏÇÏå ÇÓÊ¡ áØÝÇð í˜ ÈÇÑ ÏíÑ ÇãÊÍÇä äãÇííÏ " & Space(50), vbExclamation
Exit Sub
ElseIf isactiv = False Then
MsgBoxFa Space(35) & " ˜ÇÑÈÑ ÜÜÑÇãí ÍÓÇÈ ˜ÇÑÈÑí ÔãÇ ÛíÑ ÝÚÇá ÇÓÊ¡ áØÝÇð ÈÇ ãÏíÑíÊ ÈÑäÇãå ÏÑãíÇä ÈÐÇÑíÏ " & Space(50), vbApplicationModal, txt_user.Value
Exit Sub
ElseIf isactiv = True Then
Bright :
خب تا اینجا روشنه بریم چک کنیم آیا رمز مختص به کاربر هست یا نه ؟؟
ElseIf isactiv = True Then
Select Case txt_pas
Case Is = Temp$
DoCmd.ShowToolbar "main_toolbar", acToolbarYes
ActiveUser = txt_user.Column(2)
ActivUserName = txt_user.Column(1)
DoCmd.Close acForm, Me.name
Case Is <> Temp$
rs = MsgBoxFa(Space(40) & " ÑãÒ ÚÈæÑ ÇÔÊÈÇå ãí ÈÇÔÏ " & Space(60), vbExclamation + vbRetryCancel, "ÎØÇ")
If rs = vbRetry Then
txt_pas.SetFocus
txt_pas.Value = Null
Else
DoCmd.Close
Exit Sub
End If
Case Else
Exit Sub
End Select
End If
End Sub
خب ببنید ما اینجا رمز رو چک کردیم و اگه رمز همخوانی داشت تولبار ساخته شده ی ما نشون داده می شه و در غیر صورت ...
حالا در تولبار ما منوی تعدادی از منوها هست که میخواهیم بعضی کاربرها به آن دسترسی داشته باشند و بعضی No
حالا توی هر فرم دوباره برمیگردیم و دنبال مقدار فیلد که برابر با نام فرم ما هست میگردیم و آن را درجایی که ID یوزر نیم برابر با ActiveUser است.
خب یه فانکشن چند خطی مشکل مارو حل میکنه:
Public Function UserCanUseThisForm(Formname As String) As Boolean
On Error GoTo RR
'abality = select formname where userid = USERID
Dim DoualCou As String, IsAbale As Boolean
'DoualCou = DLookup("chart", "phars", "id=1")
IsAbale = DLookup(Formname, "user", "id=" & ActiveUser)
If IsAbale = False Then
UserCanUseThisForm = False
MsgBox Space(35) & " ˜ÇÑÈÑ ÜÜÑÇãí ÍÓÇÈ ˜ÇÑÈÑí ÔãÇ ÈÑÇí ÇäÌÇã Çíä ÝÚÇáíÊ ãÍÏæÏ ãí ÈÇÔÏ " & Space(50), vbApplicationModal, "ãÍÏæÏíÊ"
DoCmd.Close acForm, Formname
Else
UserCanUseThisForm = True
End If
Exit Function
RR:
DoCmd.Close
MsgBox Space(40) & "ÎØÇíí ÏÑ ÑæÓå ÈÑäÇãå ÈæÌæÏ ÂãÏå ÇÓÊ áØÝÇð ãæÇÑÏ ÑÇ í˜ ÈÇÑ ÏíÑ ÈÑÑÓí äãÇííÏ" & Space(55), vbExclamation, "ÎØÇ"
Exit Function
End Function
خب اینم تابلوه!!
حالا بریم سر اصل فرمها:
در روال Open و یا Load هر یک از فرمهایتون فانکشن بالا رو Call کنید به این شکل:
Private Sub Form_Open(Cancel As Integer)
UserCanUseThisForm (Me.name)
End Sub
توی قسمت بالا UserCanUseThisForm یک مقدار True/False رو برمیگردونه و نمایش رو مقید میکنه به مقدار برگشتی، میگه که :
کاربر × میتونه این فرمو استفاده کنه ؟ جواب میتونه بله باشه که میشه استفاده کرد و میتونه نه باشه که با یک پیغام و یا هر نوع رفتار شما مواجه میشه
تشکر یادتون نره
موفق باشید