PDA

View Full Version : سوال: کد بهینه



khomar
یک شنبه 28 تیر 1388, 01:11 صبح
سلام
برنامه زیر من برای سرچ نوشتم
همان طور که می بینید شاید 10 تا if در اینجا استفاده شده که بخش کوچیکی از if هایی هست که من باید بنویسم
که کلا شاید حدود 60 تا if می شه
می خواستم بپرسم ایا می شه این کد بهینه کرد ؟
یعنی از قسمت dt و datagrid1 فاکتور گرفت که به ازای هر if تکرار نشن؟

Dim ds As New DataSet
Dim strsql As String
Dim dt As New DataTable
Dim db As New Class1
If RadioButton1.Checked = True Then
If TextBox1.Text <> "" Then
strsql = "select * from student where nstudent=" + TextBox1.Text + ""
dt = db.myselect(strsql)
' MessageBox.Show(dt.Rows.Count.ToString + " یافت شد.")
DataGrid1.DataSource = dt
' DataGrid1.DataBindings.Add(New Binding("datasource", ds, "student"))
End If

If TextBox2.Text <> "" Then
strsql = "select * from student where name='" + TextBox2.Text + "'"
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

If TextBox3.Text <> "" Then
strsql = " select * from student where family='" + TextBox3.Text + "'"
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

If ComboBox1.Text <> "" Then
strsql = "select * from student where major ='" + ComboBox1.Text + "'"
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

If TextBox4.Text <> "" Then
strsql = "select * from student where date_ozviat='" + TextBox4.Text + "'"
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

If CheckBox1.Checked = True Then
strsql = "select * from student where state=" + CheckBox1.Checked + ""
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

If CheckBox2.Checked = True Then
strsql = "select * from student where state=" + CheckBox2.Checked + ""
dt = db.myselect(strsql)
DataGrid1.DataSource = dt
End If

afrooz_rahmati63@yahoo.com
یک شنبه 28 تیر 1388, 13:31 عصر
من با VB زیاد آشنایی ندارم ولی تا اونجایی که میدونم اگر توجه کنید تمام strsql های شما فقط در یک فیلد با هم تفاوت دارند ، بنابراین چه بهتر که به جای استفاده از این if طولانی فقط از یک function به همراه دو پارامتر که فیلد موردنظر و مقدار آن است استفاده کنید.
function SetValues(string strFiledName, string Value)

ACorvinus
یک شنبه 28 تیر 1388, 13:51 عصر
اول باید بگی میخوای چی کار کنی .

بعدا دنبال جواب باشی .

اینجوری به جواب میرسی ولی نه به جوابی که میخواستی برسی .

راستی یادم رفت اینو بگم، مگه شما چند تا PrimaryKey دارین که اینجوری Select پشت Select نوشتین ؟!!!

BAHAL_KEYHAN
یک شنبه 28 تیر 1388, 19:13 عصر
میشه یه کارایی کرد
مثلا
رویproperty tag کنترل هایی که قراره برای جستجو تو بانک استفاده شن نام فیلد متناظر رو وارد کن مانند این textbox1.tag=nstudent
بعدش ای کدا رو به جای کد خودت قرار بده


strsql = "select * from student where
for each control as control in me.controls
if control.tag then
strsql &= control.tag & "='" & control.tostring.split(":")(1) + "'"
end if
next

saeedr22
یک شنبه 28 تیر 1388, 20:27 عصر
شگه اشتباه نکنم منظورتونو فهمیدم/
مثلاً شما چند تا textbox دارین و می خواهین که با توجه به پر یا خالی لودن اونها جستجو انجام بشه.

txt1---> name
txt2---->family
txt3----->tel



dim s as string="select * from customer where 1=1"
if txt1.text<>"" then
s+=" and name=txt1.text"
end if
if txt2.text<>"" then
s+=" and family=txt2.text"
end if
if txt3.text<>"" then
s+=" and tel= txt3.text"
end if
بعد تو select comman . ز s رو select می کنیم.

khomar
دوشنبه 29 تیر 1388, 00:58 صبح
اول باید بگی میخوای چی کار کنی .

بعدا دنبال جواب باشی .

اینجوری به جواب میرسی ولی نه به جوابی که میخواستی برسی .

راستی یادم رفت اینو بگم، مگه شما چند تا PrimaryKey دارین که اینجوری Select پشت Select نوشتین ؟!!!

