PDA

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



bmvgod
یک شنبه 28 بهمن 1397, 21:33 عصر
باسلام خدمت دوستان و بزرگواران
تو پروژم یک کنترل با نام txtNumber دارم که یک عدد از کاربر میگیره و از فیلد ستون CompanyName کم کنه.
اومدم شرطی گذاشتم که اگه کد محصولی (txtSaleCodCommodity) با توجه به محصولی که کاربر انتخاب میکنه پر میشه،اگر با کد محصول دیتابیس (CommodCod) برابر بود اون تعدادی که کاربر وارد کرده رو از تعداد محصولی که کاربر انتخاب کرده کسر کنه.
من از کد زیر استفاده کردم:

if (btnInsert.Text == "درج")
{
db = new LinqToTrazoDataContext();

int Numbertxt = int.Parse(txtNumber.Text), NumberTbl;
string CommodCodTab;

var TabCom = new CommoTable();
CommodCodTab = TabCom.CommodCod;
NumberTbl = Convert.ToInt16(TabCom.CommodNumb);

if (txtSaleCodCommodity.Text == TabCom.CommodCod)
{
NumberTbl = NumberTbl - Numbertxt;
TabCom.CommodNumb = Convert.ToInt16(NumberTbl);
db.CommoTables.InsertOnSubmit(TabCom);
db.SubmitChanges();
}
}


ولی نمیدونم چرااز دیتابیسم کم نمیکنه.
ممنون میشم بهم بگین ایراد کارم کجاست و از چه کدی باید استفاده کنم.
باتشکر از تمام دوستان

Mahmoud.Afrad
دوشنبه 29 بهمن 1397, 14:05 عصر
شما داری رکورد جدید درج می کنی در صورتی که باید جستجو کنید و رکورد را بدست بیارید و مقدار را بروزرسانی کنید

bmvgod
دوشنبه 29 بهمن 1397, 22:57 عصر
شما داری رکورد جدید درج می کنی در صورتی که باید جستجو کنید و رکورد را بدست بیارید و مقدار را بروزرسانی کنید

یعنی از همچین کدی استفاده کنم:

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q;


اگه از همچین دستوری استفاده کنم، میشه راهنماییم بفرمایی که از چه کدی باید استفاده کنم که از تعداد کالای دیتابیس انبارم کم کنه؟
ممنون میشم راهنماییم کنید از چه کدی استفاده کنم؟
ممنون میشم

bmvgod
چهارشنبه 01 اسفند 1397, 16:46 عصر
یعنی از همچین کدی استفاده کنم:

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q;


اگه از همچین دستوری استفاده کنم، میشه راهنماییم بفرمایی که از چه کدی باید استفاده کنم که از تعداد کالای دیتابیس انبارم کم کنه؟
ممنون میشم راهنماییم کنید از چه کدی استفاده کنم؟
ممنون میشم


ممنون میشم کسی بتونه راهنماییم کنه

mr.sirwan
چهارشنبه 01 اسفند 1397, 16:54 عصر
شما چجوری یه رکورد رو ویرایش میکنی؟ اینم دقیقا همون قضیه ست، کدی که برای ویرایش یک رکورد استفاده میکنی رو بذار تا راهنماییت کنیم

bmvgod
شنبه 04 اسفند 1397, 00:35 صبح
شما چجوری یه رکورد رو ویرایش میکنی؟ اینم دقیقا همون قضیه ست، کدی که برای ویرایش یک رکورد استفاده میکنی رو بذار تا راهنماییت کنیم


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


SelectedIndexId = int.Parse(dgvSalesInvoi.CurrentRow.Cells["RowFact"].Value.ToString());
db = new LinqToTrazoDataContext();
var fcTableEdit = db.FactorSaleTables.Where(c=>c.RowFact==SelectedIndexId).Single();
fcTableEdit.CommodCodFact = txtSaleCodCommodity.Text;
fcTableEdit.CommodName = cmbCommodityName.Text;
fcTableEdit.CompanyName = txtNameCO.Text;
fcTableEdit.Number = Int16.Parse(txtNumber.Text);
fcTableEdit.TotalPrice = float.Parse(txtTotalPrice.Text);
fcTableEdit.Weight = float.Parse(txtWeight.Text);
fcTableEdit.TotalWeight = float.Parse(txtTotalWeight.Text);
fcTableEdit.CommodSize = cmbSiz.Text;
fcTableEdit.UnitPrice = float.Parse(txtUnitPrice.Text);
fcTableEdit.Tax = float.Parse(txtTax.Text);
fcTableEdit.Dicount = float.Parse(txtTax.Text);
db.SubmitChanges();

