PDA

View Full Version : جدول فاکتور و زیرفاکتور در دیتابیس



samiasoft
چهارشنبه 09 اسفند 1396, 16:43 عصر
سلام دوستان

سوالاتی که داشتم این هستش که :

وقتی کاربر کالاها را انتخاب و در دیتاگرید اضافه میکند

ایا همان لحظه که کالا رو اضافه میکند در دیتابیس هم ذخیره کنیم ؟

یا در اخر کار که کلیه کالاها را در دیتاگرید اضافه کرد بیاییم کل دیتاگرید رو بریزیم داخل دیتابیس؟

کدوم حالت رو پیشنهاد میکنید ؟

محمد رضا فاتحی
چهارشنبه 09 اسفند 1396, 17:03 عصر
سلام بهتره ابتدا اقلام فاکتور در دیتاگریدتون ثبت بشه تا کاربر بتونه به راحتی اونها رو تغییر بده و بعد از تکمیل و تاییدش در دیتابیس ذخیره بشه

danialafshari
چهارشنبه 09 اسفند 1396, 17:47 عصر
با سلام
با اجازه از آقای فاتحی
فکر میکنم منظور ایشون این هست که کالاها در جدول مربوطه ذخیره هستند و بحث سر زیر فاکتور هست
به نظر من بهتره زیر فاکتور کامل وارد شود بعد همه با هم در جدول ذخیره شوند چون ممکنه در حین نوشتن فاکتور موردی اشتباه شود و یا کلاً فاکتور کنسل شود
موفق باشید

samiasoft
چهارشنبه 09 اسفند 1396, 17:50 عصر
سلام بهتره ابتدا اقلام فاکتور در دیتاگریدتون ثبت بشه تا کاربر بتونه به راحتی اونها رو تغییر بده و بعد از تکمیل و تاییدش در دیتابیس ذخیره بشه

ممنونم از توجهتون.

درواقع منم همینکارو کردم ابتدا با دستور rows add خود دیتاگرید اطلاعات را داخل دیتاگرید ریختم....حال مساله ای که مواجه هستم اینه که من برای گزارش گیری از همان دیتاگرید میخواستم دیتاسورس اونو به گزارش ارتباط بدم...اما در این حالت دیتاسورس خالی هست...حال چطوری این اطلاعاتی که داخل دیتاگرید ریختم به دیتاسورس تبدیل کنم تا بتونم ازش گزارش بگیرم؟


و سوال دیگر اینکه
من میخواستم در جدول فاکتور شماره فاکتور ماکزیمم رو پیدا کنم و اگر نبود یه مقدار بهش اضافه کنم برای همین دستور زیر رو نوشتم اما خطا میاد :
var fid = database.Tbl_Factor.SqlQuery("SELECT (MAX(factor_id),0)+1 FROM Tbl_Factor").ToList();


txt_factor_id.Text = fid.ToString();
البته اگر کمک کنید اینو با خود دستورات linq بنویسیم بهتر میشود:خجالت:

mr.sirwan
چهارشنبه 09 اسفند 1396, 18:51 عصر
سوال دیگر اینکه
من میخواستم در جدول فاکتور شماره فاکتور ماکزیمم رو پیدا کنم و اگر نبود یه مقدار بهش اضافه کنم برای همین دستور زیر رو نوشتم اما خطا میاد :
var fid = database.Tbl_Factor.SqlQuery("SELECT (MAX(factor_id),0)+1 FROM Tbl_Factor").ToList();


txt_factor_id.Text = fid.ToString();
البته اگر کمک کنید اینو با خود دستورات linq بنویسیم بهتر میشود:خجالت:

var fid = database.Tbl_Factor.OrderByDescending(f=>f.factor_id).FirstOrDefault().factor_id + 1;

samiasoft
جمعه 11 اسفند 1396, 21:41 عصر
ممنون از شما دوستان بابت راهنمایی

اما من هنوز در این مورد موندم که چگونه اطلاعات موجود در دیتاگرید رو داخل دیتابیس ذخیره کنم؟

