PDA

View Full Version : شماره دادن اتوماتیک



sanazbegmaz
چهارشنبه 14 بهمن 1388, 14:09 عصر
سلام
من دارم یه پروزه می نویسم در باره صندوق قرض الحسنه.
می خوام وقتی مشخصات کاربر رو وارد کردم و دکمه ثبت رو زدم یه شماره به صورت اتوماتیک (به عنوان شماره حساب) تو سیستم ثبت بشه.
لطفا راهنمایی کنید چطور این کار رو انجام بدم.
ممنون

mehdi.mousavi
چهارشنبه 14 بهمن 1388, 14:52 عصر
سلام من دارم یه پروزه می نویسم در باره صندوق قرض الحسنه. می خوام وقتی مشخصات کاربر رو وارد کردم و دکمه ثبت رو زدم یه شماره به صورت اتوماتیک (به عنوان شماره حساب) تو سیستم ثبت بشه. لطفا راهنمایی کنید چطور این کار رو انجام بدم. ممنون

سلام.
در طراحی جداول در بانک، اگر از SQL Server استفاده میکنید میتونید فیلد رو IDENTITY تعریف کنید. اگر از MS-Access استفاده میکنید، میتونید اونو Auto Number بذارید. وقتی اینکارو کنید، اگر ردیف جدیدی به چنین جدولهایی اضافه بشه، فیلد مزبور بطور خودکار توسط RDBMS یک شناسه جدید میگیره...

موفق باشید.

پاورقی: اگر با بخش خاصی در این روند، مشکلی دارید، بفرمایید تا پاسخ بدم.

sanazbegmaz
چهارشنبه 14 بهمن 1388, 21:27 عصر
ولی identity جزء type ها نبود معادلش چیه؟ sql 2008

aminh85
پنج شنبه 15 بهمن 1388, 09:02 صبح
این کدو قبلا گذاشته بودم ولی تاپیکت حذف شد. شماره اولین حسابو bold و سبز رنگ می کنم.


privatevoid GetMaxCode()
{
string ConnectionString = "server=localhost;database=iron;user id=sa;password=zhs123;";
SqlConnection objConnection;
objConnection = newSqlConnection(ConnectionString);
int intMaxID;
String strID;
SqlCommand objCommand = newSqlCommand();
SqlCommand maxIdCommand = newSqlCommand("SELECT MAX(intccode) FROM tblcustomer", objConnection);
if (objConnection.State == ConnectionState.Closed)
objConnection.Open();
Object maxId = maxIdCommand.ExecuteScalar();
if (maxId == DBNull.Value)
{
intMaxID = 1001;
}
else
{
strID = Convert.ToString(maxId);
intMaxID = int.Parse(strID);
intMaxID += 1;
}
txtcode.Text = Convert.ToString(intMaxID);
objConnection.Close();
}

csharpprogramer88
پنج شنبه 15 بهمن 1388, 10:20 صبح
سلام دوست عزیز با این کد می تونی بزرگترین id را از جدولت پیدا کنی و یکی به اون اضافه کنی تازه اگه جدول خالی باشه هم از یک شروع می کنه


private int getmaxnumber()
{
string strmax = "select max(id) from amaken_city";
cmd = new SqlCommand();
cmd.CommandText = strmax;
cmd.Connection = con;
// con.Open();
try
{
return ((int)cmd.ExecuteScalar()) + 1;
}
catch
{
return 1;
}

}


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


txtid.Text = getmaxnumber().ToString();

mehdi.mousavi
پنج شنبه 15 بهمن 1388, 11:45 صبح
ولی identity جزء type ها نبود معادلش چیه؟ sql 2008

سلام.
تایپش رو باید int بذارید، بعد اون پایین توی Indetity Specification، باید IsIdentity رو Yes بذارید!

موفق باشید.

SMRAH1
پنج شنبه 15 بهمن 1388, 12:00 عصر
سلام
من استفاده از کد هایی که aminh85 (http://barnamenevis.org/forum/member.php?u=133971) و csharpprogramer88 (http://barnamenevis.org/forum/member.php?u=114157) گذاشته اند رو توصیه نمی کنم!هر چند این کد ها به ظاهر کار می کنند ولی یک مشکل مهم دارند.این کد ها بر این مبنی کار می کنند:
1) آخرین شماره قبلی رو دریافت کن
2) یکی به قبلی اضافه کن و به عنوان شماره جدید قرار بده
3) اگر شماره ای به عنوان آخرین شماره وجود نداره،شماره گذاری رو از اول (که در مثال های بالا به ترتیب 1001 و در یک دیگه از 1 ) شروع کن.
که یک مشکل بزرگ دارند.در بدترین سناریوی موجود ، اگر دوکاربر بخواهند همزمان یک رکورد جدید به پایگاه داده اضافه کنند چه خواهد شد : هردو بزرگترین شماره قبلی رو مثل هم دریافت می کنند و در نتیجه شماره یکسانی برای شماره جدید تولید می کنند!

