PDA

View Full Version : فيلتر كردن اطلاعات



mahmood3d
یک شنبه 03 شهریور 1387, 22:01 عصر
من ميخوام از يك جدول طوري ليست بگيرم كه چندتا فيلتر روش اعمال بشه . توي برنامه من مي خوام ليست كلاسي يك كلاس رو دربيارم و مثلا فقط اسامي كساني توي ليست باشه كه شامل كلاس اول باشه و سنش بالاي 18 سال باشه . وقتي كه فيلتر اول رو اعمال مي كنم جواب مي ده ولي وقتي فيلتر دومي هم اعمال ميشه ليست خالي مي شه .
از دوستان هر كسي راه حل اين مشكل رو بلده راهنمايي كنه .

maryamb
دوشنبه 04 شهریور 1387, 10:23 صبح
این هم فیلتر با دو پارامتر :
Private Sub cmdfilter_Click()
Dim payename As String
Dim shakhename As String
shakhename = Combo3.Text
payename = Combo4.Text
If shakhename = "" Then Exit Sub
Adodc2.Recordset.Filter = "shakhe = '" & shakhename & " ' and paye = '" & payename & " '"
End Sub

mahmood3d
دوشنبه 04 شهریور 1387, 19:04 عصر
دوست عزيز با انجام دادن اين كار بازم تمام ركورد ها غيب ميشه .
در ضمن براي حذف اين فيلتر چكار بايد بكنم . البته من در جايي ديگه از برنامه با نوشتن دستور زير فيلتر حذف مي شه ولي تو اين قسمت از برنامه عمل نمي كنه :


DataEnviernment1.rsRegister.Filter=""

mpmsoft
دوشنبه 04 شهریور 1387, 21:24 عصر
دوستان یک توضیح کوچک از تجربیاتی که کسب کردم بدم

اونم اینه که زمانی که شما از Rs.Filter استفاده می کنید در واقع از Dataset که بر روی حافظه می باشد فیلتر را انجام می دهد

مثال : فرض بفرمایید جدولی داری که تعداد رکوردهای آن 5000 رکورد می باشد و حالا بنا به کدی که دوستمون می گه که با Rs.Filter کار کنیم باید ابتدا برای صحت Result Set ابتدا کل رکوردهارو بیاریم تو حافظه و بعد از حافظه فیلتر بکنیم

تجربه نشان داده که این عمل اشتباه است زیرا اولا شما با کل 5000 رکورد کار ندارید - پهنای باند شبکه رو اشغال می کنید.

شما بهتره که از همون Select FName WHERE استفاده کنید و بعد از اتمام کار حتما Recordset مربوطه رو ببندید.

در زمان Select فقط فیلدهایی رو انتخاب بکنید که به آن نیاز دارید
برای استفاده از توابع بیشتر سعی کنید از توابع خود SQL استفاده کنید

برای مثال من خیلی دیدم برای بدست آوردن تعداد رکوردها خیلی از دوستان ابتدا SELECT * FROM می زنن و بعد Rs.RecordCount رو می گیرن. راه درست Select Count(ID) FROM می باشد

rezankh
سه شنبه 05 شهریور 1387, 01:14 صبح
من از جستجو با چند پارامتر زياد استفاده مي كنم :

مثال ( Row - Sal , ... نام فيلدها هستند)
Private Sub Filter()

Dim Strfilter As String

Strfilter = ""


If Combo1.Text <> "" Then
If Strfilter = "" Then
Strfilter = " Row = " & Combo1.Text & ""
Else
Strfilter = Strfilter + " And Row = " & Combo1.Text & ""
End If
End If


If Combo2.Text <> "" Then
If Strfilter = "" Then
Strfilter = " Sal = " & Combo2.Text & ""
Else
Strfilter = Strfilter + " And Sal = " & Combo2.Text & ""
End If
End If

If Combo3.Text <> "" Then
If Strfilter = "" Then
Strfilter = " Month = '" & Combo3.Text & "'"
Else
Strfilter = Strfilter + " And Month = '" & Combo3.Text & "'"
End If
End If

If Combo4.Text <> "" Then
If Strfilter = "" Then
Strfilter = " Tarikh = '" & Combo4.Text & "'"
Else
Strfilter = Strfilter + " And Tarikh = '" & Combo4.Text & "'"
End If
End If

If Combo5.Text <> "" Then
If Strfilter = "" Then
Strfilter = " Name = '" & Combo5.Text & "'"
Else
Strfilter = Strfilter + " And Name = '" & Combo5.Text & "'"
End If
End If


