PDA

View Full Version : فیلتر و حذف فیلتر ساخته شده بر اساس کوئری (remove filter)



hamid-nice
شنبه 02 شهریور 1392, 03:08 صبح
با سلام
در فایل ضمیمه اگر در تکست باکس با نام Text5 نامی که در جدول هست مثلا amir را بنویسیم و دگمه فیلتر را بزنیم ساب فرم (form3) فیلتر می شود
سوال : چه کدی در دگمه "حذف فیلتر " باید بنویسیم تا بدون اینکه کلمه amir که در Text5 نوشته ایم پاک شود ، ساب فرم "form3 " از فیلتر خارج شود
با تشکر

alirezabahrami
شنبه 02 شهریور 1392, 17:52 عصر
با سلام
در فایل ضمیمه اگر در تکست باکس با نام Text5 نامی که در جدول هست مثلا amir را بنویسیم و دگمه فیلتر را بزنیم ساب فرم (form3) فیلتر می شود
سوال : چه کدی در دگمه "حذف فیلتر " باید بنویسیم تا بدون اینکه کلمه amir که در Text5 نوشته ایم پاک شود ، ساب فرم "form3 " از فیلتر خارج شود
با تشکر
سلام
یک راه ساده این است که یک متغیر تعریف کنید و آن را مساوی text5 قرار بدهید و در نهایت بعد از حذف فیلتر text5 را مجدداً مساوی با آن متغییر قرار بدهید.
کد زیر را در رویداد کلیک کمند باتن حذف فیلتر قرار بده و امتحان کن!


Dim RemoveTxt As String
RemoveTxt = Text5
Text5 = ""
Form3.Requery
Text5 = RemoveTxt

موفق باشید

Abbas Amiri
شنبه 02 شهریور 1392, 18:47 عصر
سلام
یک راه ساده این است که یک متغیر تعریف کنید و آن را مساوی text5 قرار بدهید و در نهایت بعد از حذف فیلتر text5 را مجدداً مساوی با آن متغییر قرار بدهید.
کد زیر را در رویداد کلیک کمند باتن حذف فیلتر قرار بده و امتحان کن!


Dim RemoveTxt As String
RemoveTxt = Text5
Text5 = ""
Form3.Requery
Text5 = RemoveTxt

موفق باشید

احتمالا کنترل Text5 مقید شده است ، که بعد از رفع فیلتر مقدار آن تغییر می کند . در این صورت نتیجه به این صورت خواهد بود که بعد از Requery مقدار فیلد مربوط به Text5 در اولین رکورد ، مقدار قبلی Text5را خواهد داشت .

آیا منظور hamid-nice همین عملکرد است ؟

hamid-nice
یک شنبه 03 شهریور 1392, 13:34 عصر
احتمالا کنترل Text5 مقید شده است ، که بعد از رفع فیلتر مقدار آن تغییر می کند . در این صورت نتیجه به این صورت خواهد بود که بعد از Requery مقدار فیلد مربوط به Text5 در اولین رکورد ، مقدار قبلی Text5را خواهد داشت .

آیا منظور hamid-nice همین عملکرد است ؟
با سلام و تشکر از دوستان گرامی
با کد ارایه شده در پست 2# مشکل حل شد
با تشکر

hamid-nice
یک شنبه 03 شهریور 1392, 16:27 عصر
با سلام
یک راه حل دیگری با استفاده از record source در ضمیمه قرار دادم امیدوارم مفید واقع شود

اما 3 تا سوال داشتم :
1- در دگمه پاک کردن صفحه چه دستوری بنویسیم که اگر حتی 30 تا فیلد unbound هم داشته باشیم هرچه در آنها نوشته ایم پاک شود و آماده برای نوشتن مجدد شوند (مخصوصا وقتیcheck box داریم)منظورم این هست که برای تک تک فیلدها دستور را تکرار نکنیم بلکه یک دستور کلی وجود داره؟)
2-چه دستوری در کوئری یا دگمه فیلتر اضافه کنیم (یا تغییر دهیم ) که وقتی مثلا فقط یک حرف را در text5 می نویسیم و فیلتر را می زنیم هر اسمی که آن حرف را دارد را فیلتر کند؟
3-وقتی می نویسیم ""=Text5دقیقا معادل با Delete کردن محتوای آن هست؟
با تشکر

