PDA

View Full Version : سوال: مشکل در شناسایی کلمات دارای ی



hasanr
سه شنبه 20 اردیبهشت 1390, 12:31 عصر
سلام من در ابتدای ورود به اکسس فرمی دارم که با گرفتن نام کاربری و پسورد افراد اونها رو به فرم اصلیم (frmBase)هدایت می کنه و نام کاربریشون رو در یک تکست باکس(CurUser) نشون میده

در فرمم کلیدی دارم(CmdOpenAll) که میخام فقط موقعی که کاربر با نام مدیر وارد شده اون کلید visible باشه و در سایر موارد دیده نشه این کد رو هم نوشتم اما به علت اینکه در محیط vb حرف ی به شکل نقطه دار ثبت میشه به مشکل بر میخورم . لطفا راهنمایی کنین




Private Sub Form_Load()
If me.TxtUser = "مدير" Then
me.CmdOpenAll.Enabled = True
Else
me.CmdOpenAll.Enabled = False
DoCmd.Beep
End If
End Sub

mehdi_moghimi
سه شنبه 20 اردیبهشت 1390, 20:53 عصر
قطعا شما نام يوزراتونو در داخل يه كمبو باكس قرار داديد كه اپراتور ميتونه اونو انتخاب كنه .اگه اينجوري باشه شما ميتونيد توي تيبلي كه نام يوزرا تونو ذخيره كرديد براي هر يوزر يه كد از نوع number تعريف كنيد وبه جاي اينكه كلمه "مدير" رو در داخل كدنويسي استفاده كنيد كدعددي مربوط به اين مدير را وارد كنيد وديگر چون متغير شما عدد هست به مشكل برنمي خوريد
مثلا كد 1 براي مدير كد2 براي يوزر1 كد 3 براي يوزر2 و ....

hasanr
سه شنبه 20 اردیبهشت 1390, 23:10 عصر
به این مورد هم فکر کردم اما نتونستم راهی پیدا کنم که عدد معدل با هر کاربر رو چک کنم
از اول میگم :
من جدولی دارم به نام tblUsers که شامل دو فیلد Name و Password هست
و فرمی شامل دو تکست باکس به نامهای TxtUsername و TxtPassword
اگر رمز عبور و نام کاربری درست باشند فرم Frm1 باز خواهد شد و نام کاربر در تکست باکسی به نام TxtUser نمایش داده میشه
( از این نام در گزارش گیری و .. استفاده می کنم و نمیخوام ي در اون باشه )
توی فرم Frm1 باتونی دارم به نام Btn1 که میخوام تنها در صورتی دیده بشه که کاربری با نام مدیر وارد شده باشه

مشکل اینه که در کد نویسی اکسس 2003 حرف ي ثبت میشه و با نام کاربر که ی داره نمیخونه

کد فرم ورودی هم اینه

Private Sub CommandEnter_Click()
Set Rst = CurrentDb.OpenRecordset(" select * from tblUsers where((Name='" & TxtUsername & "') and(Password='" & TxtPassword & "'))")
If Rst.EOF Then
Beep
Private Sub CommandEnter_Click()
Set Rst = CurrentDb.OpenRecordset(" select * from tblUsers where((Name='" & TxtUsername & "') and(Password='" & TxtPassword & "'))")
If Rst.EOF Then
Beep
MsgBox "نام کاربر يا کلمه عبور اشتباه مي باشد", vbCritical, "توجه"
DoCmd.GoToControl "txtUsername"
Else
DoCmd.OpenForm "Frm1"
Forms!Frm1!TxtUser = Forms!frmEnter!TxtUsername
DoCmd.Close acForm, "frmEnter", acSaveYes
End If
Rst.Close
End Sub
DoCmd.GoToControl "txtUsername"
Else
DoCmd.OpenForm "Frm1"
Forms!Frm1!TxtUser = Forms!frmEnter!TxtUsername
DoCmd.Close acForm, "frmEnter", acSaveYes
End If
Rst.Close
End Sub
اتفاقا روش شما هم خیلی خوب میتونه باشه چون در صورت موفقیت میشه به جدول کاربران فیلد سومی اضافه کرد که اگه 1 بود کاربر مدیر شناخته بشه و کلید Btn1 رو ببینه و اگه 0 بود نبینه و به راحتی بتونیم به هر کاربری که لازمه دسترسی بدیم
بنابر این به جز بحثی که درباره حرف ي داریم یک نکته هم می تونه این باشه که چطور یک کوِری یا اسکیول را اجرا کنیم ( برای بدست آوردن عدد نسبت داده شده به آن کاربر در جدول کاربران ) که آن عدد را در vb استفاده کنیم