اما بهترین سناریو همان توصیه جناب mehdi.mousavi (http://barnamenevis.org/forum/member.php?u=41233) است.در واقع باید وظیفه افزودن به شماره رو به پایگاه داده محول کنی (اگر دو نفر همزمان بخواهند رکورد ثبت کنند ،پایگاه داده مقدار مناسب را برای هر کدام تولید می کندد چون خودش می داند ،آخرین شماره چه بوده است).همچنین جناب موسوی راهنمایی لازم رو انجام دادن (اگر از اکسس استفاده می کنی نوع فیلدت رو Autonumber بگذار و اگر از SQLSerrver استفاده می کنی ،نوع فیلدت رو bigint بگذار و بعد در جدول پایین آن IDENTITYرو Yes کن).
موفق باشی

aminh85
پنج شنبه 15 بهمن 1388, 12:11 عصر
سلام
من استفاده از کد هایی که aminh85 (http://barnamenevis.org/forum/member.php?u=133971) و csharpprogramer88 (http://barnamenevis.org/forum/member.php?u=114157) گذاشته اند رو توصیه نمی کنم!هر چند این کد ها به ظاهر کار می کنند ولی یک مشکل مهم دارند...........
البته من با روشی که شما توصیه می کنی موافقم، ولی تا اونجایی که من اطلاع دارم این مشکل تقریبا به وجود نمیاد. چون هم خود SQLServer مدیریت صف درخواست های کاربرا رو انجام میده، و من هم موقع کدنویسی از transaction استفاده می کنم. البته من از این روش تو چنتا نرم افزاری که واسه سازمان های بزرگ نوشتم استفاده کردم با تعداد کاربر بالا، ولی چنین مشکلی بوجود نیومد. یه سوالی دارم، اگه مثلا شماره حسابها بخواد از بصورت 88ج1001 باشه که درعمل وجود داره(مثلا شماره نامه توی سیستم بایگانی یه اداره که بصورت 88/6/ص/1001 هست وشماره نامه بعدی 88/6/ص/1002) پیشنهاد شما چیه؟ با این روشی که من استفاده می کنم با یه تغییر کوچولو تو کد به راحتی شماره نامه بعدی بدست می یاد.

mehdi.mousavi
پنج شنبه 15 بهمن 1388, 13:25 عصر
البته من با روشی که شما توصیه می کنی موافقم، ولی تا اونجایی که من اطلاع دارم این مشکل تقریبا به وجود نمیاد. چون هم خود SQLServer مدیریت صف درخواست های کاربرا رو انجام میده، و من هم موقع کدنویسی از transaction استفاده می کنم. البته من از این روش تو چنتا نرم افزاری که واسه سازمان های بزرگ نوشتم استفاده کردم با تعداد کاربر بالا، ولی چنین مشکلی بوجود نیومد. یه سوالی دارم، اگه مثلا شماره حسابها بخواد از بصورت 88ج1001 باشه که درعمل وجود داره(مثلا شماره نامه توی سیستم بایگانی یه اداره که بصورت 88/6/ص/1001 هست وشماره نامه بعدی 88/6/ص/1002) پیشنهاد شما چیه؟ با این روشی که من استفاده می کنم با یه تغییر کوچولو تو کد به راحتی شماره نامه بعدی بدست می یاد.

درسته. اگر رکوردها رو بصورت Pessimistic قفل کنید، اونوقت میتونید مطمئن باشید که فقط و فقط یک کاربر در آن واحد با این رکورد کار میکنه. اما عموما اینگونه Lock ها هزینه بر هستش و در برنامه هایی که در دنیای واقعی نوشته میشه، ازشون دوری میکنن (مگر در موراد خیلی خاص)! روش بهتر، داشتن دید Optimistic به رکورد هستش. اگر چه نوشتن کد در چنین شرایطی دشوارتره، اما مطلقا قابل مقایسه با حالتی نیست که رکورد بصورت Pessimistic قفل شده و کسی دیگه اجازه کار کردن با اونو نداره. گذشته از این، تو روش Pessimistic باید خیلی حواستون جمع Deadlock ها باشه چون براحتی میتونید توی تله بیفتید...

موفق باشید.

پاورقی: من استفاده از Identity رو ترجیح میدم. برای تولید رکورد بعدی در حالیکه NVARCHAR تعریف شده باشه، میشه (یا بهتره بگم بهتره) از Middle Layer برنامه کمک گرفت...

mehdi.mousavi
پنج شنبه 15 بهمن 1388, 13:30 عصر
سلام دوست عزیز با این کد می تونی بزرگترین id را از جدولت پیدا کنی و یکی به اون اضافه کنی تازه اگه جدول خالی باشه هم از یک شروع می کنه


try
{
return ((int)cmd.ExecuteScalar()) + 1;
}
catch
{
return 1;
}

}



سلام.
میدونید این catch ای که نوشته اید، چقدر خطرناکه؟ مگر اینکه برنامه اتون رو برای .NET Framework 4 به بعد Compile کرده باشید! برای اطلاعات بیشتر توی Google دنبال Corrupted State Exceptions یا CSE جستجو کنید (مطلقا این مساله رو نادیده نگیرید).

موفق باشید.

seven7777777
پنج شنبه 15 بهمن 1388, 18:56 عصر
سلام

چند مساله :
1. اولا قالب این دی که قراره خودکار ایجاد بشه چه شکلیه ؟
2. کلا سعی کن هر چی می تونی بار کارهایی که مربوط به دیتابیس میشه رو دوش DBMS بزاری . پس من هم با استفاده از Identity موافق تر هستم .
3. اگر کدت قراره شکل خاصی داشته باشه اونوقت چاره ای جز ساختن اون کد نداری یعنی با برناه نویسی پس باید باز هم از روش Identity و اینبار با ساختن کد در برنامه استفاده کنی .
4. همیشه کد روبه کاربر پیشنهاد بده ( البته این نظر منه ) یعنی کاربر بتونه یه کد که بهش دادی رو خودش اگه خواست تغییر بده .
5. اگه کدت وابسته به پارامتر هست مثلا 1001ق ماله حساب های قرض الحسنه اونوقت کد رو ذخیره نکن بلکه موارد تاثیر گذار در کد رو در فیدهای جدا ثبت کن . این کار در آینده که ممکنه نوع حسابی تغییر کنه خیلی کمکت می کنه .

sanazbegmaz
سه شنبه 20 بهمن 1388, 21:27 عصر
سلام
من یک سوال خیلی واجب دارم .
توی پروژم یک شماره اتوماتیک دارم (sql 2008 ) که از طریق (big int,identity)ایجادش کردم. همین شماره اتوماتیک کلید جدولم هم هست.
این شماره وقتی ایجاد میشه که دکمه ثبت توسط کاربر فشرده بشه . حالا چطوری می تونم بعد از اینکه دکمه فشرده شد بلافاصله عدد ایجاد شده درون یک textbox توی همون فرم نمایش داده بشه ؟
لطططططططططططططططططططططططط طفا کمککککککککککککک.

hojjatshariffam
یک شنبه 05 اردیبهشت 1389, 14:17 عصر
سلام
من یک سوال خیلی واجب دارم .
توی پروژم یک شماره اتوماتیک دارم (sql 2008 ) که از طریق (big int,identity)ایجادش کردم. همین شماره اتوماتیک کلید جدولم هم هست.
این شماره وقتی ایجاد میشه که دکمه ثبت توسط کاربر فشرده بشه . حالا چطوری می تونم بعد از اینکه دکمه فشرده شد بلافاصله عدد ایجاد شده درون یک textbox توی همون فرم نمایش داده بشه ؟
لطططططططططططططططططططططططط طفا کمککککککککککککک.


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

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



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

ghasem110deh
یک شنبه 21 دی 1393, 21:22 عصر
سلام به همه ...
من تو یه برنامه از Identity استفاده کردم واسه id ، ولی تو هیچ جدولی اجازه حذف به کاربر ندادم ...
دیتابیسه یه برنامه فروش اجناسه ....
مشتری که دیگه باش کار نمیکنن (چه نیازی به حذف داره) بجای حذف گفتم سطر انتخاب شده رو (رنگش رو) خاکستری کنه !
و مثلا اگه فاکتور خرید و یا فروش هم برگشت بخورن (مرجوعی) ، بازم همینطور توی دیتاگریدویو رنگش رو تغییر میدم و توی جدول مرجوعی ها ذخیره میکنم و در معادلات حساب و کتاب هم کل فاکتور خرید و فروش که بدست اومد هر کدوم رو از کل مرجوعی هاش کم میکنم !
.
.
.
این روش به نظر اساتید درست و منطقی هست ؟ (یا ممکنه به مشکل بر بخوره)