ایا بایستی بیاییم حلقه بزاریم که یکی یکی اطلاعات ردیف های دیتاگرید در دیتابیس ذخیره بشه ؟ یا راه دیگری هم وجود داره؟

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

mr.sirwan
جمعه 11 اسفند 1396, 22:17 عصر
بله باید حلقه بذارین و اقلام رو تو دیتابیس درج کنین

samiasoft
شنبه 12 اسفند 1396, 21:41 عصر
دوستان چگونه فاکتورهای ذخیره شده در دیتابیس را در یک محدوده تاریخ را حذف کنیم؟

جدول دیتابیس فاکتور و زیرفاکتور بدین صورته :
http://s8.picofile.com/file/8320840018/2018_03_03_220653.jpg

اگر بیاییم کوئری زیر رو بنویسیم با خطا مواجه خواهیم شد چون ابتدا بایستی زیرفاکتورهای مربوطه حذف شوند

sqlQuery = database.Database.ExecuteSqlCommand("delete from Tbl_Factor where date_submit>=@p0 AND date_submit<=@p1", fromDate, untilDate);




حال به نظرتون چگونه بایستی دستور حذف زیرفاکتور و بعد فاکتور رو بنویسیم ؟

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

mr.sirwan
شنبه 12 اسفند 1396, 21:53 عصر
تا جایی که من کار کردم، همونطور که حدس زدی باید توسط دو کوئری حذف کنی، این دوتا کوئری رو پشت سر هم توی ExecuteSqlCommand بذار:
DELETE FROM Tbl_ZirFactor WHERE factor_id_fk IN (SELECT factor_id FROM Tbl_Factor WHERE date_submit >= @p0 AND date_submit <= @p1)
DELETE FROM Tbl_Factor WHERE date_submit >= @p0 AND date_submit <= @p1

اما چرا توسط sql query؟ شما که داری از EF استفاده میکنی، چرا از ling to entity استفاده نمیکنی؟ شما که داری همه کوئری هاتو با دستورات sql میزنی، خب اگه اینطوره چرا رفتی سمت EF؟ ما از EF استفاده میکنیم چون سرعت کدنویسی رو بیشتر میکنه، اگه قرار باشه همه کوئری ها با سینتکس Sql باشن وقتت رو روی این دستورات تلف کنی که دیگه استفاده از EF معنی نداره

samiasoft
شنبه 12 اسفند 1396, 22:15 عصر
تا جایی که من کار کردم، همونطور که حدس زدی باید توسط دو کوئری حذف کنی، این دوتا کوئری رو پشت سر هم توی ExecuteSqlCommand بذار:
DELETE FROM Tbl_ZirFactor WHERE factor_id_fk IN (SELECT factor_id FROM Tbl_Factor WHERE date_submit >= @p0 AND date_submit <= @p1)
DELETE FROM Tbl_Factor WHERE date_submit >= @p0 AND date_submit <= @p1

اما چرا توسط sql query؟ شما که داری از EF استفاده میکنی، چرا از ling to entity استفاده نمیکنی؟ شما که داری همه کوئری هاتو با دستورات sql میزنی، خب اگه اینطوره چرا رفتی سمت EF؟ ما از EF استفاده میکنیم چون سرعت کدنویسی رو بیشتر میکنه، اگه قرار باشه همه کوئری ها با سینتکس Sql باشن وقتت رو روی این دستورات تلف کنی که دیگه استفاده از EF معنی نداره

سپاسگزارم بابت راهنماییتون...بله در مورد دستورات حق با شماست بایستی تغییربدم.

فقط یه موردی هم برام مبهم هست این هست که :

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

1- اینکه بیاییم از روی فاکتورهای ثبت شده یک کوئری بزنیم و تعداد کالاهای فروخته شده رو بدست بیاوریم.

2- یا اینکه در جدول کالاها یک ستونی درکنار موجودی بنام ستون فروخته شده داشته باشیم و از روی ان تعداد کالاهای فروخته شده روبدست بیاوریم.

یا اینکه نه راه دیگری رو پیشنهاد میکنید؟

