PDA

View Full Version : چگونه می تونم برای هر جدولم عمل جستجو را بر اساس چند فیلد انجام بدم



mohsen_zelzela00
یک شنبه 20 دی 1388, 23:12 عصر
با سلام

در یک پروژه که یک چیزی حدود 26 جدول داشته باشه چگونه می تونم برای هر جدولم عمل جستجو را بر اساس چند فیلد انجام بدم اگه بخوام مثلاً بر اساس دو فیلد عمل جستجو رو انجام بدم برای هر جدول باید 3 تا stordprocedureبنویسم که به نظر من کار زیاد درستی نیست اگه دوستان راحلی دارن ممنون میشم کمک کنند

با تشکر

Mostafa_Dindar
دوشنبه 21 دی 1388, 13:32 عصر
با سلام

در یک پروژه که یک چیزی حدود 26 جدول داشته باشه چگونه می تونم برای هر جدولم عمل جستجو را بر اساس چند فیلد انجام بدم اگه بخوام مثلاً بر اساس دو فیلد عمل جستجو رو انجام بدم برای هر جدول باید 3 تا stordprocedureبنویسم که به نظر من کار زیاد درستی نیست اگه دوستان راحلی دارن ممنون میشم کمک کنند

با تشکر

سلام
چرا 3 تا ؟

mohsen_zelzela00
دوشنبه 21 دی 1388, 20:46 عصر
سلام
چرا 3 تا ؟
خوب من فرض می کنم که میخوام جستجو بر اساس مثلاً شماره دانشجویی (stu_id ) و نام خانوادگی(family) باشه

در اینجا 4 حالت ممکن است رخ دهد حالت اول وقتی که کاربر فقط شماره دانشجویی وارد کند حالت دوم کاربر فقط نام خانوادگی وارد کند و حالت سوم هم شماره دانشجویی و هم نام خانوادگی را وارد کند و حالت 4 هیچکدام را وارد نکند(که برای حالت 4 احتیاج به جستجو وجود ندارد) خب من در اینجا برای حالات 1 تا سه برای هر کدام یک stordProcedure طراحی کردم ولی فکر نکنم منطقی باشه ممنون میشم راهنمایی کنید

s_ahmadneya
دوشنبه 21 دی 1388, 21:28 عصر
با سلام دوست عزیز من دقیقا" متوجه منظورت نشدم اگه اینطوری که شما می فرمایید با n فاکتوریل Sp بنویسیم
اما راه حل که من استفاده می کنم
برای این کار من اصلا" sp نمی نویسم بلکه در زمان اجرا دستور select را می سازم یک متغیر برای فیلدها که می خواهیم برگردانده شود یک متغیر برای نام جدول و یک سری شرطهای برای اینکه مشخص شود کاربر چه مورد را برای جستجو انتخاب کرده و در آخر با این متغیرهای select را می سازیم به همین راحتی !
بعبارتی با یک تابع تمامی جستجوها را پوشش می دهد همه 26 جدول با هر چه فیلد جستو.
این راه حل خیلی بهتر

mohsen_zelzela00
دوشنبه 21 دی 1388, 23:14 عصر
با سلام دوست عزیز من دقیقا" متوجه منظورت نشدم اگه اینطوری که شما می فرمایید با n فاکتوریل Sp بنویسیم
اما راه حل که من استفاده می کنم
برای این کار من اصلا" sp نمی نویسم بلکه در زمان اجرا دستور select را می سازم یک متغیر برای فیلدها که می خواهیم برگردانده شود یک متغیر برای نام جدول و یک سری شرطهای برای اینکه مشخص شود کاربر چه مورد را برای جستجو انتخاب کرده و در آخر با این متغیرهای select را می سازیم به همین راحتی !
بعبارتی با یک تابع تمامی جستجوها را پوشش می دهد همه 26 جدول با هر چه فیلد جستو.
این راه حل خیلی بهتر

دوست عزیز می تونید یه مثال بزنید؟؟؟

ولی به فکر کنم استفاده از stordProcedure برای جستجو بهتر باشه هر چند در بار اول سرعت اون کم تر از روش معمولی است ولی در دفعات بعدی سرعت آن بیشتر از روش معمولی است

Mostafa_Dindar
سه شنبه 22 دی 1388, 00:39 صبح
خوب من فرض می کنم که میخوام جستجو بر اساس مثلاً شماره دانشجویی (stu_id ) و نام خانوادگی(family) باشه