wolfstander
چهارشنبه 21 اردیبهشت 1390, 07:23 صبح
سلام
شما میتونی از این کد برای جستجوی کاربرت استفاده کنی:

passwordsearch = DLookup("[password]", "tblName", "userID =" & personelnameCOMBO)
personelnameCOMBO کمبویی هست که توش کاربر، یوزر رو انتخاب میکنه

hasanr
چهارشنبه 21 اردیبهشت 1390, 12:15 عصر
ممنونم
فعلا مشکل بررسی مدیر بودن فرد لوگین کنده را به شکل غیر منطقی حذف کردم ( در پستهای بعدی نمونه میزارم )

درباره کد شما نکته اینجاست که بنا به دلایلی در فرم ورودی از کمبو استفاده نکرده ام
ضمنا بعد از اعتبار سنجی کاربر فرم ورود بسته شده و فرم Frm1 باز شده است که در یک تکست باکس نام کاربر را نمایش می دهد و الان می خواهم عدد وارد شده در فیلد AccessType آن کاربر ( در جدول کاربران)را بدست بیاورم
که با تغییراتی در کد شما می توان اینکار را کرد

wolfstander
چهارشنبه 21 اردیبهشت 1390, 13:40 عصر
سلام
خوب اون کد من، یک مثاله
شما میتونید به تکست باکستون وصلش کنید
مهم دستور Dlookup هستش که شما برای کار خودتون ازش قراره استفاده کنید
به جای کمبو باکس، اسم تکست باکستون رو تو کد بنویسید

hasanr
چهارشنبه 21 اردیبهشت 1390, 14:30 عصر
راستش Syntax دستور DLookup یادم رفته بود که با خوندن راهنمای اکسس یادم اومد
از راهنماییتون بی نهایت ممنونم

hasanr
چهارشنبه 21 اردیبهشت 1390, 18:57 عصر
هنوز مشکل داره :ناراحت:

mehdi_moghimi
چهارشنبه 21 اردیبهشت 1390, 22:05 عصر
نمونه اي كه براتون گذاشتم فرمي هست كه من توي شروع اكثر برنامه هام از اون استفاده ميكنم. قطعا بهتون كمك ميكنه

id1385
چهارشنبه 21 اردیبهشت 1390, 23:05 عصر
با سلام
دوست عزیز روال شما اشتباه است.!!! :متعجب:

من توی برنامه ای که نوشتم نیازی مثل همین پیشنهاد شما داشتم منتها با یک روش ابتکاری و خیلی ساده تونستم ساده و کارامدتر ایجادش کنم.

برنامه :
http://barnamenevis.org/showthread.php?221938-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%86%D8%A8%D8%A7%D8%B1%D8%AF%D8%A7%D8%B1%D B%8C-%DA%A9%D8%A7%D9%85%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 رو برمیگردونه و نمایش رو مقید میکنه به مقدار برگشتی، میگه که :
کاربر × میتونه این فرمو استفاده کنه ؟ جواب میتونه بله باشه که میشه استفاده کرد و میتونه نه باشه که با یک پیغام و یا هر نوع رفتار شما مواجه میشه


تشکر یادتون نره


موفق باشید