mr.sirwan
شنبه 12 اسفند 1396, 22:38 عصر
سپاسگزارم بابت راهنماییتون...بله در مورد دستورات حق با شماست بایستی تغییربدم.

فقط یه موردی هم برام مبهم هست این هست که :

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

1- اینکه بیاییم از روی فاکتورهای ثبت شده یک کوئری بزنیم و تعداد کالاهای فروخته شده رو بدست بیاوریم.

2- یا اینکه در جدول کالاها یک ستونی درکنار موجودی بنام ستون فروخته شده داشته باشیم و از روی ان تعداد کالاهای فروخته شده روبدست بیاوریم.

یا اینکه نه راه دیگری رو پیشنهاد میکنید؟

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

samiasoft
شنبه 12 اسفند 1396, 22:48 عصر
به نظرم یه فیلد جدید توی جدول کالا ها بذارین بهتره، چون اگه بخوایم از روش اول استفاده کنیم به مرور زمان که داده های جدول فاکتور افزایش پیدا میکنن، محاسبه تعداد کالاهای فروخته شده زمان بر خواهد شد و پرفورمنس پایین میاد
حالا ببینیم نظر دوستان چیه


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

اما کی اینکارو انجام بدیم؟

چون من وقتی کل کالاها در دیتاگرید اضافه کردم در اخرکار اطلاعات را داخل دیتابیس ذخیره میکنم

حال من دو راه خواهم داشت که :

راه اول: بیام وقتی کالارو داخل دیتاگرید اضافه میکنم از جدول موجودی هم کم و به ستون فروخته شده اضافه کنم

راه دوم : یا اینکه وقتی کاربر کل کالای موردنظر رو داخل دیتاگرید اضافه کرد در اخر کار که میخواهیم فاکتور در دیتابیس ذخیره بشه همان لحظه هم بیاییم یه حلقه دوباره بزاریم و تعداد کالاهای اضافه شده بدست بیاریم و دوباره حلقه بزاریم و همان تعداد را در ستون فروخته شده ذخیره کنیم.

راه دومی یکم طولانی تر میشه:متفکر:راه اولی هم که خوب نیست چون ممکنه کاربر کالای موردنظر رو از دیتاگرید حذف کنه و دوباره مجبوریم به دیتابیس برگردونیم


شما کدوم راه رو پیشنهاد میدید؟

mr.sirwan
شنبه 12 اسفند 1396, 22:59 عصر
شما کدی که باهاش درج رو انجام میدی بذار تا بررسی کنیم، نیازی به این همه حلقه for نیست با یدونه کار روبراه میشه

samiasoft
شنبه 12 اسفند 1396, 23:06 عصر
شما کدی که باهاش درج رو انجام میدی بذار تا بررسی کنیم، نیازی به این همه حلقه for نیست با یدونه کار روبراه میشه


دستور اضافه کردن کالاها در دیتاگرید فاکتور :

grd_facotr_kharid.Rows.Add("",codekala,namekala,vahed,geimateforosh,tedad,kol_g eimat);

دستور ذخیره کل دیتاگرید در دیتابیس در جداول فاکتور و زیرفاکتور:
//ذخیره فاکتور در دیتابیس

decimal fid = decimal.Parse(txt_factor_id.Text);
decimal f_Praice = decimal.Parse(txt_factor_Praice.Text);
decimal f_TPraice = decimal.Parse(txt_factor_TPraice.Text);
int id_moshtari = Functions.id_mosh;
database.Tbl_Factor.Add(new Tbl_Factor()
{
factor_id = fid,
id_moshtari_fk = id_moshtari,
date_submit =factor_date.Text,
pardakht_type =combo_pardakht.Text,
factor_Price = f_Praice,
Total_Price = f_TPraice


});
database.SaveChanges();


//.................................................. ..
//ذخیره زیرفاکتور یا همان کل دیتاگرید در دیتابیس


