PDA

View Full Version : سبد سفارش غذا



angel farahani
جمعه 19 اردیبهشت 1393, 22:12 عصر
با سلام ، دوستان لطفا من رو راهنمایی کنید ، من میخوام برای سایتم سفارش غذا داشته باشم ، کاربر بعد از انتخاب غذا در صفحه ی بعدش لیست غذاهایی رو که سفارش داده رو ببینه و بتونه حذف یا تعداد آن را تغییر بده و در همان صفحه تایید رو که زده سفارش کامل ثبت بشه .

118826



حالا کاری که من تونستم بکنم اینه که کاربر غذاهاش رو انتخاب کرد ، مقادیر در سشن میره و در صفحه بعدش در پایگاه ثبت میشه ، این درست هست ، اما لیست سفارش های کاربر به صورت مجزا رو نمی تونم نمایش بدم .

حالا اگر هر طوری که میتونید من رو راهنمایی کنید تا بتونم سریعتر به جواب برسم .

mRizvandi
جمعه 19 اردیبهشت 1393, 22:45 عصر
سلام
فکر می کنم شما ابتدا باید ساختار درستی از بانک اطلاعاتی داشته باشید و بعد کارهای لازم در سمت برنامه رو پیاده کنید:
ابتدا دو جدول برای ثبت سفارش نیاز دارید، یکی برای مشخصات سفارش از قبیل کاربر سفارش دهند، تاریخ سفارش و ... و یکی هم برای ثبت آیتمهای سفارش از قبیل نوع غذا، تعداد و ...
یک لیست پیشنهادی در زیر براتون گذاشتم.
با توجه به اینکه قیمتها هر روز در ایران در حال تغییر است!!! بهتره که قیمت رو در سفارش ثبت کنید بعدا در حسابداری مساله ای نداشته باشید.
حتما وضعیت سفارش رو هم ثبت کنید، چون ممکنه یک سفارشی در شرایط خاص برگشت بخوره، از نیاز به حذف باشه و ... شما با وضعیت می تونید این موضوع رو کنترل کنید.
(ممکنه به جدولهای دیگه ای هم نیاز داشته باشید، ولی اینها حداقل هستند)

Table: Order
1- OrderID (AutiID)
2- OrderDate
3- UserID
4- StatusID
5- TotalPrice
6- ...
---
Table: OrderDetails
1- OrderDetailsID (AutoID)
2- OrderID (ForignKey)
3- FoodID (کد غذا از جدول غذا و خوراک)
4- OrderNumber (شماره سفارش، اگر نیاز دارید
5- ItemOrderNumber (تعداد سفارش غذا)
6- Price
7-...

فکر می کنم حالا پیاده سازی براتون مشخص شده باشه.
هر آنچه در که سبد خرید در سشن دارید رو در مرحله آخر باید در این دو جدول ثبت کنید.
حالا گرفتن لیست سفارشات کار بسیار ساده ای است، اگر نیاز به اقلام سفارش هم بشه که میشه با Join زدن بین دو جدول اقلام سفارش رو هم نمایش داد و ...

angel farahani
جمعه 19 اردیبهشت 1393, 23:52 عصر
با سلام و سپاس از اینکه جواب دادین ، من این دو جدول order , orderdetail رو دارم ولی نمی دونم چطور هر سطر از این منوی غذایی رو در جدول جزئیات سفارش ثبت کنم ؟

این کدهای من در همین صفحه ی سفارش هست : حالا میخوام بعد از اینکه این جزئیات ثیت شد در صفحه تایید سفارش لیست خریدهاش رو با قیمت کل و قیمت هر کدام نشان بده .

این کد زیر جواب نمیده و خطای Object reference not set to an instance of an object. رو میده ، اگر این کد جواب بده ، صفحه تایید سفارش دیگه راحت هست . ممنونم


protected void InsertDetailOrder() {
double price = 0;
double totalprice = 0;
int num = 0;

// Connect to database for inserting
String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);

foreach (GridViewRow row in MenuGrid.Rows)
{
if (((CheckBox)row.FindControl("CheckBox1")).Checked)
{
TextBox count = (TextBox)MenuGrid.FindControl("count"); // each count
Label foodid = (Label)MenuGrid.FindControl("Label1"); //each foodid
Label foodprice = (Label)MenuGrid.FindControl("pricelabel"); // each foodprice


int c = Convert.ToInt16(count.Text);
int f = Convert.ToInt16(foodid.Text);
price = Convert.ToDouble(foodprice.Text);
num = num + Convert.ToInt16(count);
price = Convert.ToDouble(((Label)row.FindControl("pricelabel")).Text) * Convert.ToInt16(count);
totalprice = totalprice + price;


SqlCommand cmd = new SqlCommand("InsertOrder", sqlcon);
cmd.Connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@count",c);
cmd.Parameters.AddWithValue("@foodid",f);
cmd.Parameters.AddWithValue("@price",price);
cmd.Parameters.AddWithValue("@userid", Session["userid"]);
cmd.Parameters.AddWithValue("@shopid", Request.QueryString["shopid"]);
cmd.Parameters.AddWithValue("@orderdate",SqlDbType.Date).Value = DateTime.Now;
cmd.Parameters.AddWithValue("@orderstatus", 1);
cmd.Parameters.AddWithValue("@explain", TextBox4.Text);
cmd.Parameters.AddWithValue("@thisaddress", TextBox5.Text);
cmd.Parameters.AddWithValue("@allcount", num);
cmd.Parameters.AddWithValue("@allprice", totalprice);


sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();
}
}


}

