PDA

View Full Version : سوال: برگشت رکوردی که در برنامه حذف می کنیم!



یاسر مددیان
شنبه 26 اردیبهشت 1388, 08:08 صبح
با سلام
همه در برنامه هایی که از بانک اطلاعاتی SQL Server استفاده می کنند رکوردی رو حذف ، اضافه و ... می کنیم. رکوردی که در برنامه حذف می کنیم ، حذف فیزیکی نمی شود. برای بازگشت رکوردی که حذف شده ولی حذف فیزیکی نشده باید از چه دستوری تو دلفی استفاده کنیم؟

با تشکر

babak_delphi
شنبه 26 اردیبهشت 1388, 21:27 عصر
وقتی که رکوردی از روی دیتا بیس پاک شد قایل بازگشت نیست
شما برای این کار میتوانید از یک فیلد استفاده کنید که از آن برای نشان دادن وضعیت حذف منطقی استفاده کنید و در حقیقت با مقداردهی آن ، رکورد مورد نظر را حذف منطقی کرده و در صورت نیاز با تغییر مقدار آن فیلد ، رکورد حذف شده را باز گردانید و در صورت نیاز به حذف دایم آن را Delete کنید (مانند Recycle Bin)

یاسر مددیان
یک شنبه 27 اردیبهشت 1388, 09:11 صبح
اگه میشه یه کم بیشتر توضیح بدین. یعنی اینکه وقتی رکوردی حذف می کنیم اون و تو یه جدول دیگه انتقال بدیم و با استفاده از اون فیلد بیونیم برگردونیمش ؟
ولی وقتی رکوردی رو از جدول حذف می کنیم ، اگه یه فیلد numeric که identity اون روی yes تنظیم شده باشه اگه آخرین رکورد رو حذف کنیم و مقدار فیلد برابر 30 باشه وقتی رکورد جدیدی وارد می شه دیگه فیلد برابر 30 نمیشه ، میشه 31. پس عملاً رکورد 30 حذف نشده و وجود داره مثل اینکه رفته تو سطل آشغال. آیا میشه این رکورد رو بدون واسطه جدول دیگه ای برگردوند؟

masoud.ramezani
یک شنبه 27 اردیبهشت 1388, 09:43 صبح
کمی درباره پارامترهای OUTPUT در SQL مطالعه کنید. شاید به درد شما بخورند.

babak_delphi
یک شنبه 27 اردیبهشت 1388, 11:34 صبح
از جدول دیگه هم میتونید استفاده کنید
identity رو هم میتونید خودتون پیاده سازی کنید

یاسر مددیان
یک شنبه 27 اردیبهشت 1388, 13:38 عصر
پارامترهای output رو میرم دنبالش.
اما بحث identity منظورم این بود که چرا identity خود sql دیگه شماره رکوردی رو که حذف شده نمیندازه و یه شماره بالاتر میندازه؟ پس عملاً اون رکورد وجود داره!

adinochestva
یک شنبه 27 اردیبهشت 1388, 13:44 عصر
پارامترهای output رو میرم دنبالش.
اما بحث identity منظورم این بود که چرا identity خود sql دیگه شماره رکوردی رو که حذف شده نمیندازه و یه شماره بالاتر میندازه؟ پس عملاً اون رکورد وجود داره!
خير ولي هردفعه نميره ببينه آخرين ركورد با id چيه چون performance پايين مياد

vcldeveloper
یک شنبه 27 اردیبهشت 1388, 18:24 عصر
اما بحث identity منظورم این بود که چرا identity خود sql دیگه شماره رکوردی رو که حذف شده نمیندازه و یه شماره بالاتر میندازه؟ پس عملاً اون رکورد وجود داره!
خیر. مشکل اینه که شما مفهوم Identity رو با شمارشگر اشتباه گرفتید. فیلد Identity از اسمش هم مشخص هست، فیلدی هست که یک مقدار منحصر به فرد به رکورد میده، و رکورد همیشه با آن مقدار منحصر به فرد شناخته میشه. فیلد Identity یک شمارشگر معمولی نیست که اگر شما رکورد 30 را حذف کردید، دفعه بعد که رکورد جدیدی ساختید، بانک بهش مقدار 30 را اختصاص بده!
در فیلد Identity اگر به رکوردی مقداری نسبت داده شد، آن مقدار برای همیشه به آن رکورد اختصاص خواهد داشت، و در صورت حذف رکورد، آن مقدار هم برای همیشه کنار گذاشته خواهد شد.

پیش فرض شما مثل این هست که شما تصور کنید هر کسی که فوت کرد، باید بجای ابطال شناسنامه یا کارت ملی اش، شماره ملی اش را به یک کودک تازه متولد شده داد! آن وقت اگر فرضا سازمانی بخواد هویت مربوط به آن کارت ملی را بررسی کند، بجای آنکه نتیجه گیری کند که صاحب کارت فوت کرده، نتیجه گیری می کند که صاحب کارت تازه متولد شده!

ar_mokhtari
دوشنبه 28 اردیبهشت 1388, 10:43 صبح
فيلدي كه جنسش شمارشگر هست همانطوري كه از اسمش برمي‌آد فقط ورودي هاي جديد رو شمارش ميكنه. توسط اين فيلد (كه درصورت حذف ركورد بار بعدي شماره جديدي را اختصاص ميدهد) شما ميتوانيد تعداد ركوردهاي ثبت شده Userتان را در روز پيدا كنيد. تعداد ركوردهاي حذف شده را محاسبه كنيد.
اما براي فيلدهاي Identity كه معمولاً شماره فرمهاي اصلي هستند و معمولاً بايد سريال باشند، (در صورت حذف 30 بار بعدي همان 30 را اختصاص دهند) بايد Functionي بنويسيد كه آخرين شماره فيلد رو بعلاوه يك كنه. نه اينكه فيلد رو شمارشگر انتخاب كنيد.