alirezabahrami
یک شنبه 03 شهریور 1392, 19:10 عصر
با سلام
یک راه حل دیگری با استفاده از ریکورد ست در ضمیمه قرار دادم امیدوارم مفید واقع شود
اما 3 تا سوال داشتم :
1- در دگمه پاک کردن صفحه چه دستوری بنویسیم که اگر حتی 30 تا فیلد unbound هم داشته باشیم هرچه در آنها نوشته ایم پاک شود و آماده برای نوشتن مجدد شوند (مخصوصا وقتیcheck box داریم)منظورم این هست که برای تک تک فیلدها دستور را تکرار نکنیم بلکه یک دستور کلی وجود داره؟)
2-چه دستوری در کوئری یا دگمه فیلتر اضافه کنیم (یا تغییر دهیم ) که وقتی مثلا فقط یک حرف را در text5 می نویسیم و فیلتر را می زنیم هر اسمی که آن حرف را دارد را فیلتر کند؟
3-وقتی می نویسیم ""=Text5دقیقا معادل با Delete کردن محتوای آن هست؟
با تشکر

سلام
در ارتباط با سوال اول چند راه وجود دارد که یکی از راهها استفاده از حلقه و مشخص کردن نوع ControlType کنترل هائی است که قرار است مقدار آن پاک شود است.
فرض اول : اگر قرار است بدون استثناء مقدار همه فیلدهای فرم پاک شود
در این حالت شرط حلقه این است که کنترل هائی که کنترل تایپ آنها ازنوع تکست باکس است پاک شوند که در این حالت کد زیر را بکار می بریم:


Dim Ctl As Control, i As Integer
For Each Ctl In Me.Controls
With Ctl
If .ControlType = acTextBox Then
.Value = ""
End If
End With
Next Ctl


فرض دوم این است که فقط میخواهیم مقدار تعدادی از فیلدها پاک شوند نه همه.
در این حالت میتوانیم خصوصیت tag فیلدهائی که قرار است مقدار آنها پاک شوند را برابر یک مقدار مشخص نمائیم و شرط حلقه این باشد که کنترل هائی که کنترل تایپ آنها ازنوع تکست باکس است و مقدار تگ آنها هم مثلاً 10 است را پاک کن؛ در این حالت کد زیر را بکار می بریم:


Dim Ctl As Control, i As Integer
For Each Ctl In Me.Controls
With Ctl
If .ControlType = acTextBox And .Tag = 10 Then
.Value = ""
End If
End With
Next Ctl


در ارتباط با سوال دوم در قسمت criteria کوئری کد زیر را وارد کن!


Like "*" & [Forms]![Form1]![Text5] & "*"

متوجه منظورت در سوال سه نشدم
یاعلی

hamid-nice
یک شنبه 03 شهریور 1392, 23:39 عصر
با سلام و تشکر از آقای بهرامی
کدهای مربوط به فرض اول شما در بالا را با کمی تغییر به صورت زیر نوشتم و برای همه کنترلهام (از جمله checkbox ها) جواب داد فقط این نکته را باید توجه کرد که on error resume next را حتما بنویسیم چرا که در یک فرم ممکن است کنترلهایی داشته باشیم که برایشان مقدار مورد نظر بی معنی باشد و هنگام اجرا قطعا مواجه با error و توقف اجرا می شویم
On Error Resume Next
Dim Ctl As Control
For Each Ctl In Me.Controls
With Ctl
.Value = Null
End With
Next Ctl

