PDA

View Full Version : پیدار کردن شناسه رکورد آزاد (حذف شده)



pezhvakco
چهارشنبه 21 بهمن 1388, 08:16 صبح
سلام :
تو بانک های sql چه طوری میشه رکورد هایی که کاربر حذف کرده رو شناسایی و دوباره استفاده کرد .
یعنی تو یه برنامه که شماره رکورد ها شاخص و یکتا است، اگر کاربر چند رکورد را از داخل رکورد ها حذف کرد ، بشه آن شماره ها رو در insert های بعدی استفاده کرد .
تشکر ...

Unique
پنج شنبه 22 بهمن 1388, 13:50 عصر
سلام

سوالات عجیب غریب ! اولا شما نگفتی داری از چه بانکی استفاده میکنی MSSQL یا MySql که البته 99% باید MSSQL باشه ! ببین دوست عزیز توی این بانک ها برخلاف Table های dbf که رکورد های حذف شده عملا حذف نمیشدند (من تا حالا از این نوع Table های قدیمی استفاده نکردم اما توی تبدیل برنامه های قدیمی متوجه شدم که این Table ها رکورد های Delete شده را عملا حذف نکرده اند و چیزی شبیه یک نشونه روشون میگذارند) رکورد حذف شده حذف میشه و فقط ازش Log موجوده که بشه Rollback کرد !

میشه توضیح بعدی چرا باید از شماره یکتا Record های میانی که حذف شده اند دوباره استفاده کرد ، چون این کار سودی که نداره هیچ بلکه به نظر من اشتباهه ، مثلا فکر کن میخوای چهار مورد آخر که به پایگاه اضافه شده را نمایش بدی ، حالا اگه از شماره های یکتا میانی استفاده کرده باشی Sort این فیلد یکتا بهت جواب نمیده (نگو میشه یک فیلد Date ایجاد کرد که اینطوری داری بیخودی یک فیلد اضافه میکنی که Sort اون هم از فیلد یکتا کند تره).

اما اگه واقعا میخوای این کار را بکنی Autoincrement را از روی فیلد بردار و در زمان Insert تصمیم بگیر باید چه عددی بدی به آخرین رکورد. (برای استفاده از شماره های میانی هم میتونی در زمان Delete شماره های حذف شده را جائی ذخیره کنی بعدش با یک Sort مناسب ازشون دوباره استفاده کنی) ولی لقمه را بیخودی نچرخون !

pezhvakco
شنبه 24 بهمن 1388, 10:46 صبح
دستت درد نکنه !
تشکر ...
1 ) از MSSQL استفاده میکنم .
2 ) تو برنامه حسابداری بعضی وقت ها لازمه یه شماره سند حذف شده دوباره استفاده بشه برای حساب سازی .
3 ) دستت برای راهنمایی ذخیره رکورد ها درد نکنه .
4 ) دنبال یه روش برای پیدا کردن شماره های می گردم که حذف شده، با این توضیح که شماره ها به ترتیب هستند .

Unique
سه شنبه 27 بهمن 1388, 21:44 عصر
دوست عزیز ، بهترین کار اینه که یک فیلد به رکوردت اضافه کنی به عنوان isdeleted که حالت True و False داره ! حالا اگه قرار شد رکوردی حذف بشه شما فیلد را True میکنی و در زمان نمایش فقط False ها را نمایش میدی ، حالا اینطوری در واقع چیزی حذف نشده و اگه قرار شد ازش استفاده کنی ویرایشت را روی رکورد مربوطه انجام میدی و فیلد isdeleted را false میکنی ! رکورد با اطلاعات جدید برمیگرده.

Modernidea
سه شنبه 27 بهمن 1388, 23:42 عصر
به نظر من راه سریعترش همونه که Unique گفتن. یعنی یک فیلد برای ذخیره شماره های حذف شده داشته باشید.
و راه دیگش اینکه قبل از Insert کردن بر روی شماره های Sort شده جستجو کنید.

یعنی اگه اولین شماره 1 باشه :


N := 1;
for i := 0 to DB.RecordCount-1 do
begin
if N <> DB.FieldByName("Record Nummber').AsInteger then
Break
else N := N+1;
end;



خوب، همینجور که معلومه اگه بین شماره ها یکی حذف شده باشه با دستور Break حلقه شکسته میشه و مقدار حذف شده در N باقی میمونه.

موفق باشید.

pezhvakco
چهارشنبه 28 بهمن 1388, 07:43 صبح
درود :
تشکر از Unique و chatbaz عزیز ...
راه حل های جالبی بود .

حسین شهریاری
چهارشنبه 28 بهمن 1388, 11:27 صبح
سلام
این مورد برای من هم پیش اومده بود.من اینطوری حلش کردم:اومدم یه جدول دیگه دقیقا معادل جدولی که اسنادم توی اون ذخیره میشد ایجاد کرده(مثلا RecycleDoc) و قبل از حذف سند دلیل حذف اون سند را هم از کاربر میپرسیدم و اون سند را توی جدول اسناد حذف شده درج میکردم.یه گزینه ای هم قرار داده بودم که کاربر عملا اسناد حذف شده را میدید و اگه دوست داشت دوباره اونا را بازیابی میکرد.تمام این کارا توسط یه select , یه Insert خیلی سریع انجام میشه.