mr.sirwan
شنبه 04 اسفند 1397, 20:23 عصر
خب دیگه دقیقا همینطوری عمل میکنی اول باید رکورد موردنظرتو واکشی کنی بعد اون فیلدی که مدنظرت هست رو ویرایش میکنی و تمام، به این شکل:
SelectedIndexId = int.Parse(dgvSalesInvoi.CurrentRow.Cells["TabComId"].Value.ToString());
db = new LinqToTrazoDataContext();

var TabCom = db.CommoTables.SingleOrDefault(c => c.Id == SelectedIndexId);

if(TabCom != null)
{
TabCom.CommodNumb -= Convert.ToInt16(NumberTbl);
db.SubmitChanges();
}

bmvgod
شنبه 04 اسفند 1397, 22:21 عصر
خب دیگه دقیقا همینطوری عمل میکنی اول باید رکورد موردنظرتو واکشی کنی بعد اون فیلدی که مدنظرت هست رو ویرایش میکنی و تمام، به این شکل:
SelectedIndexId = int.Parse(dgvSalesInvoi.CurrentRow.Cells["TabComId"].Value.ToString());
db = new LinqToTrazoDataContext();

var TabCom = db.CommoTables.SingleOrDefault(c => c.Id == SelectedIndexId);

if(TabCom != null)
{
TabCom.CommodNumb -= Convert.ToInt16(NumberTbl);
db.SubmitChanges();
}



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


CommoTable codeTbable = new CommoTable
{
CommodName = txtCommodName.Text,
CommodGenre = txtCommodGenre.Text,
CommodSize = txtCommodSize.Text,
CompanyName = txtCo.Text,
CommodNumb = Convert.ToInt16(txtCommodNume.Text),
CommodWeight = float.Parse(txtCommodWeight.Text) ,
CommodTotal = float.Parse(txtCommodTotal.Text),
UnitPrice = Int16.Parse(txtUnitPrice.Text),
Dicount = byte.Parse(txtDicount.Text),
Tax = Int16.Parse(txtTax.Text),
};
db.SubmitChanges();

mr.sirwan
شنبه 04 اسفند 1397, 22:36 عصر
در هر حال روال به همون صورتیه که گفتم: 1. واکشی رکورد موردنظر (حالا به هر طریقی) 2. ویرایش از طریق کدی که نوشتم 3. ذخیره تغییرات

bmvgod
شنبه 04 اسفند 1397, 22:48 عصر
در هر حال روال به همون صورتیه که گفتم: 1. واکشی رکورد موردنظر (حالا به هر طریقی) 2. ویرایش از طریق کدی که نوشتم 3. ذخیره تغییرات

از طریق کد زیر سعی دارم رکود مورد نظرمو واکشی کنم:

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;


و با کد زیر تغییراتو انجام و اعمال کنم:

if (tab != null)
{
TabCom.CommodNumb -= Convert.ToInt16(NumberTbl);
db.SubmitChanges();
}


ولی کجای کدم اشتباه هست که روی جدول انبارم اعمال نمیشه نمیدونم؟

alexmcse
یک شنبه 05 اسفند 1397, 13:33 عصر
از طریق کد زیر سعی دارم رکود مورد نظرمو واکشی کنم:

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;


و با کد زیر تغییراتو انجام و اعمال کنم:

if (tab != null)
{
TabCom.CommodNumb -= Convert.ToInt16(NumberTbl);
db.SubmitChanges();
}


ولی کجای کدم اشتباه هست که روی جدول انبارم اعمال نمیشه نمیدونم؟

تست کنید

foreach (var VARIABLE in tab) {


VARIABLE .CommodNumb -= Convert.ToInt32( NumberTbl);
db.SubmitChanges();
}

mr.sirwan
یک شنبه 05 اسفند 1397, 14:05 عصر
چک کنید که اصلا کالایی واکشی میشه یا خیر؟

bmvgod
یک شنبه 05 اسفند 1397, 23:49 عصر
تست کنید

foreach (var VARIABLE in tab) {


VARIABLE .CommodNumb -= Convert.ToInt32( NumberTbl);
db.SubmitChanges();
}

کلا کد به این صورت شد:

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;
foreach (var r in tab)
{
r.CommodNumb -= Convert.ToInt32(NumberTbl);
db.SubmitChanges();
}


