PDA

View Full Version : سوال: نحوه خروج کالا از انبار و ثبت در لیست فروخته شده ها - LINQ



hadimtn
یک شنبه 01 شهریور 1394, 19:23 عصر
فرم زیر را در نظر بگیرید:
134577 134579 134581 134580

برای فروش کالا ابتدا کالاها به لیست موقت (ِDataGridView) اضافه (با زدن دکمه ی "لیست") و قسمت اطلاعات خرید به روز میشه. بعد از لیست کردن کالاها با دکمه‌ای که علامت تیک داره، همه کالاها ابتدا به صورت تک تک به جدول "SaledTable" اضافه و سپس فاکتور ایجاد میشه. در واقع تمام کالاهای لیست موقت یه کد اختصاصی به عنوان شماره فاکتور دارن، که اون کد به همراه نام مشتری، مبلغ کل، ارزش افزوده و ... در جدول "FactorTable" ذخیره میشن.
چند تا سوال دارم که همینجا میپرسم؛

hadimtn
یک شنبه 01 شهریور 1394, 19:24 عصر
1. در قسمت "صدور لیست فروش"، نام کالا، نشان و تعداد از یک جدول و یک سطر هستند، پرس و جو رو باید چه جوری بنویسم، سطری رو پیدا کنه که ستون نام کالا و نشان اون با مقادیر Comboxها برابر باشه. و بتونم به اطلاعات بقیه ی ستون های Query دسترسی داشته باشم؟!
خودم به این شکل نوشتم ولی برای هر فیلد باید Query رو از اول بنویسم:
var FQ = (from r in db.InventoryTables
where r.ObjectName == objectSelectorComboBox.Text && r.BrandName == brandSelectorComboBox.Text
select r.Number).SingleOrDefault();
میخوام به شکل زیر از جواب Query که یک سطر از جدول Inventory است، استفاده کنم:
textBox1.Text = Query.Number;
textBox2.Text = Query.InPrice;
& ...


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

var Query = (from b in db.InventoryTables
where b.ObjectName == objectSelectorComboBox.Text && b.BrandName == brandSelectorComboBox.Text
select new { b.ObjectName, b.BrandName, b.Number, b.Minimum, b.InPrice, b.OutPrice }).SingleOrDefault();
که میشه از تک تک فیلدهای Query استفاده کرد. به این شکل:
textBox1.Text = Query.ObjectName

تا سؤال بعدی ...

ژیار رحیمی
دوشنبه 02 شهریور 1394, 04:55 صبح
سلام وقت عالی بخیر.Query های شما دارای اشکالاتی میباشد. در نحوه جستجو شما بهتره براساس کلید باشه تا نام کالا.شما ابتدا در comboBox کالا لیست کالاهاتو میریزی ( DisplayMember رو برای نام کالا و ValueMember هم Id کالا رو ست میکنی) .در رویداد SelectedValueChanged کامبوباکس کالا باید کویری انتخاب برند (براساس ValueMember کامبوباکس کالا)رو بزنی و نتیجه داخل کامبوباکس برند بریزی(دو فیلد نام برند و آیدی آن در جدول) مشابه روال قبلی بعد تو رویداد SelectedValueChanged کامبوباکس برند باید کویری برای برگرداندن مقدار موجودی در انبار بنویسی(بر اساس مقادیر Value های کامبو باکس کالا و کامبوباکس برند) که نتیجه کویری در مکان آن نمایش داده شود.بعد از چک کردن موجودی شما مقداد فروش رو انتخاب و افزودن به لیست (اصل کار اینجاست که باید انجام بدیم)
شما بهتره در جدول SaleTable یه دونه فیلد مبلغ بزاری (چون شما در جدول انبار دو فیلد ورودی و خروجی رو مشخص کردی دیگر لازم نیست) ودر جدول FactorTable یه فیلد برای نوع فاکتور اضافه کنی بهتره(به واسطه مقدار این فیلد شما میتونی فاکتورهای خودتو تفکیک کنی)
این موارد رو رفع کن تا در ادامه بقیه کار راهنمایی صورت گیرد