hasanr
چهارشنبه 21 اردیبهشت 1390, 23:18 عصر
از کمکتون ممنونم ولي دوست عزيز ، فرم ورود در نمونه ارسالي من کاملا درست کار مي کنه (هر چند در نمونه ارسالي شما نکات خوبي وجود داره )
استفاده از تابع dlookup که آقاي wolfstander (http://barnamenevis.org/member.php?26401-wolfstander) فرمودن علی القاعده باید درست باشه
در نونه ارسالی من ؛ نام کاربر و پسورد در فرم ورود با جدول کاربران چک میشه و وارد فرم frmBase میشیم و نام کاربر فعلی هم در تکست باکس نمایش داده میشه اما کدهای نوشته شده در رویداد onload فرم کار نمیکنن و کد دسترس رو نمی بینم و کنترل مورد نظرم disable نمیشه :ناراحت:
جالب اینجاست که در همون حالت وقتی فرم رو به حالت دیزاین میبیرم و دوباره به حالت طبیعی بر میگردونم ( دوباره رویداد onload اتفاق می افته) کدها کار میکنن :متعجب:
به نظرم در اجرای اولیه تابع dlookup مقدار null رو در متغیر قرار میده !!! ولی روش رفع مشکلو نمی دونم
اقای dadsara در اینجا (http://barnamenevis.org/showthread.php?152827-%D8%A7%D8%B4%D9%83%D8%A7%D9%84-%D8%AF%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%B4%D8%AF%D9%86-%D8%B3%D8%B7%D9%88%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%D9%8A-%D9%81%D8%B1%D9%85-%D9%87%D8%A7&p=700906&viewfull=1#post700906)توضیحاتی دادن که بخش 3 اون دقیقا برای مشکل بنده کارگشاست و پیاده سازی اون مد نظرمه

؟؟؟

id1385
چهارشنبه 21 اردیبهشت 1390, 23:44 عصر
شما اصلاً خوندین من دو صفحه چی نوشتم ؟
شما اگه میخواهید با زور برنامتون کار کنه خب بهش زور بدید!
ولی روش پیشنهادی بنده از همه حالت عالی و دقت برنامه نسبت به نمونه شما بالاست
نمیدونم خودتون بهتر میدونید البته روشهای بهتری هم وجود داره
:لبخند:

hasanr
پنج شنبه 22 اردیبهشت 1390, 00:14 صبح
سلام id1385 (http://barnamenevis.org/member.php?79574-id1385) من پست شما رو ندیده بودم و پست بالایی رو خطاب به دوست عزیزمون آقای mehdi_moghimi (http://barnamenevis.org/member.php?44506-mehdi_moghimi) نوشتم .

از توضیحات مبسوط شما که اینقد ریز مطلب رو بیان کردین واقعا ممنونم البته الان تند تند خوندمش و خواستم تشکر کرده باشم . روشتون هم کامله و هم جامع . . حتما میتونین اشکال کار منم رفع کنین
تو اینجا (http://barnamenevis.org/showthread.php?152827-%D8%A7%D8%B4%D9%83%D8%A7%D9%84-%D8%AF%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%B4%D8%AF%D9%86-%D8%B3%D8%B7%D9%88%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%D9%8A-%D9%81%D8%B1%D9%85-%D9%87%D8%A7&p=700906&viewfull=1#post700906)هم روش خوبی وجود داره

هنوز هم مشتاقم بدونم کجای نمونه من اشتباهه که نه تونستم مقدار acseeLevel رو در فرم اصلیم و نه کدها درست کار کرده ؟؟
امیدوارم روش آقای dadsara جواب این مسئله باشه

hasanr
پنج شنبه 22 اردیبهشت 1390, 14:08 عصر
id1385 (http://barnamenevis.org/member.php?79574-id1385)
سلام
توضیحاتتون رو خوندم اما متاسفانه نتونستم انجامش بدم
× پیامهای برنامتون فارسی نیستن و نفهمیدم چیه


اگه براتون ممکنه بزرگواری کنین و با ساده تر کردن کدهاتون در نمونه ارسالی بنده در فرم اصلی فقط با توجه به کاربری که وارد برنامه شده کلید CmdOpenFormAll رو که روش نوشته شده < فرم گزارش> رو فعال یا غیر فعال کنین یا اینکه سطح دسترس رو در تکست باکسی نشون بدین

بی نهایت ممنونم

id1385
پنج شنبه 22 اردیبهشت 1390, 22:40 عصر
با سلام
دوست عزیز مشکل شما به شکل زیر حل شد.

بعد از لاگین کردن هر کاربر در فرم اصلیتون به شکل زیر کاربر رو اعتبار سنجی میکنید و آبجکتهای موجود رو به شکل دلخواهنون نمالیش و یا غیر فعال و هر روش انتخابیتون رو میتونید اعمال کنید.

و اینکه نام کاربر حاضر رو میتونید در فرمتون نمایش دهید


Private Sub Form_Load()
For I = 1 To 5
Me("cmd" & I).Enabled = UserCanUse("cmd" & I)
Next I
LbUser.Caption = "[" & CurrentUser_Name & "]"
End Sub


و حالا این دو خط چه عملیاتی رو انجام میدهند.

تعاریف پایه در ماژول :


Public UserId As String ' save user id
Dim dbs As Database
Dim rst As Recordset
Dim strSql As String


فانکشن مربوز به نمایش نام کاربر:

Public Function CurrentUser_Name() As String
On Error GoTo err
If IsEmpty(UserId) = False Then
Set dbs = CurrentDb()
Dim RS As Recordset
Dim strSQL_1 As String
strSQL_1 = "SELECT * FROM [user] WHERE [id]=" & UserId & ";"
Set RS = dbs.OpenRecordset(strSQL_1)
CurrentUser_Name = RS.Fields(1)
Else
CurrentUser_Name = "?"
End If
Exit Function
err:
Exit Function
End Function


فانکشن مربوط به اعتبار هر کدام از باتن های موجود در فرم بنا به تعریف دسترسی هر کاربر:


Public Function UserCanUse(ObjectName As String) As Boolean
On Error GoTo err01
If IsEmpty(UserId) = False Then
Set dbs = CurrentDb()
strSql = "SELECT * FROM [userlevel]"
strSql = strSql & " WHERE [ObjectName]='" & ObjectName & "' AND [UserId]=" & UserId & ";"
Set rst = dbs.OpenRecordset(strSql)
If (rst.EOF) Then
UserCanUse = False
Else
'MsgBox "user can see " & ObjectName
UserCanUse = rst.Fields(2)
End If
End If
Exit Function
err01:
MsgBox Space(45) & "Error!" & Space(35), vbExclamation, "Error"
End Function


تا اونجا که راه داشت سعی کردم به شکل خیلی خیلی ساده ولی کارآمد مشکلتون رو حل کنم.



تشکر یادتون نره چون درسمو بی خیال شدم اومدم اینو حل کردم :بامزه:
موفق باشید

hasanr
پنج شنبه 22 اردیبهشت 1390, 23:40 عصر
id1385 (http://barnamenevis.org/member.php?79574-id1385)
خیلی خیلی تشکر که وقت گذاشتین راستشو بخایین زیاد از رکوردست و اینا اطلاع کافی ندارم
خوشبختانه تو برنامه انبارداری شما و توضیحات بقیه دوستان نکته ای بود که بوسیله اون برنامه رو درست کردم

در فرم ورود نام کاربر رو به شکل کمبو باکس کردم و در یکی از ستونها سطح دسترسی رو قرار دادم
از اینجا به بعدش مشکلی نبود اما شرحش میدم تا بحث تاپیک حل نشده باقی نمونه :
بعد از بررسی صحت نام و رمز کاربر فرم اصلی رو باز می کنم و عدد نشان دهنده سطح دسترسی رو به فرم اصلی انتقال دادم
روش اول :

strUserAclevel = TxtUsername.Column(2))
روش دوم :



strUserAclevel = DLookup("AccessLevel", "tblUsers", "UserID=" & Forms![frmEnter]!TxtUsername.Column(3))


( همه قالبهای فرمان DLookup در اینجا (http://barnamenevis.org/showthread.php?77475-DCount&p=387949&viewfull=1#post387949)هست )

حالا فرم ورود رو می بندم و قاعدتا باید در فرم اصلی با توجه به سطح دسترسی اعمال لازم مثل فعال یا غیر فعال کردن باتونها رو انجام بدم

اما مشکل اینه که چون اول فرم اصلی باز شده ( عمل لود انجام شده ) نمی تونم دستور فعال یا غیر فعال کردن باتونها رو در رویداد لود فرم اصلی بنویسم :ناراحت:

باز هم بابت وقتی که صرف کردین ممنونم

hasanr
جمعه 23 اردیبهشت 1390, 02:31 صبح
خوشبختانه حلش کردم
قبل از بستن فرم ورود ، فوکوس رو به یک شی فرم اصلی دادم
Forms!frmBase!txtCurUser.SetFocus
و کدها رو در رویداد On Got Focus اون نوشتم

از همتون ممنونم

mrja2002
جمعه 20 مرداد 1391, 12:57 عصر
سلام به همه ی عزیزان من در اول فایل access یه فرم دارم که user و pass رو میگیره و به فرم اصلی میره .میخوام وقتی شخصی login کرد اسمش تو رکوردی که اطلاعات وارد می کنه خودکار ثبت بشه .لطفاً راهنمایی کنید

Abbas Amiri
جمعه 20 مرداد 1391, 14:03 عصر
راه ساده اینست که در یک ماژول ، یک متغیر عمومی تعریف کنید(Public UserNam As String) ودر زمان ورود به سیستم درفرم LogIn آنرا با نام کاربر مقداردهی کنید(UserNam = Me.User) . در فرمهایی که مخصوص دریافت و یا ویرایش اطلاعات است، در رویداد Current فرم ، فیلد User را به آن نسبت دهید(Me.User= UserNam)
راه دیگر هم استفاده ازجدول ثبت ورودوخروج کاربران و دسترسی به فرمها و اشیا مختلف است که پیچیده تراست..

hmdrzy
چهارشنبه 24 آبان 1396, 13:03 عصر
با سلام
وقتی اجرا میکنم رو ی عبارت AddressOf خطا میده