در اینجا 4 حالت ممکن است رخ دهد حالت اول وقتی که کاربر فقط شماره دانشجویی وارد کند حالت دوم کاربر فقط نام خانوادگی وارد کند و حالت سوم هم شماره دانشجویی و هم نام خانوادگی را وارد کند و حالت 4 هیچکدام را وارد نکند(که برای حالت 4 احتیاج به جستجو وجود ندارد) خب من در اینجا برای حالات 1 تا سه برای هر کدام یک stordProcedure طراحی کردم ولی فکر نکنم منطقی باشه ممنون میشم راهنمایی کنید
یک Stored Procedure بنویسید که به تعداد دلخواه پارامتر بگیرد . و درون اون Stored Procedure شرطها رو اعمال کنید که اگر مقدار داشت Action1 و اگر مقدار نداشت مثلا Action2 و .....(میتونید با CASE یا IF .. THEN پیاده سازی کنید ).

مثلا :

IF ((@param1 IS NOT NULL)AND (@param2 IS NOT NULL)
BEGIN
--DO SOME THING
END
حالا در دات نت چندین Overload از یک متد که پارامتر ها رو به Stored Procedure پاس میده ایجاد کنید و استفاده کنید .

s_ahmadneya
سه شنبه 22 دی 1388, 17:25 عصر
یک Stored Procedure بنویسید که به تعداد دلخواه پارامتر بگیرد . و درون اون Stored Procedure شرطها رو اعمال کنید که اگر مقدار داشت Action1 و اگر مقدار نداشت مثلا Action2 و .....(میتونید با CASE یا IF .. THEN پیاده سازی کنید ).

مثلا :

IF ((@param1 IS NOT NULL)AND (@param2 IS NOT NULL)
BEGIN
--DO SOME THING
ENDحالا در دات نت چندین Overload از یک متد که پارامتر ها رو به Stored Procedure پاس میده ایجاد کنید و استفاده کنید .

در این حالت sp هم تقریبا" مثل راه حل که پیشنهاد دادم می باشد در اینجا هم باید ابتدا پارامترها فیلدهای نمایش و موارد جستجو را تولید وبعد به sp منتقل نمایی و یا اطلاعات خام را بفرستی و در sp کار تولید را انجام بدهی که بنظرم در هر حالت همان می شود . من خودم در کد برنامه می نویسم برای اینکه اگه بانکم sql ویا oracle باشه به راحتی در همان کد تغییر بدهم. واز طرفی سرعت هم فرقی ندارد اگه کسی دلیلی داره بگه تا ما هم بدونیم.
اما مثال متاسفانه کد سی شارپ در دسترس ندارم فعلا" وی بی می زارم بعدها کد سی شارپ کامل را قرار می دهم موفق باشید


Private Sub TolidWhereCaption()
Str1Where = ""
Str1Caption = ""

If Trim(Txtfields(0)) <> "" Then
Str1Where = Str1Where & " and sh.code_sherkat like '%" & Txtfields(0) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(0) & " آن(ها) شامل " & Txtfields(0)
End If
If Trim(Txtfields(1)) <> "" Then
Str1Where = Str1Where & " and sh.Name_sherkat like '%" & Txtfields(1) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(1) & " آن(ها) شامل " & Txtfields(1)
End If
If Trim(Txtfields(2)) <> "" Then
Str1Where = Str1Where & " and sh.Modir_sherkat like '%" & Txtfields(2) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(2) & " آن(ها) شامل " & Txtfields(2)
End If
'''ایرانی وخارجی

If OptionCode(0).Value = True Then
Str1Where = Str1Where & " and sh.irani= 1"
Str1Caption = Str1Caption & " ودارای ملیت " & LblFields(3)
End If
If OptionCode(1).Value = True Then
Str1Where = Str1Where & " and sh.irani= 0"
Str1Caption = Str1Caption & " ودارای ملیت " & LblFields(4)
End If
'''
If Trim(Txtfields(5)) <> "" Then
Str1Where = Str1Where & " and sh.telphon like '%" & Txtfields(5) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(5) & " آن(ها) شامل " & Txtfields(5)
End If
If Trim(Txtfields(6)) <> "" Then
Str1Where = Str1Where & " and sh.fax like '%" & Txtfields(6) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(6) & " آن(ها) شامل " & Txtfields(6)
End If
If Trim(Txtfields(7)) <> "" Then
Str1Where = Str1Where & " and sh.Adress like '%" & Txtfields(7) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(7) & " آن(ها) شامل " & Txtfields(7)
End If
If Trim(Txtfields(8)) <> "" Then
Str1Where = Str1Where & " and sh.site like '%" & Txtfields(8) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(8) & " آن(ها) شامل " & Txtfields(8)
End If
If Trim(Txtfields(9)) <> "" Then
Str1Where = Str1Where & " and sh.email like '%" & Txtfields(9) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(9) & " آن(ها) شامل " & Txtfields(9)
End If
'''''''''''''''''''''''''''''''''کاربر ذخیره کننده شرکت
If cobotext(0).Tag <> "" Then
Str1Where = Str1Where & "and sh.shomareh_personeli_user =" & cobotext(0).Tag
Str1Caption = Str1Caption & " و" & LblFields(10) & " شرکت " & cobotext(0).Text
End If
'''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''تاریخ ثبت اطلاعات شرکت'''''''''''''''''
If Txtfields(11).Text <> "" And Txtfields(12).Text = "" Then
Str1Where = Str1Where _
& " AND dbo.SP_DATEF_L( sh.tarikh_sabt) >='" & Trim(Txtfields(11).Text) & "'"
Str1Caption = Str1Caption & " وتاریخ ثبت اطلاعات شرکت آن(ها)بعداز " & ConvertDate(Txtfields(11))
End If

If Txtfields(11).Text = "" And Txtfields(12).Text <> "" Then
Str1Where = Str1Where _
& " AND dbo.SP_DATEF_L( sh.tarikh_sabt) <='" & Trim(Txtfields(12).Text) & "'"
Str1Caption = Str1Caption & " وتاریخ ثبت اطلاعات شرکت آن(ها)قبل از " & ConvertDate(Txtfields(12))
End If

If Txtfields(11).Text <> "" And Txtfields(12).Text <> "" Then
Str1Where = Str1Where & " AND dbo.SP_DATEF_L( sh.tarikh_sabt) " _
& " BETWEEN '" & Trim(Txtfields(11).Text) & "'" _
& " AND '" & Trim(Txtfields(12).Text) & "'"
Str1Caption = Str1Caption & " وتاریخ ثبت اطلاعات شرکت آن(ها)از تاریخ " _
& ConvertDate(Trim(Txtfields(11).Text)) & _
" تا " & ConvertDate(Trim(Txtfields(12).Text))

End If
'''''''''''''''''''''''''''''ساعت ثبت'''''''''''''''''''''''''''''''''
'''''''''''''''''''''''ساعت بایگانی شرکت
If Txtfields(13).Text <> "" Or Txtfields(14).Text <> "" Then
If StandardSaat(Txtfields(13).Text) = False Then Txtfields(13).Text = ""
If StandardSaat(Txtfields(14).Text) = False Then Txtfields(14).Text = ""
End If
If Txtfields(13).Text <> "" And Txtfields(14).Text = "" Then
Str1Where = Str1Where _
& " AND sh.saat_sabt >= CONVERT(DATETIME, '1899-12-30 " & Trim(Txtfields(13).Text) & " ', 102) "
Str1Caption = Str1Caption & " و ساعت بایگانی آن(ها) بعد از " & Txtfields(13)
End If
If Txtfields(13).Text = "" And Txtfields(14).Text <> "" Then
Str1Where = Str1Where _
& " AND sh.saat_sabt <= CONVERT(DATETIME, '1899-12-30 " & Trim(Txtfields(14).Text) & " ', 102) "
Str1Caption = Str1Caption & " و ساعت بایگانی آن(ها) قبل از " & Txtfields(14)
End If

If Txtfields(13).Text <> "" And Txtfields(14).Text <> "" Then
Str1Where = Str1Where & " AND sh.saat_sabt " _
& " BETWEEN CONVERT(DATETIME, '1899-12-30 " & Trim(Txtfields(13).Text) & " ', 102)" _
& " AND CONVERT(DATETIME, '1899-12-30 " & Trim(Txtfields(14).Text) & " ', 102)"
Str1Caption = Str1Caption & " و ساعت بایگانی آن(ها) از تاریخ " _
& Trim(Txtfields(13).Text) & _
" تا " & Trim(Txtfields(14).Text)

End If
' '''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''
If Trim(Txtfields(15)) <> "" Then
Str1Where = Str1Where & " and sh.manbah_etlaat like '%" & Txtfields(15) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(15) & " آن(ها) شامل " & Txtfields(15)
End If
If Trim(Txtfields(16)) <> "" Then
Str1Where = Str1Where & " and sh.molahezat1 like '%" & Txtfields(16) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(16) & " آن(ها) شامل " & Txtfields(16)
End If
If Trim(Txtfields(17)) <> "" Then
Str1Where = Str1Where & " and sh.molahezat2 like '%" & Txtfields(17) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(17) & " آن(ها) شامل " & Txtfields(17)
End If
If Trim(Txtfields(18)) <> "" Then
Str1Where = Str1Where & " and sh.molahezat3 like '%" & Txtfields(18) & "%' "
Str1Caption = Str1Caption & "و " & LblFields(18) & " آن(ها) شامل " & Txtfields(18)
End If
If Trim(Txtfields(19)) <> "" Then
Str1Where = Str1Where & " and dbo.SP_AutoZirTosifi_to_code_radehbandi(k.Code_Rad ehBandi) like '" & Txtfields(19) & "%'"

Str1Caption = Str1Caption & " وکدرده بندی کاتالوگ آنها شروع با " & Txtfields(19)
End If
If Trim(Txtfields(20)) <> "" Then
Str1Where = Str1Where & " and ( k.Gens_tablighi like '%" & Txtfields(20) & "%' " _
& " OR dbo.SP_AutoZirTosifi_to_des_radehbandi(k.Code_Rade hBandi) like '%" & Txtfields(20) & "%' )"
Str1Caption = Str1Caption & " واجناس تبلیغی یا توضیح رده بندی آنها شامل " & Txtfields(20)
End If

''''''''''''اتمام سنجش فیلترهای جستجو
If Str1Caption <> "" Then

Str1Caption = Mid(Str1Caption, 3, Len(Str1Caption) - 2)
Str1Caption = "تمامی شرکت های که " & Str1Caption & " می باشند"
Else
Str1Caption = "تمامی شرکت های موجود در بانک اطلاعاتی شرکت به شرح زیر است"
End If
LblCaption = Str1Caption
End Sub
'کد اعتباری را چک می نماید
Private Sub chechCodeRadehbandi()
Dim object As Object
' Dim object As TK_F034.Cls_034
Set object = CreateObject("tk_f034.CLS_034")
DoEvents
If Trim(Txtfields(19).Text) = "" Then Exit Sub
object.codeEntekhabi = Txtfields(19).Text
object.AutoUser = IntAutoUser
object.Connection = con
object.InputValue = "False"
' object.ShowInterfacEntekhabCode
If object.ChekCodeEntekhabiSearch Then
Txtfields(19) = object.codeEntekhabi
Txtfields(21) = object.DesEntekhabi
' Txtfields(0).Tag = object.AutoZirTosifi
Else
Txtfields(21) = "کد رده بندی نامعتبر است"
End If

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''' '
'''''''''''''تاریخچه جستجو

'تاریخچه جستجو یوزر را لود می کند
Private Sub loadSearchHistoryUser(codeUser As Long)
cobotext(1).FontSize = 8
Set RsSearshHistory = New ADODB.Recordset

'''''''''''''''''
Dim desTemp As String
Dim codeTemp As String
RsSearshHistory.CursorLocation = adUseClient
RsSearshHistory.Open "SELECT auto, codeUser, desSearch, codeSearch" _
& " FROM Tbl_history where codeUser=" & IntAutoUser & "ORDER BY auto DESC", con, adOpenKeyset, adLockPessimistic

desTemp = cobotext(1).Text
codeTemp = cobotext(1).Tag
If RsSearshHistory.EOF Then
cobotext(1).Text = ""
cobotext(1).Tag = ""
cobotext(1).FieldName = "desSearch"
' cobotext(1).Recordset = Nothing
Else
cobotext(1).FieldName = "desSearch"
cobotext(1).Recordset = RsSearshHistory
cobotext(1).Text = desTemp
cobotext(1).Tag = codeTemp


End If
'''''''''''''''''

End Sub

mohsen_zelzela00
سه شنبه 22 دی 1388, 18:15 عصر
دوست عزیز لطف می کنید در مورد کدی که گذاشتید توضیح بدید

mohsen_zelzela00
دوشنبه 19 بهمن 1388, 11:17 صبح
یک Stored Procedure بنویسید که به تعداد دلخواه پارامتر بگیرد . و درون اون Stored Procedure شرطها رو اعمال کنید که اگر مقدار داشت Action1 و اگر مقدار نداشت مثلا Action2 و .....(میتونید با CASE یا IF .. THEN پیاده سازی کنید ).

مثلا :

IF ((@param1 IS NOT NULL)AND (@param2 IS NOT NULL)
BEGIN
--DO SOME THING
ENDحالا در دات نت چندین Overload از یک متد که پارامتر ها رو به Stored Procedure پاس میده ایجاد کنید و استفاده کنید .


دوست عزیز من یک StordProcedure به صورت زیر نوشتم



ALTER proc [dbo].[SELECT_CLEARANCE_TYPES]
@CLEARANCE_NAME varchar(50),
@CLEARANCE_ABBR varchar(50)
as



if (@CLEARANCE_NAME is not null) and (@CLEARANCE_ABBR Is NOt Null)
begin
select * from CLEARANCE_TYPES where CLEARANCE_ABBR=@CLEARANCE_ABBR and CLEARANCE_NAME=@CLEARANCE_NAME
end
else
begin
if (@CLEARANCE_NAME is Not Null) and (@CLEARANCE_ABBR ='')
begin
select * from CLEARANCE_TYPES where CLEARANCE_NAME=@CLEARANCE_NAME
end
else
if (@CLEARANCE_NAME= '') and (@CLEARANCE_ABBR Is Not Null)
begin
select * from CLEARANCE_TYPES where CLEARANCE_ABBR=@CLEARANCE_ABBR
end

end



و در Visual Studio یک متد به صورت زیر نوشتم(البته به زبان Vb.Net نوشتم ولی شما برای راهنمایی فرق نمی کند به چه زبانی بنویسد)




Public Function Search_Clearance_Types(ByVal Name As String, ByVal ABBR As String) As DataTable

Dim cn As New SqlConnection("Data Source=.;Initial Catalog=CLEARANCE;Integrated Security=True")
Dim da As SqlDataAdapter = Nothing
Dim ds As DataSet
Dim dt As DataTable = Nothing
Dim cmd As New SqlCommand("SELECT_CLEARANCE_TYPES", cn)
cmd.CommandType = CommandType.StoredProcedure
Dim param As SqlParameter
param = cmd.Parameters.Add("@CLEARANCE_NAME", SqlDbType.VarChar, 50)
param.Value = Name

param = cmd.Parameters.Add("@CLEARANCE_ABBR", SqlDbType.VarChar, 50)
param.Value = DBNull.Value


Try
da = New SqlDataAdapter(cmd)
ds = New DataSet
dt = New DataTable
da.Fill(ds, "SELECT_CLEARANCE_TYPES")
dt = ds.Tables(0)
Catch ex As Exception

End Try
Return dt

End Function



و در فرم خودم کد زیر رو نوشتم



Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Dim Search As New clsClearanceType
Dim dt As New DataTable

If txtClearanceName.Text <> String.Empty And txtClearanceAbbr.Text <> String.Empty Then


dt = Search.Search_Clearance_Types(txtClearanceName.Tex t, txtClearanceAbbr.Text)
Else
If (txtClearanceName.Text <> String.Empty) And txtClearanceAbbr.Text = String.Empty Then
dt = Search.Search_Clearance_Types(txtClearanceName.Tex t, String.Empty)

End If



End If


GridView1.DataSource = dt
GridView1.DataBind()


End Sub




به جای String.Empty چه چیزی بنویسم که برای SqlServer مقدار Null فرستاده شود ممنون میشم دوستان راهنمایی کنند

Mostafa_Dindar
دوشنبه 19 بهمن 1388, 15:27 عصر
به جای String.Empty چه چیزی بنویسم که برای SqlServer مقدار Null فرستاده شود ممنون میشم دوستان راهنمایی کنند

سلام

در Stored Procedure به پارامترهاي تعريف شده در ابتداي sp مقدار پيش فرض Null بديد در اين صورت هنگامي كه بدون پارامتر مورد نظر sp را فراخواني كنيد اون پارامتر مورد نظر اتومات مقدار Null دارد .

موفق باشيد

faridsmart
یک شنبه 17 شهریور 1392, 15:12 عصر
دوست عزیز روشی که شما اموزش دادین برای یک جدول خاص با تعداد فیلد مشخص هست و قابلیت انعطاف برای استفاده در تمام برنامه را ندارد- پس برای هر جدول باید یک sp نوشت و به تعداد حالات مختلف باید sp تعریف کرد... بنابراین این روش روش منطقی و کارآمد نیست
البته به نظر من می توان کلید جستجو رو از یه تکست باکس خوند و اون رو به ازای تمام فیلد ها تست کرد:
OleDbCommand Command = new OleDbCommand();
DataTable DT = new DataTable();
Command.Connection = ConnectionManager.InitConnection();
Command.Connection.Open();

string cmd = "Select * From Member Where";
cmd += " name like '%" + txtFind.Text + "%'";
cmd += " OR family like '%" + txtFamily.Text + "%'";
cmd += " OR ID =" + txtID.Text ;

Command.CommandText =cmd;

OleDbDataAdapter ODDA = new OleDbDataAdapter(Command);
ODDA.Fill(DT);
dataGridMMS.DataSource = DT;
Command.Connection.Close();