hadimtn
دوشنبه 02 شهریور 1394, 21:10 عصر
سلام وقت عالی بخیر.Query های شما دارای اشکالاتی میباشد. در نحوه جستجو شما بهتره براساس کلید باشه تا نام کالا.شما ابتدا در comboBox کالا لیست کالاهاتو میریزی ( DisplayMember رو برای نام کالا و ValueMember هم Id کالا رو ست میکنی) .در رویداد SelectedValueChanged کامبوباکس کالا باید کویری انتخاب برند (براساس ValueMember کامبوباکس کالا)رو بزنی و نتیجه داخل کامبوباکس برند بریزی(دو فیلد نام برند و آیدی آن در جدول) مشابه روال قبلی بعد تو رویداد SelectedValueChanged کامبوباکس برند باید کویری برای برگرداندن مقدار موجودی در انبار بنویسی(بر اساس مقادیر Value های کامبو باکس کالا و کامبوباکس برند) که نتیجه کویری در مکان آن نمایش داده شود.بعد از چک کردن موجودی شما مقداد فروش رو انتخاب و افزودن به لیست (اصل کار اینجاست که باید انجام بدیم)
مشکل بنده بیشتر روی دستورات LINQ می‌باشد؛ Query رو چه جوری باید بنویسم که دو مقدار ID و ObjectName یک سطر در دسترس باشه، تا بتونم ValueMember و DisplayMember رو مقدار دهی کنم؟!
بنده این روال رو به این شکل انجام میدم:
فرم لود:
LINQDataContext db = new LINQDataContext();
string FirstItem = "انتخاب کنید";
var Query = (from c in db.InventoryTables select c.ObjectName).Distinct().OrderBy(item => item).ToList();
Query.Insert(0, FirstItem);
objectSelectorComboBox.DataSource = Query;

رویداد TextChange مربوط به نام کالا:
if (objectSelectorComboBox.SelectedItem.ToString() == FirstItem)
{
brandSelectorComboBox.Visible = false;
}
else
{
var query =
(from r in db.InventoryTables
where r.ObjectName == objectSelectorComboBox.SelectedItem.ToString()
select r).ToList();
query.Insert(0, new InventoryTable() { BrandName = FirstItem });
brandSelectorComboBox.DataSource = query;
brandSelectorComboBox.Visible = true;
}
رویداد TextChange مربوط به نشان:
if (brandSelectorComboBox.Text != FirstItem)
{
var Query = (from b in db.InventoryTables
where b.ObjectName == objectSelectorComboBox.Text && b.BrandName == brandSelectorComboBox.Text
select b.Number).SingleOrDefault();
txt_Inventory.Text = Query.ToString();
}



شما بهتره در جدول SaleTable یه دونه فیلد مبلغ بزاری (چون شما در جدول انبار دو فیلد ورودی و خروجی رو مشخص کردی دیگر لازم نیست)
به دلیل اینکه نیازه بعداً اطلاع داشته باشیم که این کالا با چه مبلغی فروخته شده!

و در جدول FactorTable یه فیلد برای نوع فاکتور اضافه کنی بهتره(به واسطه مقدار این فیلد شما میتونی فاکتورهای خودتو تفکیک کنی)
چرا نیاز میشه که فاکتور دسته بندی بشه؟!

ژیار رحیمی
سه شنبه 03 شهریور 1394, 07:37 صبح
به شما توصیه شد که از ValueChange کامبوباکس استفاده کنی باز رفتی سراغ TextChange

در پست قبلی توضیح داده شد که چه Property هایی از ComboBox رو ست کنی .
تو رویداد Form_Load کامبوباکس نام کالا مقدار دهی میشود

private void Form8_Load(object sender, EventArgs e)
{
LINQDataContext db = new LINQDataContext();
objectSelectorComboBox.DataSource = db.InventoryTables.Select(c => new { c.ID, c.ObjectName }).ToList();
objectSelectorComboBox.DisplayMember = "ObjectName";
objectSelectorComboBox.ValueMember = "ID";
}