نکته در مورد checkbox ها: وقتی به صورت unbound بکار می بریم در office 2010 اگر در زبانه Data ی آن خاصیت ،Triple state را yes کنیم سه حالته می شود که در اینصورت هم کد فوق درست عمل می کند

اگر اشکالی میبینید لطفا بیان کنید همچنین بکار بردن عبارت Null به جای "" به نظر شما می تواند جایی با هم نتیجه متفاوتی ارائه کند(منظورم هم از سوال سوم در چنین زمینه هایی بود) ؟
با تشکر
موفق باشید

hamid-nice
چهارشنبه 06 شهریور 1392, 19:05 عصر
با سلام
1-یک نمونه دیگری برای جستجو (فیلتر کردن) بر اساس qurey در زیر ضمیمه کرده ام که یک سابفرم را فیلتر می کنه و همه چیز درست عمل میکنه به جز اینکه وقتی در یکی از فیلد های سابفرم قرار بگیریم و راست کیک کنیم و از فیلتر منوی باز شده استفاده کنیم و دوباره با راست کلیک در همانجا ، فیلتر مربوطه را حذف کنیم و سپس به قسمت بالا رفته و مثلا در text1 بنویسیم Ali و دگمه جستجو را که بر اساس کوئری عمل می کنه ، بزنیم میبینیم که دگمه جستجو دیگه فیلتر نمی کنه و تا فرم را باز و بسته نکنیم به عملکرد صحیح خودش برنمی گرده
2- چطور میشه عملکرد دگمه جستجو را بدون کوئری و صرفا با کد VBA نوشت؟
عزیزان اگه یک نگاهی بیاندازند و راه حلی ارائه دهند ممنون می شم
با تشکر

alirezabahrami
چهارشنبه 06 شهریور 1392, 19:47 عصر
با سلام
1-یک نمونه دیگری برای جستجو (فیلتر کردن) بر اساس qurey در زیر ضمیمه کرده ام که یک سابفرم را فیلتر می کنه و همه چیز درست عمل میکنه به جز اینکه وقتی در یکی از فیلد های سابفرم قرار بگیریم و راست کیک کنیم و از فیلتر منوی باز شده استفاده کنیم و دوباره با راست کلیک در همانجا ، فیلتر مربوطه را حذف کنیم و سپس به قسمت بالا رفته و مثلا در text1 بنویسیم Ali و دگمه جستجو را که بر اساس کوئری عمل می کنه ، بزنیم میبینیم که دگمه جستجو دیگه فیلتر نمی کنه و تا فرم را باز و بسته نکنیم به عملکرد صحیح خودش برنمی گرده
2- چطور میشه عملکرد دگمه جستجو را بدون کوئری و صرفا با کد VBA نوشت؟
عزیزان اگه یک نگاهی بیاندازند و راه حلی ارائه دهند ممنون می شم
با تشکر
سلام
نمونه اصلاح شده خودت را ببین!
یا علی

hamid-nice
چهارشنبه 06 شهریور 1392, 20:39 عصر
سلام
نمونه اصلاح شده خودت را ببین!
یا علی
با سلام و تشکر از نمونه ای که گذاشتید
1- نمونه ای که گذاشتید وقتی با راست کلیک فیلتر را انجام می دهیم و پشت آن از دگمه جستجو هم برای فیلتر دیگری استفاده می کنیم فیلتر قبلش که با راست کلیک انجام شده از بین می رود و در واقع اول فیلتر قبلی حذف می شود در صورتی که فایلی که من در پست قبلی گذاشتم اینگونه نیست اگر این را اصلاح فرمایید ممنون می شم( در واقع می خوام فیلتر ی که انجام می شه با راست کلیک و جستجو همدیگر را پوشش داده یعنی از روی اطلاعات فیلتر شده همدیگر ، فیلتر کنند)
2- اگر ممکنه هم با کد و هم با استفاده از Query فایل را اصلاح فرمایید (منظورم از کد این بود که اصلا از Query استفاده نشه و Record source سابفرم را هم جدول کنیم)

