ورود

View Full Version : شمارنده خودکار فیلد عدد در دیتابیس



babak869
جمعه 28 بهمن 1384, 20:07 عصر
با سلام به همه دوستان :
من میخواستم نظرتون رو در باره 1 موضوع بپرسم و درخواست همفکری دارم.
در بعضی برنامه ها لازمه که مثلا شماره فاکتور برای فیلد فاکتور بطور خودکار محاسبه بشه .چون پیدا کردن شماره آخرین فاکتور در یک دیتابیس بزرگ مشکله.برای این کار چند روش وجود داره :
من در برنامه هایی که یک فیلد که از نوع Number دارم و کلید اصلی هم هست از روش زیر استفاده میکنم.این کد رو در یک دگمه مینویسم و کاربر با زدن دگمه ( جدید ) که میخواد اطلاعات رو وارد دیتابیس کنه شماره اون فیلد بطور خودکار محاسبه میشه و در DbEdit مربوطه نمایش داده میشه


var a:integer;
begin
ADOTable1.Open;
ADOTable1.Edit;
ADOTable1.Insert;
a:=ADOTable1.RecordCount+1;
DBEdit1.Text:=inttostr(a);

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


AdoTable1.Last;
a:=AdoTable1Factor.AsInteger;
DbEdit1.Text:=InttoStr(a);

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

Hamid_PaK
جمعه 28 بهمن 1384, 21:37 عصر
توی دیتابیستون یک فیلد جدید درست کنید و نوع اون رو AutoNumber انتخاب کنید ( بطور خودکار فیلد رو با عدد که تکراری نیست مقدار دهی می کنه ، اگه پرایمری هم باشه دیگه همه چیز درسته ) ...

یا حق !!!

Yasser_Program
شنبه 29 بهمن 1384, 04:58 صبح
سلام، من از این روش استفاده می کنم:
1- با یک Query یا تعداد کل رکوردها رو می گیرم یا اینکه شماره آخرین رکورد رو در نظر می گیریم
2- یک دونه بهش اضافه می کنم
3- توی یک حلقه While با استفاده از یک گزینه Select وجود اون کد رو در جدول بررسی می کنم، اگر موجود بود، یکی دیگه بهش اضافه می کنم و اینقدر اضافه می کنم که یکتا بشه.

اگر از روش کد بر حسب تعداد رکوردها استفاده کنید جوابها بهتر و زودتر بدست می آیند. روش استاد Hamid_Pak هم درست است، ولی خوبی این روش اینست که به کاربر می توانیم اجازه بدیم که اگه خواست کد رو عوض کنه (اگه Autonumber باشه اجازه تغییر نداریم).
خوش باشین

mzjahromi
شنبه 29 بهمن 1384, 08:01 صبح
1- با یک Query یا تعداد کل رکوردها رو می گیرم یا اینکه شماره آخرین رکورد رو در نظر می گیریم
2- یک دونه بهش اضافه می کنم
3- توی یک حلقه While با استفاده از یک گزینه Select وجود اون کد رو در جدول بررسی می کنم، اگر موجود بود، یکی دیگه بهش اضافه می کنم و اینقدر اضافه می کنم که یکتا بشه.

اگر قرار باشه این کار ر. بکنیم که همون Query گرفتن بهتره. اگر فیلد کلید هم باشه با سرعت کافی این کار انجام میشه
Select Max (ID) From TableName

MNosouhi
شنبه 29 بهمن 1384, 08:20 صبح
البته شما ننوشته بودید که بانکتون چیه. اما خوب در DbIsam یه راه حل دیگه هم وجود داره ، اگه از DbisamTable استفاده کنید میتونید با استفاده از خاصیت LastAutoIncValue به اخرین مقدار فیلد از نوع Auotonumber دست پیدا کنید.

(اگه Autonumber باشه اجازه تغییر نداریم).
در DBIsam این محدودیت وجود نداره و کاربر هم می تونه فیلد از نوع AuotoNumber رو تغییر بده.
یه راه حل دیگه هم استفاده از Max در دستور Select می باشد.

babak869
شنبه 29 بهمن 1384, 08:27 صبح
با تشکر از جواب دوستان
من منظورم از فیلد AutoNumber نیست .من می خوام روش کلی در برنامه های بزرگ رو بدونم چون در برنامه های بزرگ این مشکل اگه پیش بیاد کل دیتابیس به هم میریزه.اگه کاربر اجازه پاک کردن رکورد رو نداشته باشه از هر روشی میشه استفاده کرد اما نکته اینجاست که اگه فرضا 4 تا رکورد وارد شده باشه و کاربر رکورد 2 رو هم پاک کرده باشه در هنگام وارد کردن اطلاعات جدید بایستی عدد 5 رو اختصاص بده چون آخرین رکورد 4 هستش.در صورتی که اگه تعداد رکوردها رو حساب کنه 3 تاست و اگه یکی بهش اضافه کنه 4 میشه که این شماره در دیتابیس هست و تکراریه.البته از راه های زیادی میشه این محاسبه رو انجام داد اما من روش استاندارد و بدون خطا رو میخوام یاد بگیرم
با تشکر

MNosouhi
شنبه 29 بهمن 1384, 11:40 صبح
یه روش بهینه اینه که وقتی برنامت اجرا میشه Max فیلد موردنظر رو تو یه متغیر بریزی و تا پایان برنامت از اون متغیر استفاده کنی . اینطور در برنامه های بزرگ هم مشکلی پیش نمیاد . اما خوب باید خودت اون متغیر رو مدیریت کنی.

Hamid_PaK
شنبه 29 بهمن 1384, 20:43 عصر
دوست عزیز وقتی فیلد شما با AutoNumber مقدار دهی شده باشه هیچ وقت تکراری نمی شه و هرگاه فیلدی حذف شود باز هم دیتابیس این فیلد رو محاسبه خواهد کرد و بطور خودکار عدد منطقی فیلد جدید رو مقدار دهی خواهد کرد ...

یک نگاهی به این نمونه بیاندازید ...

یا حق !!!

saniak_robot
یک شنبه 30 بهمن 1384, 10:08 صبح
با سلام شما می توانید از این روش استفاده نمائید :
if table.isempty then
table.fieldbyname('id').asinteger := 1
else
begin
table.last;
a := table.fieldbyname('id').asinteger;
table.insert;
table.fieldbyname('id').asinteger := a + 1;
table.post;
end;

saniak_robot
یک شنبه 30 بهمن 1384, 10:09 صبح
با سلام شما می توانید از این روش استفاده نمائید :

if table.isempty then
table.fieldbyname('id').asinteger := 1
else
begin
table.last;
a := table.fieldbyname('id').asinteger;
table.insert;
table.fieldbyname('id').asinteger := a + 1;
table.post;
end;
در این حالت تکراری نداریم و هم اینکه اعداد همیشه پشت سر هم هستند.

babak869
یک شنبه 30 بهمن 1384, 10:20 صبح
از جواب و همفکری همه دوستان متشکرم