تو رویداد ValueChange کامبوباکس کالا (پر کردن کامبوباکس برند)

private void objectSelectorComboBox_SelectedValueChanged(object sender, EventArgs e)
{
if ((int) objectSelectorComboBox.SelectedValue <= 0) return;
brandSelectorComboBox.DataSource = db.InventoryTables.Where(c => c.ID == (int)objectSelectorComboBox.SelectedValue)
.Select(c => new { c.ID, c.BrandName }).ToList();
brandSelectorComboBox.DisplayMember = "BrandName";
brandSelectorComboBox.ValueMember = "ID";
}


دوست گرامی شما میبایست یه جدول جدا واسه کالا میزاشتی ،یه جدول جدا واسه برندهای کالا میزاشتی و این دو جدول رو به هم ربط میدادی.و جدول اقلام فاکتور رو به جدول کالا ربط میدادی و همچنین جدول انبار رو به جدول کالا و جدول اقلام فاکتور ربط میدادی که مواذد گفته شده رو انجام ندادی و کل ماهیت فاکتور و اقلام و انبار رو در سه جدول خلاصه کردی هم دارای افزونگی هم دارای مشکل تحلیل میباشد.به باور من شما سیستمی که میخوای پیاده سازی کنی بصورت کاملا ضعیف تحلیل کردی بهتره سیستم رو دوباره تحلیل مجدد کرده و نواقص کارو جبران کنی.تا دیر نشده
شما بهتره یه post راهنمایی در بخش تحلیل و پیاده سازی بانک های اطلاعاتی فروم + جداول طراحی شده خوت رو بزاری تا دوستان درمورد طراحی جداول و کم و کاست آن راهنمایی کنند تا عیب و ایراد کار به حداقل برسه
نرم افزار خوب دارای تحلیل خوب و متناسب میباشد به پیشنهاد من از 40 روز باقی مانده رو 20 روز رو روی تحلیل و طراحی درست دیتابیس بزار در کنارش Linq to SQL خودتو بروز رسانی و کامل کن که واسه یه Query نوشتن های لازم وقت زیادی صرف نکنی.الان شما در نوشتن کویرهای ساده دچار مشکل شدی با این سطح کد نویسی فقط خودت اذیت میشی و زحماتی که روی پروژه میکشی آخرش به شکست میخوره.(خلاصه امیدوارم از حرفام ناراحت نشده باشی ).

hadimtn
سه شنبه 03 شهریور 1394, 20:31 عصر
به شما توصیه شد که از ValueChange کامبوباکس استفاده کنی باز رفتی سراغ TextChange

در پست قبلی توضیح داده شد که چه Property هایی از ComboBox رو ست کنی .
تو رویداد Form_Load کامبوباکس نام کالا مقدار دهی میشود

private void Form8_Load(object sender, EventArgs e)
{
LINQDataContext db = new LINQDataContext();
objectSelectorComboBox.DataSource = db.InventoryTables.Select(c => new { c.ID, c.ObjectName }).ToList();
objectSelectorComboBox.DisplayMember = "ObjectName";
objectSelectorComboBox.ValueMember = "ID";
}
خب اینجوری اگه Query بگیریم کالاهای تکرای هم تو لیست میاد، اگه تکراری‌ها رو حذف کنیم مشکلی پیش نمیاد؟
در ضمن اگه دقت کرده باشین من یک گزینه ی انتخاب کنید رو نشون میدم، تو این Query چه جوری رشته ی مورد نظر رو Insert کنم؟!
کمبوباکس ها از یه جدول دیگه که کالاهای ثبت شده در سیستم میباشد پر میشوند. حال تحلیل اشتباه من به کنار،




تو رویداد ValueChange کامبوباکس کالا (پر کردن کامبوباکس برند)