بسیار ممنونم

hamid-nice
سه شنبه 12 شهریور 1392, 17:55 عصر
با سلام
دوستان اگه برای سوال 1 در پست بالا هم ، راه کاری ارایه دهند ممنون میشم که سوال 1 برام در اولویت است
با تشکر

alirezabahrami
سه شنبه 12 شهریور 1392, 18:29 عصر
با سلام
دوستان اگه برای سوال 1 در پست بالا هم ، راه کاری ارایه دهند ممنون میشم که سوال 1 برام در اولویت است
با تشکر
سلام
در رکورد سورس سابفرم نمونه بنده بجای Query1 کد زیر راجایگزین کن:


SELECT Query1.name, Query1.family, Query1.tel FROM Query1;


یاعلی

hamid-nice
سه شنبه 12 شهریور 1392, 19:13 عصر
سلام
در رکورد سورس سابفرم نمونه بنده بجای Query1 کد زیر راجایگزین کن:


SELECT Query1.name, Query1.family, Query1.tel FROM Query1;


یاعلی
با تشکر از پاسختون ولی هنوز مشکل عنوان شده در سوال 1 در پست10# با راهکاری که ارائه کردید حل نشده است یعنی با زدن دگمه جستجو ، فیلتر اعمال شده به وسیله فیلترینگ راست کلیک ، remove می شود و این را در پایین سابفرم درنمایشگر فیلتر آن می توانید مشاهده کنید و در واقع با استفاده از دگمه جستجو برای فیلتر بعدی دیگر روی فیلتر انجام شده با راست کلیک صورت نمی گیرد

در نمونه زیر
ابتدا naderi را با راست کلیک در سابفرم فیلتر کنید سپس در Text1 نام شمه را نوشته و با دگمه جستجو فیلتر کنید
خواهید دید که روی نتیجه حاصله از فیلتر با راست کلیک قبلی ، جستجو عمل نمی کند
با تشکر منتظر ارائه راهکار دیگری هستم

alirezabahrami
سه شنبه 12 شهریور 1392, 22:34 عصر
با تشکر از پاسختون ولی هنوز مشکل عنوان شده در سوال 1 در پست10# با راهکاری که ارائه کردید حل نشده است یعنی با زدن دگمه جستجو ، فیلتر اعمال شده به وسیله فیلترینگ راست کلیک ، remove می شود و این را در پایین سابفرم درنمایشگر فیلتر آن می توانید مشاهده کنید و در واقع با استفاده از دگمه جستجو برای فیلتر بعدی دیگر روی فیلتر انجام شده با راست کلیک صورت نمی گیرد

در نمونه زیر
ابتدا naderi را با راست کلیک در سابفرم فیلتر کنید سپس در Text1 نام شمه را نوشته و با دگمه جستجو فیلتر کنید
خواهید دید که روی نتیجه حاصله از فیلتر با راست کلیک قبلی ، جستجو عمل نمی کند
با تشکر منتظر ارائه راهکار دیگری هستم
من که متوجه نشدم ، با راست کلیک نام naderi در سابفرم فیلتر میشود
سپس با تایپ شمه (که جزء نام های موجود در جدول نمیباشد)بعنوان نام در Text1 و کلیک بر روی کمند باتن جسجو ، سابفرم خالی شده و چیزی را نمایش نمی دهد و این طبیعی است چون شما در مرحله دوم نامی را جسجو و فیلتر می نمائید که موجود نمی باشد.
یاعلی

hamid-nice
سه شنبه 12 شهریور 1392, 22:50 عصر
با تشکر از دوستان گرامی