mRizvandi
شنبه 20 اردیبهشت 1393, 00:28 صبح
توی کدوم خط خطا رو میگیرید؟

angel farahani
شنبه 20 اردیبهشت 1393, 01:18 صبح
int c = Convert.ToInt16(count.Text);

از خط کد بالا

mRizvandi
یک شنبه 21 اردیبهشت 1393, 08:32 صبح
int c = Convert.ToInt16(count.Text);

از خط کد بالا

فکر می کنم یه اشتباه کوچیک رخ داده، این کدها رو اصلاح کنید:


TextBox count = (TextBox)row.FindControl("count"); // each count
Label foodid = (Label)row.FindControl("Label1"); //each foodid
Label foodprice = (Label)row.FindControl("pricelabel"); // each foodprice

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

angel farahani
یک شنبه 21 اردیبهشت 1393, 19:32 عصر
سپاس از شما ؛ حالا اون خطا رفع شد ، این خطا رو میده :



Unable to cast object of type 'System.Web.UI.WebControls.TextBox' to type 'System.IConvertible'.




رو از خط


num = num + Convert.ToInt16(count);

می گیره .

mRizvandi
یک شنبه 21 اردیبهشت 1393, 19:42 عصر
سپاس از شما ؛ حالا اون خطا رفع شد ، این خطا رو میده :



Unable to cast object of type 'System.Web.UI.WebControls.TextBox' to type 'System.IConvertible'.




رو از خط


num = num + Convert.ToInt16(count);

می گیره .

شما دارید کل آبجکت رو توی شی count قرار میدید، بنابراین موقع ارجاع باید خصوصیت مورد نظر رو مشخص کنید. یا اینکه اگر فقط با خصوصیت Text کار دارید فقط همون رو از ابتدا توی یک متغیر بریزید.
مثال:


TextBox count = (TextBox)row.FindControl("count"); // each count
num = num + Convert.ToInt16(count.Text);
or
string count = ((TextBox)row.FindControl("count")).Text; // each count
num = num + Convert.ToInt16(count);


بقیه موارد رو هم مثل یکی از مثالهای بالا ویرایش کنید.

