ورود

View Full Version : محدود كردن جست و جو



shahmahi
چهارشنبه 04 فروردین 1389, 19:57 عصر
سلام به دوستان گلم
من داخل برنامم از دستور زير كه داخل رويداد Text_Change نوشته ميشه براي جست و جوي لغات استفاده ميكنم .

Private Sub Text1_Change()
Dim SQL As String
If Text1.Text <> "" Then
SQL = "select * from WordDictionary where EnWord LIKE '" + Text1.Text + "%'"
Else
SQL = "select* from WordDictionary"
End If
Execute (SQL)
dataSerch
Exit Sub
End Sub
و يك TabControl هم دارم كه لغات رو بر اساس حروف مشخص ميكنه طبق شكل زير:

http://barnamenevis.org/forum/attachment.php?attachmentid=45952&stc=1&d=1269445340

حالا ميخام با انتخاب هر كدام از Tabها جست و جو بين اون كلمات محدود بشه يعني وقتي كاربر تب دومي رو انتخاب كرد وقتي داخل تكس كلمه اي رو نوشتيم اگه بين اون بازه حروف بود بياد و نمايش بده كه واسه نمايش لغات هم از VsFlexGrid استفاده كردم.
ممنون ميشم راهنماييم كنيد.

HjSoft
چهارشنبه 04 فروردین 1389, 22:13 عصر
یک نکته : وقتی از جستجو استفاده میشه ، دیگه دلیلی نداره که طبقه بندی بر اساس تب ها بکنید . در هر صورت با استفاده از کد های ascii فکر کنم بشه ، یک محدوده رو مشخص کرد . یعنی تو رویداد Keypress اون تکست باکس سرچت بزاری یا توی رویداد Click اون دکمه که حرف اول رو برگدونه به ascii و بعد هم بیای محدوده مثلا a تا d رو بگیری ببینی بینش هست یا نه !

shahmahi
پنج شنبه 05 فروردین 1389, 01:24 صبح
یک نکته : وقتی از جستجو استفاده میشه ، دیگه دلیلی نداره که طبقه بندی بر اساس تب ها بکنید .
فكر كنم وقتي حجم بانكم زياد بشه اين طبقه بندي سرعت جست و جو رو بيشتر بكنه البته اين نظر منه.

یک محدوده رو مشخص کرد . یعنی تو رویداد Keypress اون تکست باکس سرچت بزاری یا توی رویداد Click اون دکمه که حرف اول رو برگدونه به ascii و بعد هم بیای محدوده مثلا a تا d رو بگیری ببینی بینش هست یا نه !
خوب طبق روالي كه من براي سرچ دارم اين روش شما فكر كنم نشه راستش خوب متوجه نشدم ، من از كد زير براي نمونه استفاده كردم ولي نشد :

Private Sub Text1_Change()
Dim SQL As String
Select Case Me.Tab.SelectedItem
Case 0
If Text1.Text <> "" Then
SQL = "select * from WordDictionary where EnWord LIKE '" + Text1.Text + "%'"
Else
SQL = "select* from WordDictionary"
End If
Execute (SQL)
dataSerch
Exit Sub
Case 1
If Text1.Text <> "" Then
SQL = "SELECT * FROM WordDictionary WHERE Left(EnWord,1)='Y' or Left(EnWord,1)='Z' LIKE '" + Text1.Text + "%'"
Else
SQL = "select* from WordDictionary"
End If
Execute (SQL)
dataSerch
Exit Sub
End Select
End Sub

HjSoft
پنج شنبه 05 فروردین 1389, 06:43 صبح
یک راه دیگه به ذهنم رسید ، شما از Filter و Sql استفاده کن . یعنی برای A - d یک کد Sql بزار در adodc و برای پیدا کردن هر جستجو Filter کن . اینجوری فیلتر میاد از داخل محتویات همون sql که بهش دادی فیلتر میکنه .

ali682344
پنج شنبه 05 فروردین 1389, 10:16 صبح
با سلام اگه ملاك كار شما براي سرعته،به نظر من تعدادtab ها رو افزايش بده يعني براي هر حرف يك tab قرار بديد .از sql و filter استفاده كنيد
همون چيزي كه دوستمون گفت

من يه نمونه از كار فيلتر رو برات مي زارم
If s = "" Then
Adodc1.Recordset.Filter = ""
Adodc1.Refresh
Exit Sub
Adodc1.Recordset.Filter = "you filed" & " LIKE '*" & text1.text & "*'"

shahmahi
پنج شنبه 05 فروردین 1389, 15:32 عصر
ممنون از راهنماييتون دوستان مشكلم حل شد فقط اينكه من بايد بر اساس تبهاي انتخابي براي تمام حروف، كدها رو بنويسم كه براي تب اول ميشه كد زير :
اين باعث نميشه سرعت برنامم پايين بياد ؟

Private Sub Text1_Change()
If adoSerche.State = 1 Then adoSerche.Close
Select Case Me.Tab.SelectedItem
Case 1
If Text1.Text <> "" Then
adoSerche.Open "SELECT ID,EnWord,MeanEn,MeanFa,Inte FROM WordDictionary WHERE Left(EnWord,1)='Z'", Conn, adOpenStatic, adLockOptimistic
adoSerche.Filter = "EnWord" & " LIKE '" & Text1.Text & "%'"
Else
adoSerche.Open "SELECT ID,EnWord,MeanEn,MeanFa,Inte FROM WordDictionary WHERE Left(EnWord,1)='Z'", Conn, adOpenStatic, adLockOptimistic
adoSerche.Filter = ""
End If
dataSerch
Exit Sub
End Select
End Sub

ali682344
پنج شنبه 05 فروردین 1389, 15:47 عصر
فكر نكم مشكلي واسه سرعت داشته باشي

ايده خوبيه

به هر حال هر if يه مقدار سرعت كارو مي گيره
ولي چاره اي نيست

ali682344
پنج شنبه 05 فروردین 1389, 16:01 عصر
مي توني كد مربوط به كاراكتر ها رو در داخل دستورات tab قرار بدي
اين قسمت
Select Case Me.Tab.SelectedItem
Case 1
adoSerche.Open "SELECT ID,EnWord,MeanEn,MeanFa,Inte FROM WordDictionary WHERE Left(EnWord,1)='Z'", Conn, adOpenStatic, adLockOptimistic
end select
كد filter هم داخل همون text_change بايد سرعت عمل بيشتري به برنامه بده

چون بار اول با انتخاب تب مورد نظر ليست كلمه ها رو پيدا مي كنه و دفعه بعد نيازي به چك كردن نيست مگر با عوض كردن تب

جستجوي بعدي توسط تكس براساس همون دستور بالاي انجام ميشه،يعني تا موقعي تبي رو تغيير ندي تكست باكس خودش با اون كلمه ها چك مي كنه

HjSoft
پنج شنبه 05 فروردین 1389, 18:13 عصر
سرعت برنامه بستگی به بانک اطلاعات شما دارد . معمولا Sql و Access تا 100000 رکورد مشکلی ندارند . از اون به بعد Access افت سرعت داره ولی باز هم اونقدر نیست که کاربر معطل بشه . در کل زیاد در سرعت تاثیر نداره و فقط موقع لود یکم دیر میاد که البته در Sql اینطور نیست /