PDA

View Full Version : امکان سرچ براساس چند فیلد؟؟



h.alizadeh
جمعه 13 مهر 1386, 10:48 صبح
سلام

من می خوام امکان سرچ برای برنامه م بزارم با مثلاً حدود 7یا 8 تا فیلد که جستجو براساس اون فیلدها باشه اما وارد کردن هیچکدوم از فیلدها الزامی نیست ...

و هر رکوردی از جدول که با این مشخصات برابر بود رو نشون بده مثلاً اگه 10 رکورد با این مشخصاتی که کاربر تعیین کرده، برابر بود هر10 تا رو نشون بده...

h.alizadeh
جمعه 13 مهر 1386, 10:49 صبح
درضمن با بانک اسکیوال کار می کنم

تشکر

hamed_bostan
جمعه 13 مهر 1386, 11:21 صبح
راحت ترین کار اینه که برای تمام فیلد هات یه تکست باکس بندزی توی صفحه و کاربر وقتی کلید جستجو رو زد یه چندتا شرط بذاری که چک کنه اگر تکست باکس مربوز به اونفیلد خالی نبود اون رو هم در شرط جستجو ات شرکت بده
ضمنا دستور select خودت رو هم باید بر اساس پارامترهای جستجو تولید کنی تو برنامه که کار سختی نیست و خیلی ساده هست. خروجی ات هم که همیشه ثابته .
اگر مشکلی بود بگو یه نمونه ساده واسه ات بذارم
موفق باشی

h.alizadeh
جمعه 13 مهر 1386, 14:04 عصر
خیلی ممنون ،
اما چطوری می تونم با گذاشتن شرط تکست باکس خالی رو در عمل جستجو شرکت ندم؟؟

میشه راهنمایی کنید.

مثلاً عمل جستجو در یک سیستم دبیرخانه براساس مثلاً 8تا فیلد که پرکردن هیچکدوم الزامی نیست و جستجو براساس فیلدهایی که پرشده باشه

hamed_bostan
جمعه 13 مهر 1386, 15:33 عصر
dim cmd as string="select * from table1"
dim cond as string=" where "
dim flag as boolean
if txtname.text<>"" then
cond &="name="& txtname.text &","
flag=true
endif

if txtage.text<>"" then
cond &="age="& txtage.text &","
flasg=true
endif


if txtheight.text<>"" then
cond &="height="& txtgeight.text &","
flag=true
endif

if flag=true then
str&= cond
dim i as integer=cond.lenght-1
str.chars.remove(i)
endif

h.alizadeh
جمعه 13 مهر 1386, 16:58 عصر
خیلی لطف کردید، واقعاً ممنونم
اما
از این خطا گرفت:


Compiler Error Message: BC30455: Argument not specified for parameter 'index' of 'Public ReadOnly Default Property Chars(index As Integer) As Char'.

Source Error:

Line 32: str=str+ condLine 33: dim i as integer=cond.length()-1Line 34: str.chars.remove(i)Line 35: end ifLine 36:

چکار کنم؟؟

mp2009
جمعه 13 مهر 1386, 20:38 عصر
چرا اینقدر سخت میگیرید
ز wizard استفاده کن

h.alizadeh
جمعه 13 مهر 1386, 21:00 عصر
چرا اینقدر سخت میگیرید
ز wizard استفاده کن
_
چجوری؟!
من با دریم وریور کار می کنم ...
روش قبلی هم که دوستمون حامد گفتند خیلی خوب و راحته اگه فقط همون مشکل رو رفع کنیم خیلی خوب میشه

hamed_bostan
جمعه 13 مهر 1386, 22:53 عصر
if flag=true then
str &=cond
str = str.Remove(str.Length - 1, 1)
endif
موفق باشی

sama01
شنبه 14 مهر 1386, 01:36 صبح
اگر از SqlDataSource استفاده می‌کنید و اگر فیلد‌هایی که در دیتابیس دارید، خالی نیستند و حتما مقدار دارند، می‌توانید از DefaultValue برای پارامترهای SELECT زیر هم استفاده کنید.
مثلا:


<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConStr %>"
SelectCommand="SELECT top 3 * FROM [comments] WHERE (([sender] LIKE '%' + @sender + '%') AND ([subject] LIKE '%' + @subject + '%')AND([comments] LIKE '%'+@comments+'%')) ORDER BY [sendDate] DESC"
/>
<SelectParameters>
<asp:ControlParameter ControlID="Subject_Srch_TBX" Name="Subject" PropertyName="Text" Type="String" DefaultValue="[a-z ء-ۑ]" />
<asp:ControlParameter ControlID="Sender_Srch_TBX" Name="sender" PropertyName="Text" Type="String" DefaultValue="[a-z ء-ۑ]" />
<asp:ControlParameter ControlID="Comments_Srch_TBX" Name="comments" PropertyName="Text" Type="String" DefaultValue="[a-z ء-ۑ]" />
</SelectParameters>
</asp:SqlDataSource>