If Strfilter <> "" Then
Adodc1.RecordSource = "select * from Buy1 where " + Strfilter
Adodc1.Refresh
Adodc1.Recordset.Sort = "Tarikh"
Else
Adodc1.RecordSource = "select * from Buy1"
Adodc1.Refresh
Adodc1.Recordset.Sort = "Tarikh"
Combo11 = ""
Combo13 = ""
End If


If Strfilter <> "" Then
j = 0
Combo11 = 0
Combo13 = 0

Do While Not Adodc1.Recordset.EOF
j = j + 1
jma = Val(Adodc1.Recordset("Mablagh"))


Combo11 = j
Combo13 = Round((jma + Val(Combo13)), 2)
Adodc1.Recordset.MoveNext
Loop
End If
End Sub


ابتدا اين روال رو تعريف كنيد و سپس اجراش كنيد انوقت همزمان مي‌تونيد با چندين پارامتر ركوردها را فيلتر نماييد راستي DataGrid يادتون نره.

mahmood3d
سه شنبه 05 شهریور 1387, 15:11 عصر
دوست عزيز اين نمونه برنامه اي كه نوشتي مربوط به يكي از برنامه هاي خودتان مي باشد و من اينجا نمي دونم دقيقاً منظورتون از مثلاً Combo1 يا Combo13 و يا ... چيه اگه مي شه نمونه برنامه آپلود كنيد .

rezankh
چهارشنبه 06 شهریور 1387, 00:38 صبح
اينهم يك نمونه سورس البته خيلي سريع درستش كردم اميدوارم مشكلي نداشته باشه.

ali_habibi1384
چهارشنبه 06 شهریور 1387, 08:17 صبح
روشی رو که maryamb ارائه دادند کاملا عملی و اصولی هستش. قطعا شما در یه جایی از کار اشتباه کردید. برای نمایش مجدد رکوردها از adodc1.refresh استفاده کنید.
نهایتا برای حل مشکل فایل پروژه و دیتا بیستونو آپلود کنید تا به مشکلش رسیدگی کنیم.

mahmood3d
پنج شنبه 07 شهریور 1387, 15:17 عصر
فيلتر رو اعمال كردم حالا بخوام فيلتر رو حذف كنم چطوري بايد اين كار رو انجام بدم ؟

maryamb
پنج شنبه 07 شهریور 1387, 16:29 عصر
یکی از راه هاش اینه:
adodc1.refresh

mahmood3d
پنج شنبه 07 شهریور 1387, 17:00 عصر
من از Data Environment استفاده مي كنم و اين ابزار خصوصيت Refresh نداره . حالا بايد چكار كنم ؟

mahmood3d
سه شنبه 02 مهر 1387, 11:19 صبح
از دوستان ديگه كسي حذف كردن فيلتر توي Data Environment رو مي دونه ؟

HjSoft
چهارشنبه 03 مهر 1387, 07:04 صبح
شاید این بشه rs.filter = adfilterNone البته شاید <<< ولی برای Ado جواب میده

mahmood3d
شنبه 06 مهر 1387, 08:23 صبح
ممنون دوست عزيز
توي Data Environment هم جواب داد ولي باز يك مشكلي هست . من براي گزارش گيري مي خوام كه اين فيلتر رو از بين ببرم كه وقتي براي اولين بار بعد از اجرا شدن برنامه گزارش رو باز مي كنم فيلتر اعمال شده از بين رفته ولي وقتي صفحه گزارش رو مي بندم و دوباره باز مي كنم همون فيلتر قبلي دوباره اعمال ميشه و با دستوري كه نوشتين هم از بين نميره .

mahmood3d
یک شنبه 10 آذر 1387, 12:25 عصر
دوست عزیز دستور rs.filter = adfilterNone بعضی مواقع جواب می ده و بعضی مواقع نه اگه راه دیگه ای بلدید بگید تا از اون استفاده کنم .

ali_habibi1384
یک شنبه 10 آذر 1387, 15:17 عصر
آقای Mahmood3d مشکل از شماست. شما هنوز با مفاهیم کلی برنامه نویسی آشنا نیستی وگرنه تمام راه حلهای ارائه شده مفید و عملی هستند. شما فایل پروژه رو آپلود کن و دقیقا بگو کجاش مشکل داری.

mahmood3d
یک شنبه 10 آذر 1387, 16:05 عصر
تعداد فایل های پروژه ام به غیر از فایل های Temp نزدیک به 500 تا فایل که حدود 200 مگا بایته و معمولا فروم ها اجازه آپلود بیش از 10 مگا بایت رو نمی دن .