PDA

View Full Version : سوال: شماره فاکتور



mohsenmxp
یک شنبه 26 خرداد 1392, 13:41 عصر
سلام
روی یک پروژه ی حسابداری کار مینکم

کاربر هر فاکتور رو با N قلم جنس وارد میکنه

و کل اجناس در یک جدول ذخیره میشه

به نظر شما از ترکیب ساعت و تاریخ به عنوان شماره فاکتور استفاده کردن کار درستی هست؟

مثلا : 920326143800

شما چه پیشنهاد میکنید؟

amir_pro
یک شنبه 26 خرداد 1392, 13:51 عصر
میتونی از یه فیلد استفاده کنی که از 20000 مثلا شروع بشه و بعد از هر ثبت فاکتوری به این فیلد یکی استفاده کن

davidrobert
یک شنبه 26 خرداد 1392, 14:25 عصر
میتونه به وسیله این کد اخرین شماره فاکتور رو به دست بیاری و با ثبت هر رکورد به شماره به رکورد قبلی اضافه میشه. من این رو برای کد خدمات انجام دادم و اخرین کد خدمات رو میده و شماره سند تو یکی از پروزه هام انجام دادم جواب داده.
کد مربوط به دیتابیس برای خواندن آخرین شماره که وجود نداره در دیتابیس. یعنی اگه تو دیتابیس عدد 1 باشه سیستم عدد 2 رو نشان میده.
public string newid()
{

string Atcnt;
SqlCommand DTCmd = new SqlCommand();
SqlConnection DTCon = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DbPoshak.mdf;Integrated Security=True;User Instance=True");
DTCon.Open();
DTCmd.CommandType = CommandType.Text;
DTCmd.CommandText = "select max(SF_CodeKHedeMat) from TblAddFactRecKhedeMatErviec";
DTCmd.Connection = DTCon;
Atcnt = Convert.ToString(DTCmd.ExecuteScalar());
DTCon.Close();
return Atcnt;

}
کد مربوط به به اوردن اخرین شماره از دیتابیس که وجود نداره.
TxtDoc.Text = "";
int NewId = 1;
string strnewid = " ";
object obj = db.newid();
if (obj.ToString() != "")
{
NewId = Convert.ToInt32(obj.ToString()) + 1;
strnewid = NewId.ToString();
strnewid = strnewid.PadLeft(1, '0');
TxtDoc.Text = strnewid;
}
else
{
TxtDoc.Text = "0";
}
این رو در فرم لود قرار بده و وقتی سیستم بالا امد به هت نشان میده این طوری بهتر هستش و شماره فاکتور تکراری هم نداری.

tooraj_azizi_1035
یک شنبه 26 خرداد 1392, 14:58 عصر
MAX+1 نمی تونه ایده خوبی باشه چون دو نفر همزمان می تونن MAX رو بگیرن و سعی کنند شماره فاکتور یکسان درج کنند.
باید سعی کنید از IDENTITY Column استفاده کنید. خودش یکی یکی اضافه می کنه.

mohsenmxp
یک شنبه 26 خرداد 1392, 15:24 عصر
MAX+1 نمی تونه ایده خوبی باشه چون دو نفر همزمان می تونن MAX رو بگیرن و سعی کنند شماره فاکتور یکسان درج کنند.
باید سعی کنید از IDENTITY Column استفاده کنید. خودش یکی یکی اضافه می کنه.

خیلی ممنون از راهنمایینون

برای رکورد های این فاکتور چه پیشنهادی دارید؟ چون من تمام فاکتور ها با شماره ی خاص خودشون رو تو یک جدول میریزم مثلا اگه هر فاکتور 4 قلم باشه همه ی 4 قلم در فیلد شماره فاکتور مقدار برابر دارن اما چطور می تونم معیار شماره گذاری برای هر کدام از این رکورد ها (اقلام) در نظر بگیرم؟