در این حالت، اگر مقداری در TextBoxها وارد نشوند، به دنبال تمامی مقادیر (البته به جز مقادیر خالی) می‌گردد. من استفاده کردم. جواب می‌ده.

h.alizadeh
شنبه 14 مهر 1386, 15:33 عصر
سلام،
آقا حامد من آزمایش کردم سورسی که شما دادی اگه فقط یک فیلد رو پر کنم درست کار می کنه اما اگه چندتا رو پر کنم خطا میگیره؛ دلیلشم اینه که بجای AND ویرگول گذاشتید که من اینطوری نوشتم و اصلاح کردم

cond &=" matter="&"'"& matter.text &"'"&" AND "

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

if flag=true then
str &=cond
str = str.Remove(str.Length - 1, 1)
endif
خطا میگیره که من 1 رو به 5 تغییر دادم اما باز ازم خطا میگیره

Index and count must refer to a location within the string. Parameter name: count

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Index and count must refer to a location within the string. Parameter name: count


چکار کنم؟!http://qsmile.com/qsimages/42.gif


اگر از SqlDataSource استفاده می‌کنید و اگر فیلد‌هایی که در دیتابیس دارید، خالی نیستند و حتما مقدار دارند، می‌توانید از DefaultValue برای پارامترهای SELECT زیر هم استفاده کنید.

تشکر از راهنماییتون ، اما من بعضی از فیلدهای دیتابیسم خالی هست... http://qsmile.com/qsimages/37.gif

h.alizadeh
شنبه 14 مهر 1386, 15:38 عصر
sama01، ببخشید من با SQLDataSource آشنایی ندارم میشه با یک برنامه کاربرد و طرز استفاده ش رو برام توضیح بدید؟

(ترجیحاً بدون ویژوال استادیو ؛ چون رو سیستمم نصب نیست)

تشکر

mp2009
شنبه 14 مهر 1386, 17:31 عصر
sama01، ببخشید من با SQLDataSource آشنایی ندارم میشه با یک برنامه کاربرد و طرز استفاده ش رو برام توضیح بدید؟



ببین SQLDataSource یه رابط هست بین جدول و کاربر که شامل دستورات sql مانندSELECT,INSERT,DELETE,Update
میباشد و به صورت wizard میشه با جدول ها کار کرد یعنی دیگه نیازی به کد نویسی نیست
موفق باشی

sama01
شنبه 14 مهر 1386, 21:18 عصر
من پیشنهاد می‌کنم به خاطر اینکه هم VisualStudio روی سیستم شما نصب نیست و هم اینکه برخی از فیلد‌ها احتمال خالی بودنشان می‌رود، از انجام این کار صرف نظر کنید.
البته در پروژه‌ای که من داشتم، برای فیلد‌های خالی، مقادیر پیش‌فرضی تعیین می‌کردم. مثلا اگر کسی که نظر می‌داد، عضو سایت نبود، به جای نام وی، عبارت Guest درج می‌شد.
ولی اگر نتوان مقدار پیش‌فرضی را تعیین کرد، به ناچار باید کد نویسی کنید.
البته روش بهتر هم همین کد نویسی است. شاید شروعش کمی دشوار باشد. ولی انعطاف خیلی خوبی دارد و کاملا تحت کنترل خواهد بود.

موفق باشید.

h.alizadeh
یک شنبه 15 مهر 1386, 09:16 صبح
سلام،

بله من همین کدهای آقا حامد رو نوشتم خوبه جواب میده فقط یک مشکل کوچولو داره این که می خوام اون AND آخر رو حذف کنم که نمی دونم چجوری اینکار رو بکنم.

اگه ممکنه شما هم یک نگاه به این کدهایی که گذاشتیم بندازید ، به نظرم روش خیلی خوب و راحتی هست اما فقط مشکل اینه که من نمی دونم چجوریAnd آخر رو حذف کنم...

درضمن این امکان رو حتماً باید داشته باشم...
-----

بله من قبلاً Asp تنها کار کردم و همه چی رو خودم دستی می نوشتم اینه که به دستی نوشتم همچین عادت کردم

h.alizadeh
یک شنبه 15 مهر 1386, 09:29 صبح
البته روش بهتر هم همین کد نویسی است. شاید شروعش کمی دشوار باشد. ولی انعطاف خیلی خوبی دارد و کاملا تحت کنترل خواهد بود.