یک نکته هم توی پست قبلی فراموش کردم بگم این هست که این سایتی که الان طراحی شده با کدی که گذاشتید یک اشکال فنی و امنیتی داره. چون شما دارید قیمت غذا رو از توی گرید می خونید ممکنه کاربر در سمت کلاینت دیتا رو وبرایش کنه. اینطوری شما قیمت غذایی که تغییر کرده رو خواهید داشت که از لحاظ امنیتی و کاری صحیح نیست. پیشنهاد می کنم هر آنچه که نیاز دارید از جمله مبلغ رو از جدول دوباره بخونید. (ای دی رو که دارید با اون رکورد رو پیدا کنید و قیمت رو از توی جدول مربوطه بخونید)

angel farahani
یک شنبه 21 اردیبهشت 1393, 20:11 عصر
بازم ممنونم ، اما منظورتون رو زیاد متوجه نشدم ، کاربر چطور قیمت رو میتونه ویرایش کنه ؟ من که این امکان رو نزاشتم که

angel farahani
یک شنبه 21 اردیبهشت 1393, 20:28 عصر
الان از طریق همین صفحه ، سفارش در دیتابیس درج شد ، حالا میشه بفرمایید ، منظورتون چی بود ؟ ممنونم

mankanhamed
یک شنبه 21 اردیبهشت 1393, 22:45 عصر
سلام
فکر می کنم شما ابتدا باید ساختار درستی از بانک اطلاعاتی داشته باشید و بعد کارهای لازم در سمت برنامه رو پیاده کنید:
ابتدا دو جدول برای ثبت سفارش نیاز دارید، یکی برای مشخصات سفارش از قبیل کاربر سفارش دهند، تاریخ سفارش و ... و یکی هم برای ثبت آیتمهای سفارش از قبیل نوع غذا، تعداد و ...
یک لیست پیشنهادی در زیر براتون گذاشتم.
با توجه به اینکه قیمتها هر روز در ایران در حال تغییر است!!! بهتره که قیمت رو در سفارش ثبت کنید بعدا در حسابداری مساله ای نداشته باشید.
حتما وضعیت سفارش رو هم ثبت کنید، چون ممکنه یک سفارشی در شرایط خاص برگشت بخوره، از نیاز به حذف باشه و ... شما با وضعیت می تونید این موضوع رو کنترل کنید.
(ممکنه به جدولهای دیگه ای هم نیاز داشته باشید، ولی اینها حداقل هستند)