فقط می خوای از تعداد if ها کمتر کنم و اینقدر selecte نکنم.یک primary key که بیشتر ندارم من دارم روی تمام فیلد های جدول عمل selecte انجام می دم!!!!

khomar
دوشنبه 29 تیر 1388, 01:04 صبح
شگه اشتباه نکنم منظورتونو فهمیدم/
مثلاً شما چند تا textbox دارین و می خواهین که با توجه به پر یا خالی لودن اونها جستجو انجام بشه.

txt1---> name
txt2---->family
txt3----->tel



dim s as string="select * from customer where 1=1"
if txt1.text<>"" then
s+=" and name=txt1.text"
end if
if txt2.text<>"" then
s+=" and family=txt2.text"
end if
if txt3.text<>"" then
s+=" and tel= txt3.text"
end if
بعد تو select comman . ز s رو select می کنیم.


منظورم درست فهمیدید
اما این نوشتتون متوجه نشدم باید چیکار کنم؟


/

بعد تو select comman . ز s رو select می کنیم.
[/PHP]

where این جا چیکار می کنه؟





dim s as string="select * from customer where 1=1"



در ضمن تکلیف این قسمت کدم چی می شه؟


dt = db.myselect(strsql)
DataGrid1.DataSource = dt

kablayi
دوشنبه 29 تیر 1388, 02:12 صبح
دوست عزیز دستورات مشترک رو از IF بیارین بیرون و فقط در بلوک های IF دستور select رو به تناسب تغییر بدین ...
مثلا قسمت select * from student تو همشون هست پس قبل از IF متغیرتونو با این مقدار پر کنید و درون IF ها فقط مقدار جدید رو به اون بچسپونید به طوری که در آخر یه select صحیح داشته باشین ...
مثلا یچیزی شبیه به این ... :


Dim ds AsNew DataSet
Dim strsql AsString = "select * from student where" ' طول رشته 27 حرف است
Dim dt AsNew DataTable
Dim db AsNew Class1
If RadioButton1.Checked = TrueThen
If TextBox1.Text <> ""Then
strsql += " (nstudent=" + TextBox1.Text + ")"
EndIf
If TextBox2.Text <> ""Then
If strsql.Length > 27 Then ' اگر از 27 بیشتر بود یعنی عبارتی به آن اضافه شده پس
strsql += " And " ' And
EndIf ' اضافه شود
strsql += " (name='" + TextBox2.Text + "')"
EndIf
If TextBox3.Text <> ""Then
If strsql.Length > 27 Then
strsql += " And "
EndIf
strsql += " (family='" + TextBox3.Text + "')"
EndIf
If ComboBox1.Text <> ""Then
If strsql.Length > 27 Then
strsql += " And "
EndIf
strsql += " (major ='" + ComboBox1.Text + "')"
EndIf
If TextBox4.Text <> ""Then
If strsql.Length > 27 Then
strsql += " And "
EndIf
strsql += " (date_ozviat='" + TextBox4.Text + "')"
EndIf
If CheckBox1.Checked = TrueThen
If strsql.Length > 27 Then
strsql += " And "
EndIf
strsql += " (state=" + CheckBox1.Checked + ")"
EndIf
If CheckBox2.Checked = TrueThen
If strsql.Length > 27 Then
strsql += " And "
EndIf
strsql += " (state=" + CheckBox2.Checked + ")"
EndIf
If strsql.Length = 27 Then ' اگر طول رشته تغییر نکرد یعنی هیچ یک از شرط ها اجرا نشده پس باید
strsql = strsql.Remove(23, 5) ' WHERE
EndIf ' برداشته شود
EndIf
dt = db.myselect(strsql)
DataGrid1.DataSource = dt

saeedr22
دوشنبه 29 تیر 1388, 02:33 صبح
با دستور where 1=1 شما یه شرظی می نویسین که همیشه درست هستش و اینو به این دلیل می نویسیم که شرط های بعدی رو بتونیم با and به این اضافه کنیم.

و در آخر هم متغییر S که تعریف کردیم و دستور select رو توش نوشتیم با دستوری که میگفتین تکلیفش چی میشه اونو پاس میدیم به database



dt = db.myselect(s)
DataGrid1.DataSource = dt

saeedr22
دوشنبه 29 تیر 1388, 19:54 عصر
مشکلتون حل شد؟

khomar
چهارشنبه 31 تیر 1388, 00:49 صبح
مشکلتون حل شد؟

بله با سپاس فراوان از شما و سایر دوستان.