PDA

View Full Version : جستجوی پیشرفته یا گزارش گیری



mjt10063
دوشنبه 14 مهر 1393, 16:50 عصر
با سلام دوستان
مشکلم تو قسمت گزارش گیری
یا جستجوی پبشرفته
می خواستم کاربر مثلا نمایش اطلاعات رو خودش انتخاب کنه حالا صعودی یا نزولی
و یا یه سری دیگه از مشخصات مربوط به سایت

مشکل اینجاست که من با کلی IF توی sql تونستم مثلا تاریخ اگر وارد شد
و یا اگر نزولی بود و یا غیره رو در بیارم
حالا خواستم بدونم اصلا این روش اصولی هست یا نه
و اگر نیست اساتید چه روشی رو پیشنهاد میدن

با تشکر
اینم کد جستجوی من

ALTER PROCEDURE Select_Jarime

(
@keshti int,
@sh_keshti int,
@tarikh_az nvarchar(50),
@tarikh_ta nvarchar(50),
@jamjarim_out Float output,
@jamekht_out Float output
)

AS
IF (@sh_keshti = '' AND @tarikh_az = '' AND @tarikh_ta = '')
BEGIN
IF (@keshti = 0)
BEGIN
Select * from t_jarime;
set @jamjarim_out = (Select SUM(jarime) from t_jarime);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime);
END
ELSE IF (@keshti = 1)
BEGIN
Select * from t_jarime where status = 'true';
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'true');
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'true');
END
ELSE IF (@keshti = 2)
BEGIN
Select * from t_jarime where status = 'false';
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'false');
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'false');
END
END
ELSE IF (@sh_keshti <> '' AND @tarikh_az = '' AND @tarikh_ta = '')
BEGIN
IF (@keshti = 0)
BEGIN
Select * from t_jarime where sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where sh_keshti = @sh_keshti);
END
ELSE IF (@keshti = 1)
BEGIN
Select * from t_jarime where status = 'true' AND sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'true' AND sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'true' AND sh_keshti = @sh_keshti);
END
ELSE IF (@keshti = 2)
BEGIN
Select * from t_jarime where status = 'false' AND sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'false' AND sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'false' AND sh_keshti = @sh_keshti);
END
END
ELSE IF (@sh_keshti = '' AND @tarikh_az <> '' AND @tarikh_ta <> '')
BEGIN
IF (@keshti = 0)
BEGIN
Select * from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta);
END
ELSE IF (@keshti = 1)
BEGIN
Select * from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta);
END
ELSE IF (@keshti = 2)
BEGIN
Select * from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta);
END
END
ELSE IF (@sh_keshti <> '' AND @tarikh_az <> '' AND @tarikh_ta <> '')
BEGIN
IF (@keshti = 0)
BEGIN
Select * from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
END
ELSE IF (@keshti = 1)
BEGIN
Select * from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'true' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
END
ELSE IF (@keshti = 2)
BEGIN
Select * from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti;
set @jamjarim_out = (Select SUM(jarime) from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
set @jamekht_out = (Select SUM(ekhtelaf) from t_jarime where status = 'false' AND tarikh Between @tarikh_az AND @tarikh_ta AND sh_keshti = @sh_keshti);
END
END
RETURN

mjt10063
سه شنبه 15 مهر 1393, 09:52 صبح
اساتید تا حالا جستجوی پیشرفته تو سایتشون استفاده نکردن؟؟؟
بابا یکی جواب بده

ahmad156
سه شنبه 15 مهر 1393, 10:52 صبح
دوست عزیز تقریباً روشتون درسته ولی دو مورد:
1-شما سعی کنین Query داینامیک بسازین نه اینکه توی هر IF کوئری جدید درست کنین.یعنی یه کوئری اولیه داشته باشین و بر اساس شروط اون رو گسترده کنین
2-سعی کنین Query داینامیک تون حدالامکان توی محیط برنامه تون درست کنین و به DataBase بفرستین.میتونین از StringBuilder برای این کار استفاده کنین

mjt10063
سه شنبه 15 مهر 1393, 18:32 عصر
دوست عزیز ای کاش بیشتر توضیح میدادید
و یا رفرنس میزاشتید

ahmad156
سه شنبه 15 مهر 1393, 18:50 عصر
اینجا (http://www.codeproject.com/Articles/13419/SelectQueryBuilder-Building-complex-and-flexible-S)روش ایجاد کوئری داینامیک رو توی محیط برنامه گفته و همچنین یه کلاس خوب معرفی کرده که میتونه کمکتون کنه.
اینجا (http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/)هم روش مورد استفاده در Stored Procedure رو گفته.

mjt10063
پنج شنبه 17 مهر 1393, 18:23 عصر
با تشکر فراوان واقعا رفرنس ها کمک کرد من کد کامل شده خودم رو میزارم شما ببینید
مشکل نداشته باشه
خیلی خیلی ممنون

mjt10063
پنج شنبه 17 مهر 1393, 18:46 عصر
این کد رویداد کلید جستجو :


try
{
string Q = "Select * From t_jarime ";
string sort_a; //مرتب سازی به صورت صعودی یا نزولی
string sort_n; //مرتب سازی بر اساس ستون
string sort; //مرتب سازی
string whereAnd = " Where ";
if (rdbtn_seodi.Checked == true)
sort_a = "ASC";
else if (rdbtn_nozol.Checked == true)
sort_a = "DESC";
else
sort_a = "ASC";
if (rdbtn_namkeshti.Checked == true)
sort_n = "n_keshti";
else if (rdbtn_tarikh.Checked == true)
sort_n = "tarikh";
else if (rdbtn_imo.Checked == true)
sort_n = "sh_keshti";
else if (rdbtn_mahmole.Checked == true)
sort_n = "mahmole";
else
sort_n = "tarikh";

sort = " ORDER BY " + sort_n + " " + sort_a; /*مرتب سازی صعودی یا نزولی*/

if (dlljos.SelectedValue != "0")
{
Q += whereAnd;
Q += " status = " + dlljos.SelectedValue;
whereAnd = " AND ";
}
/*جستجوی نمایندگان کشتیرانی*/
if (rdbtn_namayande.Checked == true)
{
Q += whereAnd;
Q += "id_namy_kesh = " + ddlnamykesh.SelectedItem.Value;
whereAnd = " AND ";
}
/*جستجوی بر اساس نام کشتی*/
if (txt_na_kesh.Text != "")
{
Q += whereAnd;
Q += "n_keshti like N'" + txt_na_kesh.Text + "%' ";
whereAnd = " AND ";
}
/*جستجوی بر اساس محموله*/
if (rdbtn_kala.Checked == true)
{
Q += whereAnd;
Q += "id_mahmole = " + ddl_mahmole.SelectedItem.Value;
whereAnd = " AND ";
}
/*جستجوی بر اساس بارنامه اداری*/
if (txt_barnam_edari.Text != "")
{
Q += whereAnd;
Q += "barname_e = " + txt_barnam_edari.Text;
whereAnd = " AND ";
}
/*جستجو براساس شماره IMO*/
if (txtshkeshti.Text != "")
{
Q += whereAnd;
Q += "sh_keshti = " + txtshkeshti.Text;
}

if (txttarikhaz.Text != "" && txttarikhta.Text != "")
{
Q += whereAnd;
Q += " tarikh Between '" + txttarikhaz.Text + "' AND '"+ txttarikhta.Text +"'";
whereAnd = " AND ";
}

Q += sort;

//نمایش جدول کشتی
if (scon.State == ConnectionState.Closed)
scon.Open();
SqlDataAdapter sda = new SqlDataAdapter("Select_Advence_Search", scon);
sda.SelectCommand.CommandType = CommandType.StoredProcedure;
sda.SelectCommand.Parameters.AddWithValue("@Q", Q);
//sda.SelectCommand.Parameters.AddWithValue("@keshti", dlljos.SelectedItem.Value);
//sda.SelectCommand.Parameters.AddWithValue("@sort_a", sort_a);
//sda.SelectCommand.Parameters.AddWithValue("@sort_n", sort_n);
//sda.SelectCommand.Parameters.AddWithValue("@id_namy_kesh", id_namy_kesh);
//sda.SelectCommand.Parameters.AddWithValue("@mahmole", noekala);
//sda.SelectCommand.Parameters.AddWithValue("@barname_e", txt_barnam_edari.Text);
//sda.SelectCommand.Parameters.AddWithValue("@n_keshti", txt_na_kesh.Text);
//sda.SelectCommand.Parameters.AddWithValue("@sh_keshti", txtshkeshti.Text);
//sda.SelectCommand.Parameters.AddWithValue("@tarikh_az", txttarikhaz.Text);
//sda.SelectCommand.Parameters.AddWithValue("@tarikh_ta", txttarikhta.Text);
sda.SelectCommand.Parameters.Add("@jamjarim_out", SqlDbType.Float);
sda.SelectCommand.Parameters.Add("@jamekht_out", SqlDbType.Float);
sda.SelectCommand.Parameters.Add("@msg", SqlDbType.NVarChar, 10000);
sda.SelectCommand.Parameters["@jamjarim_out"].Direction = ParameterDirection.Output;
sda.SelectCommand.Parameters["@jamekht_out"].Direction = ParameterDirection.Output;
sda.SelectCommand.Parameters["@msg"].Direction = ParameterDirection.Output;
sda.SelectCommand.ExecuteNonQuery();
DataTable dt = new DataTable();
sda.Fill(dt);
Repeater1.DataSource = dt;
Repeater1.DataBind();
((Label)Repeater1.Controls[Repeater1.Controls.Count - 1].Controls[0].FindControl("lbljamjarim")).Text = sda.SelectCommand.Parameters["@msg"].Value.ToString() + "ریال";
//((Label)Repeater1.Controls[Repeater1.Controls.Count - 1].Controls[0].FindControl("lbljamekht")).Text = sda.SelectCommand.Parameters["@jamekht_out"].Value.ToString();
}
catch (Exception err)
{
Response.Write("Error :" + err.Message);
}
finally
{
scon.Close();
}



این کد SQL


ALTER PROCEDURE Select_Advence_Search

(
@Q NVARCHAR(MAX),
@jamjarim_out Float output,
@jamekht_out Float output,
@msg nvarchar(max) output
)

AS
BEGIN
set @msg = @Q;
EXEC (@Q);
END
RETURN



ممنون میشم اگر بگید که کد نویسیم اصولی هست یا نه
با تشکر