من که متوجه نشدم ، با راست کلیک نام naderi در سابفرم فیلتر میشود
سپس با تایپ شمه (که جزء نام های موجود در جدول نمیباشد)بعنوان نام در Text1 و کلیک بر روی کمند باتن جسجو ، سابفرم خالی شده و چیزی را نمایش نمی دهد و این طبیعی است چون شما در مرحله دوم نامی را جسجو و فیلتر می نمائید که موجود نمی باشد.
یاعلی
ببخشید اشتباه تایپی شده است اصلا نیازی به نوشتن کلمه شمه یا چیز دیگری نیست تنها کافی است دگمه جستجو زده شود و فیلتر انجام شده قبلی از بین می رود و به این ترتیب این دو همدیگر را پوشش نمی دهند
اما
راهی به نظرم رسید که خوشبختانه کار کرد که به صورت زیر می باشد:
باید کدی بنویسیم که چک کند که آیا فیلتری که توسط راست کلیک روی سابفرم صورت گرفته هنوز برقرار است یا پاک شده است و در هر یک ، عمل مربوطه را انجام دهد
نمونه زیر بیانگر مطلب فوق است
موفق باشید

alirezabahrami
سه شنبه 12 شهریور 1392, 23:18 عصر
این همه سوال و این همه پاسخ دریغ از فشار دادن یک دکمه تشکر !!!!!؟؟؟؟؟؟

hamid-nice
سه شنبه 12 شهریور 1392, 23:24 عصر
این همه سوال و این همه پاسخ دریغ از فشار دادن یک دکمه تشکر !!!!!؟؟؟؟؟؟

دوست گرامی من که در هر پست تشکر کرده ام فکر می کردم بهتر از فشار دادن یک دگمه باشد فکر نمی کرم به چشم نیاید

دگمه تشکر را هم در نظر داشتم ولی گذاشته بودم برای پستی که جواب نهایی در آن گرفته می شد

به هر حال از زحمات و توجه و پاسخهایتان بسیار ممنونم
موفق باشید

alirezabahrami
سه شنبه 12 شهریور 1392, 23:40 عصر
دوست گرامی من که در هر پست تشکر کرده ام فکر می کردم بهتر از فشار دادن یک دگمه باشد فکر نمی کرم به چشم نیاید
به هر حال از زحمات و تو جه و پاسختان خیلی ممنونم
موفق باشید
بزرگوار!
اظهار تشکر با استفاده از دکمه تشکر بیشتر ازاینکه جنبه قدردانی از پاسخ دهنده را داشته باشد جنبه تائید پاسخ از سوی پاسخ گیرنده را دارد و صرفاً اظهار تشکر نوشتاری باعث ایجاد یک نوع ابهام برای پاسخ دهنده در خصوص پاسخی که ارائه نموده می نماید.
فکر میکنم حداقل در پست های 2 و 6 به جواب صحیح رسیده باشید.
موفق باشید

hamid-nice
سه شنبه 12 شهریور 1392, 23:50 عصر
بزرگوار!
اظهار تشکر با استفاده از دکمه تشکر بیشتر ازاینکه جنبه قدردانی از پاسخ دهنده را داشته باشد جنبه تائید پاسخ از سوی پاسخ گیرنده را دارد و صرفاً اظهار تشکر نوشتاری باعث ایجاد یک نوع ابهام برای پاسخ دهنده در خصوص پاسخی که ارائه نموده می نماید.
فکر میکنم حداقل در پست های 2 و 6 به جواب صحیح رسیده باشید.
موفق باشید
دوست گرامی در مورد تاییدیه جواب در مورد پستهای 2 و 6 ، در پست بعدی هرکدام، به وضوح بیان کرده ام که جواب حاصل شده است بنابراین صرفا برای تایید حصول جواب ، از دگمه تشکر استفاده نکردم
در مورد پاسخ پست 14# هم که جا افتاده بود ولی در پست 15# هم اینک اصلاح کردم )
باز هم در آخر برای زحماتتان جهت پاسخگویی به پستهای اینجانب و سایر کاربران سپاسگزارم
موفق باشید