بله، من به هر کی گفتم می خوام پروژه Asp.netم رو دستی بنویسم بهم میگه دیونه ویژوال بنویس دستی به درد نمی خوره و.........
شما اولین کسی هستی که از دستی نوشتن تعریف می کنی

خوشحال شدمhttp://qsmile.com/qsimages/36.gif

من ویژوال2003 اومدم نصب کنم دیدم سی دی خرابه و.... دیگه سی دی هم گیر نیاوردم + اینکه من Asp.netرو از وسطای تابستون از روی کتاب بابک احترامی شروع کردم و ویژوالی هم بلد نیستم!

mr_mtc
یک شنبه 15 مهر 1386, 13:30 عصر
راستش من این موضوع رو همین الان برای همکارم توضیح دادم
خنده گرفت وقتی اینجا هم دیدم (اپیدمی سرچ گرفتین)

به نظر من به تعداد فیلدهای مورد نظر؛ تکست باکس بذار
بعد برای هر تکسک باکس چک کن که خالی نباشه
در صورت خالی نبودن رشته جستجوی در query رو آماده کن
تو هر مرحله هم چک کن که رشته ات خالی هست یا نه اگه بود قبل از رشته جدید یک and بذار



if (txtBox1.text<>"")
if (str_where<>"")
str_where = " and [FieldName] Like '%" & txtBox1.text & "%'
else
str_where = "[FieldName] Like '%" & txtBox1.text & "%'
end if
end if