for (int i=0 ; i <= grd_facotr_kharid.RowCount-1 ; i++)
{
string pid = grd_facotr_kharid.Rows[i].Cells["P_id_fk"].Value.ToString();
string tdad = grd_facotr_kharid.Rows[i].Cells["z_tedad"].Value.ToString();
string zprice = grd_facotr_kharid.Rows[i].Cells["z_Price"].Value.ToString();
string ztprice = grd_facotr_kharid.Rows[i].Cells["z_TPrice"].Value.ToString();


database.Tbl_ZirFactor.Add(new Tbl_ZirFactor()
{
factor_id_fk= fid,
P_id_fk= decimal.Parse(pid),
z_tedad= int.Parse(tdad),
z_Price=decimal.Parse(zprice),
z_TPrice= decimal.Parse(ztprice)


});
database.SaveChanges();
}

mr.sirwan
شنبه 12 اسفند 1396, 23:12 عصر
کد کالا کدومه؟ Pid؟

mr.sirwan
شنبه 12 اسفند 1396, 23:18 عصر
Product product = null;
for (int i=0 ; i <= grd_facotr_kharid.RowCount-1 ; i++) {
string pid = grd_facotr_kharid.Rows[i].Cells["P_id_fk"].Value.ToString();
string tdad = grd_facotr_kharid.Rows[i].Cells["z_tedad"].Value.ToString();
string zprice = grd_facotr_kharid.Rows[i].Cells["z_Price"].Value.ToString();
string ztprice = grd_facotr_kharid.Rows[i].Cells["z_TPrice"].Value.ToString();


database.Tbl_ZirFactor.Add(new Tbl_ZirFactor()
{
factor_id_fk= fid,
P_id_fk= decimal.Parse(pid),
z_tedad= int.Parse(tdad),
z_Price=decimal.Parse(zprice),
z_TPrice= decimal.Parse(ztprice)


});

product = database.products.Find(pid);
product.SoldQuantity+=tdad;
database.Entry(product).State= EntityState.Modified;


database.SaveChanges();
product = null;


}



پراپرتی SoldQuantity فیلد مقدار فروش رفته س، در ضمن اگر این عمل ویرایش که الان اضافه کردم وجود نداشت، لازم نبود به ازای هر بار اضافه کردن به لیست فاکتور، متد SaveGhanges رو فراخوانی کنی، کافی بود کارای اضافه کردن رو داخل حلقه انجام بدی و یک بار متد SaveChanges رو بیرون حلقه فراخوانی کنی

mr.sirwan
شنبه 12 اسفند 1396, 23:38 عصر
یه راه خیلی بهتر اینه که یه لیست از نوع کد کالا تعریف کنی و هر وقت کالایی به زیر فاکتور اضافه یا از زیر فاکتور حذف شد، کد اون کالا رو به لیست اضافه یا ازش حذف کنی و بعد از تایید نهایی فاکتور که قراره تو دیتابیس ثبت بشه، بیای قبل از حلقه for تمامی اون کالاهایی که کدشون تو لیستت هست (یعنی جهت فروش به این فاکتور اضافه شدن) رو واکشی کنی، و عمل ویرایش فیلد "فروش رفته" رو روشون انچام بدی، با اینکار دقیقا 2 تا کوئری به دیتابیس خواهی زد. که از کد الانت خیلی بهتر و حرفه ای تر هستش

samiasoft
یک شنبه 13 اسفند 1396, 00:00 صبح
یه راه خیلی بهتر اینه که یه لیست از نوع کد کالا تعریف کنی و هر وقت کالایی به زیر فاکتور اضافه یا از زیر فاکتور حذف شد، کد اون کالا رو به لیست اضافه یا ازش حذف کنی و بعد از تایید نهایی فاکتور که قراره تو دیتابیس ثبت بشه، بیای قبل از حلقه for تمامی اون کالاهایی که کدشون تو لیستت هست (یعنی جهت فروش به این فاکتور اضافه شدن) رو واکشی کنی، و عمل ویرایش فیلد "فروش رفته" رو روشون انچام بدی، با اینکار دقیقا 2 تا کوئری به دیتابیس خواهی زد. که از کد الانت خیلی بهتر و حرفه ای تر هستش

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