Table: Order
1- OrderID (AutiID)
2- OrderDate
3- UserID
4- StatusID
5- TotalPrice
6- ...
---
Table: OrderDetails
1- OrderDetailsID (AutoID)
2- OrderID (ForignKey)
3- FoodID (کد غذا از جدول غذا و خوراک)
4- OrderNumber (شماره سفارش، اگر نیاز دارید
5- ItemOrderNumber (تعداد سفارش غذا)
6- Price
7-...

فکر می کنم حالا پیاده سازی براتون مشخص شده باشه.
هر آنچه در که سبد خرید در سشن دارید رو در مرحله آخر باید در این دو جدول ثبت کنید.
حالا گرفتن لیست سفارشات کار بسیار ساده ای است، اگر نیاز به اقلام سفارش هم بشه که میشه با Join زدن بین دو جدول اقلام سفارش رو هم نمایش داد و ...

اگر امکان داره یه توضیحی جامعی در مورد session شماره فاکتور می دید. اگر ممکنه یه نمونه کدم بذارید. با تشکر

mankanhamed
یک شنبه 21 اردیبهشت 1393, 22:47 عصر
با سلام ، دوستان لطفا من رو راهنمایی کنید ، من میخوام برای سایتم سفارش غذا داشته باشم ، کاربر بعد از انتخاب غذا در صفحه ی بعدش لیست غذاهایی رو که سفارش داده رو ببینه و بتونه حذف یا تعداد آن را تغییر بده و در همان صفحه تایید رو که زده سفارش کامل ثبت بشه .

118826



حالا کاری که من تونستم بکنم اینه که کاربر غذاهاش رو انتخاب کرد ، مقادیر در سشن میره و در صفحه بعدش در پایگاه ثبت میشه ، این درست هست ، اما لیست سفارش های کاربر به صورت مجزا رو نمی تونم نمایش بدم .

حالا اگر هر طوری که میتونید من رو راهنمایی کنید تا بتونم سریعتر به جواب برسم .
اگر امکان داره یه توضیحی جامعی در مورد session شماره فاکتور می دید. اگر ممکنه کد های صفحه سفارش و سبد خرید را قرار دهید. بیشتر توی session شماره فاکتور مشکل دارم. (خیلی کارم گیره). ممنون میشم

mRizvandi
یک شنبه 21 اردیبهشت 1393, 22:49 عصر
بازم ممنونم ، اما منظورتون رو زیاد متوجه نشدم ، کاربر چطور قیمت رو میتونه ویرایش کنه ؟ من که این امکان رو نزاشتم که


الان از طریق همین صفحه ، سفارش در دیتابیس درج شد ، حالا میشه بفرمایید ، منظورتون چی بود ؟ ممنونم
خوبه که درست شده،
در خصوص نکته امنیتی هم اشتباه از من بود، پوزش می خوام.
شرایط صفحه شما این موضوع امنیتی رو بوجود نمی آره، چون شما همه چی رو در سمت سرور دارید. اگر در سمت کلاینت مثلا با جی کوئری کار میشد، مساله داشت.
پس شما با خیال راحت کارتون رو ادامه بدید.
موفق باشید.

angel farahani
یک شنبه 21 اردیبهشت 1393, 23:19 عصر
وای ممنونم خیالم راحت شد ، فقط یک چیزی من میخوام همین سفارشی رو کاربر انتخاب کرد و در دیتابیس ثبت شد در صفحه بعد به عنوان سبد خریدش نشون بدم ، ولی از انجایی که درج توسط پروسجر در دو جدول انجام میشه ، من به فیلد orderdetail و یا orderid در asp دسترسی ندارم که با سشن به صفحه سبد خریدش منتقل بدم ... میشه بفرمایید چطور این دو فیلد رو در سشن بزارم ؟؟

واقعا ممنونم

angel farahani
یک شنبه 21 اردیبهشت 1393, 23:24 عصر
سلام دوست گرامی بله حتما کد ها براتون میزارم ، منتها من با سشن کار نکردم ، درج سفارش با پروسجر هست و دو جدول order , orderdetail دارم که آیتم های انتخابی کاربر در جدول جزئیات سفارش هست ، اگر دقیق فیلدهای جدول یا پروسجر درج رو می خواهی هم بگو که بزارم

این کدهای همین صفحه ای که عکسش رو گذاشتم در داخل دکمه "تایید برای ادامه " :



protected void InsertDetailOrder() {
Session["shopid"] = Request.QueryString["id"];
double price = 0;
double totalprice = 0;
int num = 0;

// Connect to database for inserting
String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);

foreach (GridViewRow row in MenuGrid.Rows)
{
if (((CheckBox)row.FindControl("CheckBox1")).Checked)
{
TextBox count = (TextBox)row.FindControl("count"); // each count
Label foodid = (Label)row.FindControl("Label1"); //each foodid
Label foodprice = (Label)row.FindControl("pricelabel"); // each foodprice


int c = Convert.ToInt16(count.Text);
int f = Convert.ToInt16(foodid.Text);
price = Convert.ToDouble(foodprice.Text);
num = num + Convert.ToInt32(count.Text);
price = Convert.ToDouble(((Label)row.FindControl("pricelabel")).Text) * Convert.ToInt16(count.Text);
totalprice = totalprice + price;


SqlCommand cmd = new SqlCommand("InsertOrder", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@count",c);
cmd.Parameters.AddWithValue("@foodid",f);
cmd.Parameters.AddWithValue("@price",price);
cmd.Parameters.AddWithValue("@userid", Session["userid"]);
cmd.Parameters.AddWithValue("@shopid", Request.QueryString["id"]);
cmd.Parameters.AddWithValue("@orderdate",SqlDbType.Date).Value = DateTime.Now;
cmd.Parameters.AddWithValue("@orderstatus", 1);
cmd.Parameters.AddWithValue("@explain", TextBox4.Text);
cmd.Parameters.AddWithValue("@thisaddress", TextBox5.Text);
cmd.Parameters.AddWithValue("@allcount", num);
cmd.Parameters.AddWithValue("@allprice", totalprice);


sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();

}
}


}

angel farahani
دوشنبه 22 اردیبهشت 1393, 20:35 عصر
لطفا دوستان من رو راهنمایی کنید ،
فقط یک چیزی من میخوام همین سفارشی رو کاربر انتخاب کرد و در دیتابیس ثبت شد در صفحه بعد به عنوان سبد خریدش نشون بدم ، ولی از انجایی که درج توسط پروسجر در دو جدول انجام میشه ، من به فیلد orderdetail و یا orderid در asp دسترسی ندارم که با سشن به صفحه سبد خریدش منتقل بدم ... میشه بفرمایید چطور این دو فیلد رو در سشن بزارم ؟؟


ممنونم ، منتظر نظرتان هستم

mRizvandi
سه شنبه 23 اردیبهشت 1393, 11:35 صبح
دوست عزیز شما دو راه برای این موضوع دارید:
یک) SP که دارید برای ثبت اطلاعات صدا می زنید، رو تغییر بدید، به این شکل که بعد از ثبت یک رکورد کامل برگردونه که ID هم داخلش باشه. یعنی SP شما دو تا کوئری داره، اولین کوئری Insert می کنه، دومین کوئری رکورد Insert شده رو برمیگردونه.
دو) برای SP یک مقدار برگشتی تعریف کنید و اون رو با آی دی ثبت شده پر کنید و برگردونید. کدتون رو تغییر بدبد و مقدار آی دی رو بگیرید. وقتی مقدار آی دی سفارش رو داشته باشید می تونید با یک کوئری به جزییات سفارش هم دسترسی داشته باشید.
یک نمونه SP براتون گذاشتم، شبیه به این عمل کنید:

ALTER PROCEDURE [dbo].[Cities_InsertCity]
(
@ID int,
@CountryID int,
@RegionID int,
@City varchar(50),
@TimeZone varchar(10),
@Latitude float,
@Longitude float
)
AS
SET NOCOUNT OFF;
INSERT INTO [Cities] ([ID], [CountryID], [RegionID], [City], [TimeZone], [Latitude], [Longitude]) VALUES (@ID, @CountryID, @RegionID, @City, @TimeZone, @Latitude, @Longitude);

SELECT ID, CountryID, RegionID, City, TimeZone, Latitude, Longitude FROM Cities WHERE (ID = @ID)

angel farahani
سه شنبه 23 اردیبهشت 1393, 12:41 عصر
مورد اول رو که گفتید متوجه شدم ، اما من برای نمایش سبد خرید آن فرد نیاز به نام غذا هم دارم که از جدول food می آید پس کلا میشه 3 جدول : food , order , orderdetail حالا با این پروسجری که الان دارم چطور میتونم انجام بدم ؟


ALTER Procedure [dbo].[InsertOrder]@userid int,
@shopid int,
@orderdate date,
@orderstatus tinyint,
@explain varchar(100),
@thisaddress varchar(100),
@allcount int,
@allprice int,
@foodid int,
@count int,
@price int
AS
Declare @detailid int


INSERT INTO [orderdetail]


([foodid],[count],[price])
VALUES
(@foodid,@count,@price)


SET @detailid = SCOPE_IDENTITY()


INSERT INTO [order]
([userid]
,[shopid],[orderdate],[orderstatus],[explain],[thisaddress],[allcount],[allprice],[detailid])
VALUES
(@userid
,@shopid,GETDATE(),1,@explain,@thisaddress,@allcou nt,@allprice,@detailid);


RETURN

