PDA

View Full Version : فلیتر یا جستجوی پیشرفته در Sql Server



mostafa_tak2000
دوشنبه 05 مهر 1395, 02:01 صبح
سلام به همه دوستان
من در سایتم یه گرید ویود دارم که لیست افراد را از بانک میاره و نمایش میده همه را حالا میخوام که کاربر با استفاده از فیلترهای زیر هر فیلتری را که انتخاب کرد در جستجو اعمال بشه . مثلا اگه کد ملی یکی را زد و مدرک تحصیلی را هم انتخاب کرد جستجو برای هر دو مورد انجام بشه . یا مثلا اگه یه فیلتر را انتخاب کرد و یا چند فیلتر را در جستجو اعمال کنه من هر کاری میکنم همه فیلترهارا مقدارشا میخواد درصورتیکه میخوام هر موردی را که کاربر انتخاب کرده فقط اعمال بشه
تصویر فرم فیلتر را مشاهده کنید .
با سپاس از همگی
142780

farzane_t
دوشنبه 05 مهر 1395, 08:53 صبح
سلام

این لینک رو مطالعه کنید:

http://barnamenevis.org/showthread.php?340305-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%D8%B3%D8%AA%D9%88%D8%B1%D9%BE%D8%B1%D9%88%D 8%B3%DB%8C%D8%AC%D8%B1-stored-procedure

پیام حیاتی
دوشنبه 05 مهر 1395, 08:58 صبح
سلام
اینکه همه فیلدها رو نیاز داره ، اعتبار سنجی هست که خودتون در سمت کلاینت یا سرور قرار دادید که باید غیرفعالش کنید!
برای جستجو هم فیلدها رو در یک آرایه بزارید و جستجو رو بر اساس مقادیر موجود اعمال کنید.

mostafa_tak2000
دوشنبه 05 مهر 1395, 14:33 عصر
سلام . دوست عزیز همه فیلدها لازم نیست . اگه کاربر فیلدی را پر کرد یا چیزی انتخاب کرد اون پارامتر تور شرط بیاد
مثلا تابع زیر را ببینید
Public Function Filter_Office_Personel(ByVal CodUser As String, ByVal sex As Boolean) As DataTable Dim dt As New DataTable
Dim sql As String
Dim dm As New DataManager
sql = "SELECT OfficePersonel.CodUser, OfficePersonel.Name, OfficePersonel.Family, OrganPost.OrganPostType FROM OfficePersonel INNER JOIN OrganPost ON OfficePersonel.OrganPost = OrganPost.OrganPostCode where OfficePersonel.CodUser= '" & CodUser & "' and sex='" & sex & "' )"
dt = dm.GetData1(sql)
Return dt
End Function
خوب می بینید که دو تا شرط دارم یکی کدکابر هست و دیگری جنسیت کاربر . خوب حالا منظورم این هست که اگر کاربر در فیلد کدملی عددی داشت تو شرط اعمال بشه و اگر نه کد ملی نداشت و کاربر فقط جنسیت زن را انتخاب کرد همه زنها تو لیست بیان ولی اگر کاربر هم کد ملی طرف و هم جنسیت طرف را وارد کرد هر دو شرط اعمال بشه ؟ نمیدونم تونستم منظورمو کامل بگم
با سپاس

mostafa_tak2000
دوشنبه 05 مهر 1395, 14:34 عصر
Public Function Filter_Office_Personel(ByVal CodUser As String, ByVal sex As Boolean) As DataTable
Dim dt As New DataTable
Dim sql As String
Dim dm As New DataManager
sql = "SELECT OfficePersonel.CodUser, OfficePersonel.Name, OfficePersonel.Family, OrganPost.OrganPostType FROM OfficePersonel INNER JOIN OrganPost ON OfficePersonel.OrganPost = OrganPost.OrganPostCode where OfficePersonel.CodUser= '" & CodUser & "' and sex='" & sex & "' )"
dt = dm.GetData1(sql)
Return dt
End Function

mostafa_tak2000
دوشنبه 05 مهر 1395, 14:37 عصر
باسلام
آقای حیاتی منظورتون را از تو آرایه گذاشتن متوجه نمیشم . میشه یه مثالی بزنید تا کامل متوجه بشم . با سپاس

mostafa_tak2000
دوشنبه 05 مهر 1395, 15:58 عصر
سلام . دوستان مشکل فیلتر و نحوه جستجو را حل کردم حالا به یه مشکل دیگه برخورد کردم اونم در کلمات فارسی هست . ببینید در فرم جستجو که بالا تصویرشا براتون فرستادم وقتی کد ملی و جنسیت طرف را وارد میکنم و دکمه جستجو را میزنم Quary مورد نظر ساخته میشه و جستجو کامل کار میکنه
OfficePersonel.CodUser=5029491458 and OfficePersonel.sex=0 and 1=1
اما وقتی در فیلد نام نام فارسی می نویسم Qury به هم میریزه و sql نمیتونه کار جستجو را انجام بده و برنامه دیگه به خطوط پایین تر نمیاد در واقع سیستم گیر میکنه . کوئری را به شکل زیر تبدیل میکنه ؟
officePersonel.CodUser=5029491458 and OfficePersonel.name Likeمحمد and OfficePersonel.sex=0 and 1=1

fficePersonel.CodUser=5029491458 and OfficePersonel.name Likeمحمد and OfficePersonel.sex=0 and 1=1

]چیکار بکنم که کوئری بهم نریزه

mostafa_tak2000
دوشنبه 05 مهر 1395, 16:29 عصر
ببخشید فراموش کرده بودم کد را براتون بفرستم . من کوئری جستجو را از طریق کد زیر به تابع جستجو ارسال میکنم . با کلمات انگلیسی و اعداد مشکلی نیست ولی وقتی نام کاربر را فارسی مینویسم کلمه فارسی کوئری را بهم میزنه تو پاراگراف بالا میبینید .
Dim serachString As String = " " If textcod.Text <> String.Empty Then
serachString += "OfficePersonel.CodUser=" + textcod.Text + " and "
End If
If textname.Text <> String.Empty Then
serachString += "OfficePersonel.name N'" + textname.Text + "' and "
End If
If listsex.SelectedIndex <> 0 Then
serachString += "OfficePersonel.sex=" + listsex.SelectedValue + " and "
End If
serachString = serachString + " 1=1 "
GridView1.DataSource = bll.Filter_Office_Personel(serachString)
GridView1.DataBind()

mortezagt
دوشنبه 05 مهر 1395, 17:44 عصر
شما بعد از OfficePersonel.name هیج شناسه ای نزاشتی
یعنی نه like گزاشتی نه =
باید تعیین کنی اول


serachString += "OfficePersonel.name N'" + textname.Text + "' and "

باید بشه


serachString += "OfficePersonel.name=N'" + textname.Text + "' and "

malloc
دوشنبه 05 مهر 1395, 19:35 عصر
شما باید دستور select رو در c# تولید کنید ...... و همچنین بسته به اینکه الان کدوم شرط ها رو دخواست داده where رو تولید کنید و در همون سی شارپ مقدار where رو به select اضافه کنید و در نهایت متن کامل select رو به اسکیوال پاس بدید