aidin300
یک شنبه 15 مهر 1386, 22:33 عصر
بهتره یک سرهم به بخش SQL Server (http://barnamenevis.org/forum/forumdisplay.php?f=21) بزنی و Dynamic Sql رو جستجو کنی مثال های زیادی هست که کمکت می کنه

sama01
دوشنبه 16 مهر 1386, 05:19 صبح
من یک مدل رو به صورت ساده در اینجا می‌گم. ببینید مشکل شما در کجاست.
یک صفحه داریم که تعدادی textBox دارد که هر یک مربوط به یک فیلد است. در این صفحه، یک دکمه جستجو هم داریم.
با فشردن این دکمه، یک queryString ساخته می‌شود که مربوط به واکشی داده‌ها از Database است.
یک تابع داریم که مقدار queryString را از مرحله‌ی بالا دریافت می‌کند و یک dataList یا DataTable می‌دهد که حاوی نتایج جستجو است. این خروجی به عنوان dataSource به کنترلی مثل GridView نسبت داده می‌شود.در کدام یک از مراحل فوق مشکل دارید؟

h.alizadeh
دوشنبه 16 مهر 1386, 20:46 عصر
سلام،
دست همتون درد نکنه درست شد....
خیلی خیلی ازتون ممنونم، از همه

دمه همتون گرم

امیدوارم همیشه موفق باشید...

می گم یک سری به اینجا هم بزنید، خوشحال میشم:
http://barnamenevis.org/forum/showthread.php?t=80966

--------
راستی یک چیزه دیگه الآن به ذهنم رسید که الزامی نیست اما اگه بزارم چیزه خوب و جالبی در مییاد:
اینکه من توی برنامه م فیلد هایی دارم که می تونه مثلاً 3یا 4 نوع مشخصی رو داشته باشه مثلاً فیلد "فوریت نامه" می تونه یکی از این مقادیر رو داشته باشه"آنی، فوری، عادی"

حالا فرض کنیم کاربر بخواد نامه های آنی و فوری رو سرچ کنه .... خب:
من برای اینکار یک checkBoxList گذاشتم اسمه چکباکس لیستم هم گذاشتم"typedo"
اینطوری:

<asp:CheckBoxList ID="chktypedo" runat="server">
<asp:ListItem Text="عادی"/>
<asp:ListItem Text="آنی"/>
<asp:ListItem Text="فوری"/></asp:CheckBoxList>

حالا این امکان در هنگام سرچ وجود داره که کاربر بتونه مثلاً هر موردی رو که می خوام انتخاب کنه مثلاً آنی و فوری هر دو رو چک دار کنه یعنی رکوردهایی که فیلد typedoآنها فوری یا آنی هست رو نمایش بده...

اینم کد من:

dim t as boolean
t=false
for each itmtypedo in chktypedo.Items
if itmtypedo.Selected then
if (str_where<>"" and t=false)
str_where &= " AND typedo Like '%" & itmtypedo.text & "%'"
else if (str_where<>"" and t=true)
str_where &= " OR typedo Like '%" & itmtypedo.text & "%'"
else
str_where = " where typedo Like '%" & itmtypedo.text & "%'"
end if
t=true
flag=true
end if
Next


خب این برنامه درست کار میکنه اما اگه کنترلهایی که بعد از این چکباکس ها چک می کنم پر شده باشند (مثلاً تکست باکس های دیگری که گذاشتم مثلاً برای موضوع نامه هم یک تکست باکس گذاشتم که نامه های مثلاً با این موضوع رو سرچ کن)باعث میشه اطلاعات خروجی اشتباه بشه چون در هنگام دستورselect از پرانتز استفاده نکردم و orو and قاطی میشه و درست تشخیص داده نمیشه اینه که اطلاعات خوب و درست چاپ نمیشه....

شما راه حلی برای اینکار دارید؟؟

(در ضمن من از روش آقای mr-mtc استفاده کردم.)

sama01
سه شنبه 17 مهر 1386, 01:43 صبح
فکر می‌کنم برای اضافه کردن مقادیر جدید در query باید خلاقیت به خرج بدهید.
مثلا من ترجیح می‌دم یک تابع تعریف کنم که یک string که همان شرط جدید است را به همراه یک آرگومان برای or یا and دریافت می‌کند و بعد از بررسی query ساخته شده، تصمیم می‌گیرد که آیا and یا or را قبل از شرط جدید اضافه بکند یا نه.
یعنی بعد از بررسی، اگر شرطی نداشتیم، نیازی به افزودن and و or نیست. ولی در غیر این صورت باید این مقادیر افزوده شوند.
اگر منظورتان را اشتباه متوجه شدم، بگید تا اصلاح کنم.

h.alizadeh
سه شنبه 17 مهر 1386, 19:43 عصر
سلام

ممنون،

منظورم رو با مثال می گم تا شفافتر باشه:
مثلاً:
من می خوام رکوردهایی که فیلد "foriyat" آنها برابر با "آنی" یا "فوری" هست و فیلد "matter" آنها برابر "تبریک" هست رو بدست بیارم،
با اون کدهایی که من نوشتم (پست20) کوئری به این شکل درمییاد:


select * from namevorodi where foriyat Like 'آنی' or foriyat Like 'فوری' and matter Like 'تبریک'

خب ، توی این کوئری از پرانتز استفاده نشده در نتیجه کوئری یه شکل دیگه اعمال میشه یعنی؛ خروجی رکوردهایی بدست مییاد که فیلد "foriyat" اون "آنی" باشه یا فیلد"foriyat" برابر با "فوری" باشه و فیلد "matter" برابر با "تبریک" باشه یعنی بصورت خودکار به این شکل خروجی در مییاد:

select * from namevorodi where foriyat Like 'آنی' or (foriyat Like 'فوری' and matter Like 'تبریک' )

در حالیکه این مدنظر منه:

select * from namevorodi where (foriyat Like 'آنی' or foriyat Like 'فوری') and matter Like 'تبریک'
یعنی من باید در برنامه پرانتز گذاری رو خودم انجام بدم ....
----
خب نمی دونم چجوری پرانتز گذاری رو خودم انجام بدم........

----------
در ضمن من در رویداد کلیک دکمه ی سرچ کدهام رو نوشتم و برای هر تکست باکس و گروه چکباکس و... شرط گذاشتم.
دقیقاً مثل روشی که mr-mtc گفتند

snisni63
شنبه 12 آبان 1386, 04:49 صبح
یکی از روش ها می تونه این باشه
دو تا قدم داره
1. در صفحه ای که اطلاعات جستجو را جمع آوری می کنی :

Dim numberOfCheckedCheckBox AsInteger = 0

ForEach item As ListItem In CheckBoxList1.Items
If item.Selected Then
Dim newname AsString
newname = "anyField" + test.ToString
Session(newname) = item.Text
numberOfCheckedCheckBox = numberOfCheckedCheckBox + 1
EndIf
Next
Session("number") = numberOfCheckedCheckBox


2. در صفحه ای که اطلاعات را نمایش می دهی:

Dim numberOfCheckedCheckBox AsInteger = Session("number")
Dim finalCondition AsString = Nothing
For i AsInteger = 0 To numberOfCheckedCheckBox - 1
Dim newname AsString
Dim newCondition AsString

newname = "anyField" + i.ToString
newCondition = "([anyFiled] LIKE %" + Session(newname) + "%)"
IfNot (i = numberOfCheckedCheckBox) Then
newCondition = newCondition + " OR "
EndIf
finalCondition = finalCondition + newCondition
Next
SqlDataSource1.SelectCommand = SqlDataSource1.SelectCommand + " AND (" + finalCondition + ")"


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

h.alizadeh
پنج شنبه 08 آذر 1386, 22:50 عصر
سلام،

مرسی

اگه میشه یه توضیح بدید