PDA

نسخه کامل مشاهده نسخه کامل : کار با رکوردها ( قفل کردن و غیره )



as13851365
05-02-2008, 11:39
چند سوال برایم پیش آمده که امیدوارم دوستان کمک کنند

1 ) چطور می تونم یک رکورد را قفل کنم ( با چه دستوری می شه یک رکورد را قفل کرد)
2 ) چطوری می شه فهمید که یک رکورد قفل است یا نه ؟
3 ) چطوری یک رکورد را که قفل است از حالت قفل خارج کنیم؟

4 ) به کد زیر دقت کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر یک برنامه را دو بار اجرا کنیم یا دو برنامه از یک بانک استفاده کنند اگر در برنامه (الف) یک رکورد جدید ایجاد کنیم در برنامه ( ب ) این رکورد نمایش داده نمی شه چرا ؟
تنها راه حلی که به نظر من خوب آمد ( می دونستم ) استفاده از یک تایمر بود یعنی در برنامه (الف) بعد از این که یک رکورد جدید ایجاد کردم بانک را یک بار می بندم و دوباره باز می کنم و در برنامه (ب) یک تایمر قرار دادم که مثلا در هر دو ثانیه بانک را می بنده و دوباره باز می کنه .
حالا یک سوالا آیا راه بهتری وجود دارد ؟

as13851365
08-02-2008, 10:58
فکر کنم همه مشغول هستن که فرصت جواب دادن ندارن!!!

as13851365
08-02-2008, 11:14
فکر کنم همه مشغول هستن که فرصت جواب دادن ندارن!!!

NoneForce
08-02-2008, 11:34
فکر کنم همه مشغول هستن که فرصت جواب دادن ندارن!!!

سلام
مثل اينكه سر شما خيلي خلوته كه داريد همينطوري پشت سرم هم پست ميزنيد!

يك راه حل :
وقتي كاربر اول قصد ويرايش يك ركورد را مي كنيد، در يك جدول ديگر شماره ركورد و يك شماره منحصر به فرد درج كنيد، و وقتي كار ويرايش تمام شد آن ركورد را پاك كنيد، حالا وقتي كاربر اول در حال ويرايش است، وقتي كاربر دوم اقدام به ويرايش كند چون در جدول ما ركوردي با شماره ركورد در حال ويرايش وجود دارد، در نتيجه كاربر دوم خطايي مبني بر قفل بودن ركورد دريافت مي كند و بايد تا زمان پايان ويرايش كاربر اول صبر كنيد.

ميتونيد از كامپوننتهايي مثل Absolute Database استفاده كنيد كه Multi-User هستند.

romixery
08-02-2008, 19:26
سلام
با اجازه نانفورس جان:
البته يه كار ديگه هم مي تونيد انجام بدين كه نيازي به يه جدول ديگه نيست. يه فيلد در جدولتون ايجاد كنيد. به محض اينكه ركورد در حال Edit هست مقدار اون رو به مثلا (1) تغيير بدين. و وقتي مي خواين ذخيره كنيد،‌ دوباره مقدارش رو به (0) تغيير بدين. حالا اگه يه كاربر ديگه در همين موقع خواست با اون ركورد كار كنه، اگه مقدار اون فيلد يك باشه يعني اينكه ركورد در حالت Edit هستش و اينجا مي تونيد دسترسي به اون ركورد رو قطع كنيد.
البته قبلا در تاپيك (درخواست آموزش تحت شبكه) در مورد اين موضوع بحث شده بود. چون اين موضوع در شبكه بسيار اهميت داره.
موفق باشين

F A R H A D
09-02-2008, 08:32
سلام. راه ساده تر هم استفاده از locktype هست كه ميتونيد روي ltPessimistic تنظيم كنيد و اجازه ويرايش همزمان ركورد رو نديد.
ضمن اينكه به صحبتهاي دوستان اين مورد رو اضافه ميكنم كه روشهايي كه گفتيد زماني كارآمد هست كه تمام دستورات از شروع ويرايش تا پايان كار درون يك Transaction انجام شه كه مشكلاتي كه بعد از رفتن برق يا متوقف شدن برنامه در وضعيت نا متعارف بوجود مياد، براي برنامه مشكلي ايجاد نكنه

romixery
09-02-2008, 09:50
البته براي رفع مشكل برق يا غيره ميشه هنگامي كه سرور بانك رو باز كرد تمام خونه هاي اون فيلده رو توي جدول به صورت پيش فرض 0 كنه. اينجوري هيچ خونه اي 1 باقي نمي مونه.

F A R H A D
09-02-2008, 10:17
البته براي رفع مشكل برق يا غيره ميشه هنگامي كه سرور بانك رو باز كرد تمام خونه هاي اون فيلده رو توي جدول به صورت پيش فرض 0 كنه. اينجوري هيچ خونه اي 1 باقي نمي مونه.

... و ركوردهايي كه توسط كاربران ديگه در حال استفاده هست از lock خارج ميشه. يك مشكل حل شده N مشكل اضافه