mankanhamed
چهارشنبه 24 اردیبهشت 1393, 14:29 عصر
سلام دوست گرامی بله حتما کد ها براتون میزارم ، منتها من با سشن کار نکردم ، درج سفارش با پروسجر هست و دو جدول order , orderdetail دارم که آیتم های انتخابی کاربر در جدول جزئیات سفارش هست ، اگر دقیق فیلدهای جدول یا پروسجر درج رو می خواهی هم بگو که بزارم

این کدهای همین صفحه ای که عکسش رو گذاشتم در داخل دکمه "تایید برای ادامه " :



protected void InsertDetailOrder() {
Session["shopid"] = Request.QueryString["id"];
double price = 0;
double totalprice = 0;
int num = 0;

// Connect to database for inserting
String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);

foreach (GridViewRow row in MenuGrid.Rows)
{
if (((CheckBox)row.FindControl("CheckBox1")).Checked)
{
TextBox count = (TextBox)row.FindControl("count"); // each count
Label foodid = (Label)row.FindControl("Label1"); //each foodid
Label foodprice = (Label)row.FindControl("pricelabel"); // each foodprice


int c = Convert.ToInt16(count.Text);
int f = Convert.ToInt16(foodid.Text);
price = Convert.ToDouble(foodprice.Text);
num = num + Convert.ToInt32(count.Text);
price = Convert.ToDouble(((Label)row.FindControl("pricelabel")).Text) * Convert.ToInt16(count.Text);
totalprice = totalprice + price;


SqlCommand cmd = new SqlCommand("InsertOrder", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@count",c);
cmd.Parameters.AddWithValue("@foodid",f);
cmd.Parameters.AddWithValue("@price",price);
cmd.Parameters.AddWithValue("@userid", Session["userid"]);
cmd.Parameters.AddWithValue("@shopid", Request.QueryString["id"]);
cmd.Parameters.AddWithValue("@orderdate",SqlDbType.Date).Value = DateTime.Now;
cmd.Parameters.AddWithValue("@orderstatus", 1);
cmd.Parameters.AddWithValue("@explain", TextBox4.Text);
cmd.Parameters.AddWithValue("@thisaddress", TextBox5.Text);
cmd.Parameters.AddWithValue("@allcount", num);
cmd.Parameters.AddWithValue("@allprice", totalprice);


sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();

}
}


}

دمت گرم اگر امکان داره فیلدهای جدول یا پروسجر درج رو هم بی زحمت بذار.

angel farahani
پنج شنبه 25 اردیبهشت 1393, 19:10 عصر
این پروسجرم ، اما یه مشکلی داره اینکه به ازای هر انتخاب کاربر یک رکورد هم در جدول order و هم در جدول detailorder ثبت میکنه ، که این درست نیست ، باید به ازای سفارش کاربر یک رکورد در جدول سفارش و به تعداد سفارش ها در جدول جزئیات ثبت شه :( حال چیکار کنم که اینطور جواب بده

این پروسجرم که به نظرم درست نیست


ALTER Procedure [dbo].[InsertOrder]@userid int,
@shopid int,
@orderdate date,
@orderstatus tinyint,
@explain varchar(100),
@thisaddress varchar(100),
@allcount int,
@allprice int,
@foodid int,
@count int,
@price int


AS
Declare @detailid int


INSERT INTO [orderdetail]


([foodid],[count],[price])
VALUES
(@foodid,@count,@price)


SET @detailid = SCOPE_IDENTITY()


INSERT INTO [order]
([userid]
,[shopid],[orderdate],[orderstatus],[explain],[thisaddress],[allcount],[allprice],[detailid])
VALUES
(@userid
,@shopid,GETDATE(),1,@explain,@thisaddress,@allcou nt,@allprice,@detailid);


RETURN

angel farahani
پنج شنبه 25 اردیبهشت 1393, 19:39 عصر
من سوالم را اینجا مطرح کردم ، لطفا راهنماییم کنید :(

http://barnamenevis.org/showthread.php?452355-%D9%BE%D8%B1%D9%88%D8%B3%D8%AC%D8%B1-%D8%AB%D8%A8%D8%AA-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4-%D8%BA%D8%B0%D8%A7