davidrobert
یک شنبه 26 خرداد 1392, 19:47 عصر
میتونه به وسیله این کد اخرین شماره فاکتور رو به دست بیاری و با ثبت هر رکورد به شماره به رکورد قبلی اضافه میشه. من این رو برای کد خدمات انجام دادم و اخرین کد خدمات رو میده و شماره سند تو یکی از پروزه هام انجام دادم جواب داده.
کد مربوط به دیتابیس برای خواندن آخرین شماره که وجود نداره در دیتابیس. یعنی اگه تو دیتابیس عدد 1 باشه سیستم عدد 2 رو نشان میده.
public string newid()
{

string Atcnt;
SqlCommand DTCmd = new SqlCommand();
SqlConnection DTCon = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DbPoshak.mdf;Integrated Security=True;User Instance=True");
DTCon.Open();
DTCmd.CommandType = CommandType.Text;
DTCmd.CommandText = "select max(SF_CodeKHedeMat) from TblAddFactRecKhedeMatErviec";
DTCmd.Connection = DTCon;
Atcnt = Convert.ToString(DTCmd.ExecuteScalar());
DTCon.Close();
return Atcnt;

}
کد مربوط به به اوردن اخرین شماره از دیتابیس که وجود نداره.
TxtDoc.Text = "";
int NewId = 1;
string strnewid = " ";
object obj = db.newid();
if (obj.ToString() != "")
{
NewId = Convert.ToInt32(obj.ToString()) + 1;
strnewid = NewId.ToString();
strnewid = strnewid.PadLeft(1, '0');
TxtDoc.Text = strnewid;
}
else
{
TxtDoc.Text = "0";
}
این رو در فرم لود قرار بده و وقتی سیستم بالا امد به هت نشان میده این طوری بهتر هستش و شماره فاکتور تکراری هم نداری.
شما می توانید از این کد من استفاده کنید و اگه به وسیله دیتاگرید اطلاعاترو ذخیر ه میکنید. به وسیله این دستور همون شماره فاکتور رو داخل دیتاگرید قرار بدید خودش مشماره فاکتور جدید رو در داخل دیتاگرید میرزه و معلوم میشه کدام جنس با کدام شماره فاکتور فروخته شده. dataGridViewX1.CurrentRow.Cells["A_Foc"].Value = (Convert.ToInt32(LblDoc.Text) + 1000).ToString(); من اخرین شماره فاکتور و 1000 گذاشتم هی به هش یکی یکی اضافه میشه.

mehrtash3000
دوشنبه 27 خرداد 1392, 01:34 صبح
دوستمون tooraj_azizi_1035 (http://barnamenevis.org/member.php?41757-tooraj_azizi_1035)
ایده خوبی دادند.
این جور کارها رو حتما باید تو یک stored procedure انجام بدی اگر داری max میگیری و +1 میکنی کل این عمل رو تو یک transaction با isolation level serializable انجام بده .
یا میتونی در هنگام ایجاد فاکتور و قتی کاربر کلید ایجاد فاکتور جدید رو زد یک رکورد insert و تو همون جا و داخل sp
scope_identity رو برگردونی . حالا وقتی کاربر اقلامرو وارد کرد و کلید ثبت رو زد اونوقت یکسری اطلاعات مربوط به فاکتور رو update و اقلام زیر مجموعه رو تو جدول detail - insert کنی.

اینطوری هزاران کاربر هم که با هم فاکتور بزنند .شماره فاکتور تکراری نخواهی داشت

tooraj_azizi_1035
دوشنبه 27 خرداد 1392, 10:47 صبح
مایکروسافت در این لینک (http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx)گفته شما باید SCOPE_IDENTITY() رو پس از عمل درج SELECT کنید. و البته وقتی کاربر دکمه + رو برای اضافه کردن زد چون هنوز ذخیره نکرده تا معلوم شه مقدار واقعی که به شما اختصاص یافته در حد فاصل زدن دکمه + و کلیک دکمه Save چی هست چون خیلی ها در این فاصله می تونن عمل درج انجام داده باشن و دیگه شماره ای که به شما برنامه داده توسط دیگر کاربران استفاده شده، شما یک Warning به کاربرتون بدید شاید به شکل بالون که این شماره تا Save شدن نباید قطعی محسوب بشه و جایی ثبت بشه.
یعنی دستور INSERT اینطوری میشه:

adapter.InsertCommand = new SqlCommand(
"INSERT INTO dbo.Shippers (CompanyName) " +
"VALUES (@CompanyName); " +
"SELECT ShipperID, CompanyName FROM dbo.Shippers " +
"WHERE ShipperID = SCOPE_IDENTITY();", connection);