private void objectSelectorComboBox_SelectedValueChanged(object sender, EventArgs e)
{
if ((int) objectSelectorComboBox.SelectedValue <= 0) return;
brandSelectorComboBox.DataSource = db.InventoryTables.Where(c => c.ID == (int)objectSelectorComboBox.SelectedValue)
.Select(c => new { c.ID, c.BrandName }).ToList();
brandSelectorComboBox.DisplayMember = "BrandName";
brandSelectorComboBox.ValueMember = "ID";
}

TextChange هم یه رویداده دیگه :لبخند:
گفتم قبلاً اینجوری استفاده می‌کردم؛ وگرنه در تاپیک ComboBoxهای مرتبط (http://barnamenevis.org/showthread.php?504164-%D8%A7%DB%8C%D8%B1%D8%A7%D8%AF-%D8%AF%D8%B1-ComboBox%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%AA%D8%A8%D8%B7!-(LINQ)) دوستان راهنمایی کردن. منتها سر این جواب نگرفتن‌ها راه و روش‌های مختلفی رو امتحان می‌کنم که کدها بهم میریزه!


دوست گرامی شما میبایست یه جدول جدا واسه کالا میزاشتی ،یه جدول جدا واسه برندهای کالا میزاشتی و این دو جدول رو به هم ربط میدادی.و جدول اقلام فاکتور رو به جدول کالا ربط میدادی و همچنین جدول انبار رو به جدول کالا و جدول اقلام فاکتور ربط میدادی که مواذد گفته شده رو انجام ندادی و کل ماهیت فاکتور و اقلام و انبار رو در سه جدول خلاصه کردی هم دارای افزونگی هم دارای مشکل تحلیل میباشد.به باور من شما سیستمی که میخوای پیاده سازی کنی بصورت کاملا ضعیف تحلیل کردی بهتره سیستم رو دوباره تحلیل مجدد کرده و نواقص کارو جبران کنی.تا دیر نشده
شما بهتره یه post راهنمایی در بخش تحلیل و پیاده سازی بانک های اطلاعاتی فروم + جداول طراحی شده خوت رو بزاری تا دوستان درمورد طراحی جداول و کم و کاست آن راهنمایی کنند تا عیب و ایراد کار به حداقل برسه
نرم افزار خوب دارای تحلیل خوب و متناسب میباشد به پیشنهاد من از 40 روز باقی مانده رو 20 روز رو روی تحلیل و طراحی درست دیتابیس بزار در کنارش Linq to SQL خودتو بروز رسانی و کامل کن که واسه یه Query نوشتن های لازم وقت زیادی صرف نکنی.الان شما در نوشتن کویرهای ساده دچار مشکل شدی با این سطح کد نویسی فقط خودت اذیت میشی و زحماتی که روی پروژه میکشی آخرش به شکست میخوره.(خلاصه امیدوارم از حرفام ناراحت نشده باشی ).
ممنون که راهنمایی کردین؛ بنده در مورد ارتباط جداول چیزی نمیدونم به همین خاطر همه ی جدول‌ها مستقل هستند. دو نوع ارتباط در کلاس LINQ وجود داره که هیچکدوم رو پی نگرفتم.
فعلاً قصد دارم که این پروژه فقط کار کنه تا تحویل بدم، نسخه‌های بعدی روشون بیشتر کار میکنم!

تاپیک تحلیل هم یه سر بزنید (http://barnamenevis.org/showthread.php?505925-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%A8%D9%87%DB%8C%D9%86%D9%87%E2%80%8C%D8%B3%D8%A 7%D8%B2%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87%E2%80%8C%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B4%D8%AF%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D9%81%D8%B1%D9%88%D8%B4-%DA%A9%D8%A7%D9%84%D8%A7-(%D8%AA%D8%AD%D8%AA-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2%D8%8C-%D8%A8%D8%B3%DB%8C%D8%A7%D8%B1-%D8%B3%D8%A7%D8%AF%D9%87)&p=2256535#post2256535)

hadimtn
سه شنبه 03 شهریور 1394, 21:18 عصر
در ادامه‌ی پست قبلی.
روند کلی کار به این شکله:
1. تعریف کالا در سامانه

134630

2. ثبت کالای خریداری شده در انبار

134631

3. فروش کالا

134632