ولی از خط بعد foreach از کلمه CommodNumb خطا میگیره و متن خطا اینه:


int' does not contain a definition for 'CommodNumb' and no extension method 'CommodNumb' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?)


ممنون میشم راهنماییم کنید که این کد رو چجوری درست کنم که خروجی بده.
با تشکر از تمامی دوستان

alexmcse
دوشنبه 06 اسفند 1397, 16:17 عصر
var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;
foreach (var r in tab)
{
var n = r.CommodNumb;


n=n-Convert.ToInt32(NumberTbl);
r.CommodNumb = n;
db.SubmitChanges();
}

bmvgod
دوشنبه 06 اسفند 1397, 21:41 عصر
var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;
foreach (var r in tab)
{
var n = r.CommodNumb;


n=n-Convert.ToInt32(NumberTbl);
r.CommodNumb = n;
db.SubmitChanges();
}

از CommodNumb ایراد میگیره:
149834

خطای زیر رو میده:
149835

وقتی بعد از r دات میزنم تو لیست اسمی از CommodNumb نیست:
149836

کلا بخش اول کدی که مربوط به درج میشه بصورت زیره:

private void btnInsert_Click(object sender, EventArgs e)
{
if (btnInsert.Text == "درج")
{
db = new LinqToTrazoDataContext();
int Numbertxt = int.Parse(txtNumber.Text);
Int16 NumberTbl;
var TabCom = new CommoTable();
NumberTbl =Convert.ToInt16( TabCom.CommodNumb);

var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q.RowCommo;

foreach (var r in tab)
{
var n = r.CommodNumb;
n = n - Convert.ToInt16( NumberTbl);
r.CommodNumb = n;
db.SubmitChanges();
}
var fcTable = new FactorSaleTable();

fcTable.SaleDate = DateTime.Now;
fcTable.FactorNo = int.Parse(txtCodFactor.Text);
fcTable.CommodCodFact = txtSaleCodCommodity.Text;
fcTable.CommodName = cmbCommodityName.Text;
fcTable.CompanyName = txtNameCO.Text;
fcTable.Number = Int16.Parse(txtNumber.Text);
fcTable.TotalPrice = float.Parse(txtTotalPrice.Text);
fcTable.Weight = float.Parse(txtWeight.Text);
fcTable.TotalWeight = float.Parse(txtTotalWeight.Text);
fcTable.CommodSize = cmbSiz.Text;
fcTable.UnitPrice = float.Parse(txtUnitPrice.Text);
fcTable.Tax = float.Parse(txtTax.Text);
fcTable.Dicount = float.Parse(txtTax.Text);


db.FactorSaleTables.InsertOnSubmit(fcTable);
db.SubmitChanges();
dgvSalesInvoi.DataSource = db.FactorSaleTables;
}


ممنون میشم از دوستان راهنماییم کنن که چجوری این مشکلو حل کنم
با تشکر از تمامی دوستان

Mahmoud.Afrad
دوشنبه 06 اسفند 1397, 22:15 عصر
q را بایست سلکت کنید.

//...
select q;

bmvgod
دوشنبه 06 اسفند 1397, 23:26 عصر
q را بایست سلکت کنید.

//...
select q.;


ممنون حل شد.
ولی ازین دو خط ایراد میگیره:

n = n - Convert.ToInt16( NumberTbl);
db.SubmitChanges();

متن خطا هم بصورت زیره:
149837
خطای دومی برا خط اول کده و هشدار اولی برا خط دوم کده
ممنون میشم راهنماییم کنید که چکار باید بکنم.
باتشکر از تمامی دوستان

رامین مرادی
سه شنبه 07 اسفند 1397, 08:19 صبح
خب از خطا مشخصه که نمیتونه تبدیلات رو انجام بده. همیشه مقدار خالی یا null بودنو قبل از انجام عمل محاسباتی در نظر بگیرید با یه if ساده.

Shadow_net
سه شنبه 07 اسفند 1397, 18:07 عصر
ممنون حل شد.
ولی ازین دو خط ایراد میگیره:

n = n - Convert.ToInt16( NumberTbl);
db.SubmitChanges();

متن خطا هم بصورت زیره:
149837
خطای دومی برا خط اول کده و هشدار اولی برا خط دوم کده
ممنون میشم راهنماییم کنید که چکار باید بکنم.
باتشکر از تمامی دوستان
توی دیتابیس int گذاشتید و اینجا int16 یا همون short
تبدیل رو روی ToInt32 قرار بدید

int? a = 12;
int b = Convert.ToInt32(a);

bmvgod
سه شنبه 07 اسفند 1397, 22:52 عصر
توی دیتابیس int گذاشتید و اینجا int16 یا همون short
تبدیل رو روی ToInt32 قرار بدید

int? a = 12;
int b = Convert.ToInt32(a);


توی دیتابیس فیلد CoomodNumb روی smallint گذاشتم، مقایسه کردم نوع متغییر دیتابیس رو با سی شارپ از نظر بازه عددی smsllint برابر Int16 تو سی شارپ میشه.
با این شیوه تبدیل Type چجوری میشه؟
ممنون میشم راهنماییم کنید

bmvgod
چهارشنبه 08 اسفند 1397, 00:18 صبح
توی دیتابیس int گذاشتید و اینجا int16 یا همون short
تبدیل رو روی ToInt32 قرار بدید

int? a = 12;
int b = Convert.ToInt32(a);


برای تبدیل Type تو سی شارپ برا اینکه نوع داده فیلد CommodNum از نوع Smallint باشه نتونستم تبدیل Type انجام بدم که خطا نگیره و تین نکته برا من مهمه که smallint باشه، چکار باید کنم نمیدونم؟
برا اینکه کارم راه بیفنه CommodNum از نوع int گذاشتمو کدم بصورت زیر درومد:

db = new LinqToTrazoDataContext();
Int32 Numbertxt = int.Parse(txtNumber.Text);
var TabCom = new CommoTable();
NumberTbl =Convert.ToInt32( TabCom.CommodNumb);
var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q;
if (tab != null)
{
foreach (var ry in tab)
{
var n = ry.CommodNumb;
n = n - Numbertxt;
//n=TabCom.CommodNumb - Numbertxt;
ry.CommodNumb = n;
db.SubmitChanges();
}
}


ممنون میشم راهنماییم کنید مشکل تبدیل Type تو #C برای Smallint چجوری انجام بدم؟
از نوع Int16 هم میزارم باز گیر میده
باتشکر از نمامی دوستان

Mahmoud.Afrad
چهارشنبه 08 اسفند 1397, 00:29 صبح
برای تبدیل Type تو سی شارپ برا اینکه نوع داده فیلد CommodNum از نوع Smallint باشه نتونستم تبدیل Type انجام بدم که خطا نگیره و تین نکته برا من مهمه که smallint باشه، چکار باید کنم نمیدونم؟
برا اینکه کارم راه بیفنه CommodNum از نوع int گذاشتمو کدم بصورت زیر درومد:

db = new LinqToTrazoDataContext();
Int32 Numbertxt = int.Parse(txtNumber.Text);
var TabCom = new CommoTable();
NumberTbl =Convert.ToInt32( TabCom.CommodNumb);
var tab = from q in db.CommoTables
where txtSaleCodCommodity.Text == q.CommodCod
select q;
if (tab != null)
{
foreach (var ry in tab)
{
var n = ry.CommodNumb;
n = n - Numbertxt;
//n=TabCom.CommodNumb - Numbertxt;
ry.CommodNumb = n;
db.SubmitChanges();
}
}


ممنون میشم راهنماییم کنید مشکل تبدیل Type تو #C برای Smallint چجوری انجام بدم؟
از نوع Int16 هم میزارم باز گیر میده
باتشکر از نمامی دوستان

خط 3و4 اصلا برای چی هست؟!! حذفش کنید.

shahryari
چهارشنبه 08 اسفند 1397, 12:05 عصر
سلام دوست عزیز
سناریو کسر و اضافه کردن به انبار این مدلی نیست که شما بخای هربار یه عددی رو در بانک آپدیت کنید 2 تا روش من کار کردم تابحال
1 - یه ستون باید داشته باشید با عنوان "وارده" و یه فیلد هم "صادره"
هربار جنس اومد = ستون وارده مقدارش ثبت میشه و در ستون صادره مقدار صفر
هربار جنس رفت = ستون صادره مقدارش ثبت میشه و در ستون وارده مقدار صفر
با تابع sum در sql جمع هردو ستون رو میگیری وارده رو منهای صادره میکنی

2- کلا یه ستون در نظر میگیری برای مقدار ، اگر جنس خارج شد مقدارش منفی و اگر وارد شد همون مقدار رو مینویسی بعد با تابع sum کل موجودی رو میده ، هر رکوردی هم حذف بشه یا اضافه بشه موجودی و به راحتی میتونی بگیری