PDA

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



AmirSky
چهارشنبه 12 اسفند 1388, 22:22 عصر
با سلام

من در یک برنامه وقتی دکمه ویرایش را می زنم چگونه میشود فهمید که آیا رکورد در حال ویرایش است و وقتی در برنامه دکمه ویرایش زده شود چه کدی باید نوشته شود که معلوم کند این رکورد در حال ویرایش است تا در کلاینتهای دیگر قبل از ویرایش از تغییر دادن یا حذف یا هر کار دیگر مورد نیاز جلوگیری بعمل آید.
در ضمن من از Query استفاده می کنم ، بانک اطلاعاتی SQL Server است و از dbNavigator استفاده نمیکنم.
لازم به ذکر است در بعضی از فرمها بجای ویرایش معمولی یک فرم دیگر بازمیشود و میخواهم اگر آن فرم در یک کلاینت بازبود در کلاینت دیگر باز نشود.

باسپاس از شما دوستان

com.ha.za
چهارشنبه 12 اسفند 1388, 22:49 عصر
میتونید یک فیلد داشته باشید که مقدار پیش فرض آون صفر باشه و زمان ویرایش مقدار اونو مثلا یک بذارید و وقتی ویرایش تموم شد مقدارو به صفر تغییر بدید با این کار مقدارو چک میکنید و هر موقع یک بود یعنی در حال ویرایش است
البته این روشیه که من استفاده می کنم

سعید صابری
پنج شنبه 13 اسفند 1388, 09:23 صبح
با سلام

من در یک برنامه وقتی دکمه ویرایش را می زنم چگونه میشود فهمید که آیا رکورد در حال ویرایش است و وقتی در برنامه دکمه ویرایش زده شود چه کدی باید نوشته شود که معلوم کند این رکورد در حال ویرایش است تا در کلاینتهای دیگر قبل از ویرایش از تغییر دادن یا حذف یا هر کار دیگر مورد نیاز جلوگیری بعمل آید.
در ضمن من از Query استفاده می کنم ، بانک اطلاعاتی SQL Server است و از dbNavigator استفاده نمیکنم.
لازم به ذکر است در بعضی از فرمها بجای ویرایش معمولی یک فرم دیگر بازمیشود و میخواهم اگر آن فرم در یک کلاینت بازبود در کلاینت دیگر باز نشود.

باسپاس از شما دوستان

اگه منظورت اينه كه ديتابيس در چه حالتي است اين هم تمام وضعيتهاي ديتابيس




case ADOTable1.State of
dsInactive: ;
dsBrowse: ;
dsEdit:Label1.Caption:='در حال ويرايش' ;
dsInsert: ;
dsSetKey: ;
dsCalcFields: ;
dsFilter: ;
dsNewValue: ;
dsOldValue: ;
dsCurValue: ;
dsBlockRead: ;
dsInternalCalc: ;
dsOpening: ;
end;

من فقط ويرايش نوشتم بقيه اش خودت زحمتش بكش

pezhvakco
پنج شنبه 13 اسفند 1388, 09:56 صبح
درود :
برای این کار می تونی از رویدادهای مربوط به Table ها ، هم استفاده کنی .
تو رویداد های ( Events ) هر AdoTable و AdoDataset کنترل وضعیت هست .

AmirSky
پنج شنبه 13 اسفند 1388, 15:51 عصر
میتونید یک فیلد داشته باشید که مقدار پیش فرض آون صفر باشه و زمان ویرایش مقدار اونو مثلا یک بذارید و وقتی ویرایش تموم شد مقدارو به صفر تغییر بدید با این کار مقدارو چک میکنید و هر موقع یک بود یعنی در حال ویرایش است

وقتی که چیزی ذخیره نشده چطور میشه فهمید یک فیلد مقدارش 0 یا 1 هست ؟

مورد بعد اینکه اگر برنامه ناگهانی قطع بشه بعد از اینکه مقدار از 0 به 1 با روشی که من متوجه نشدم تغییر پیدا کرد کاربرهای دیگر به هیچ عنوان نمیتوانند اون رکورد رو ویرایش کنند


اگه منظورت اينه كه ديتابيس در چه حالتي است اين هم تمام وضعيتهاي ديتابيس



dsEdit:Label1.Caption:='در حال ويرايش' ;


من فقط میخوام روی یک رکورد خواص قفل گذاشته شود نه کل Table چون همزمان افراد زیادی با این Table کار میکنند

درضمن من مستقیما از Table استفاده نمیکنم چون از چندین Table مختلف Join دارم از Query ها استفاده میکنم

با سپاس

:لبخندساده:

vcldeveloper
پنج شنبه 13 اسفند 1388, 17:03 عصر
من فقط میخوام روی یک رکورد خواص قفل گذاشته شود نه کل Table چون همزمان افراد زیادی با این Table کار میکنند
در حالت عادی خودِ دیتابیس روی رکورد قفل میزاره، و نیازی نیست شما کار خواصی انجام بدید. اگر میخواید نحوه عملکرد این قفل را تغییر بدید، می تونید از خصوصیت LockType استفاده کنید.

اگر Pessimistic باشه، وقتی رکورد در حالت ویرایش میره، هیچ کلاینت دیگه ایی بهش دسترسی ویرایش نداره.
اگر Optimistic باشه، سایر کلاینت ها بهش دسترسی ویرایش دارند، ولی نمی تونند همزمان یک فیلد مشترک را ویرایش کنند (مثلا هر دو کلاینت فیلد LastName را ویرایش کنند).

AmirSky
پنج شنبه 13 اسفند 1388, 18:18 عصر
با تشکر از شما آقای کشاورز
من قبلا این کار رو خواستم انجام بدهم اما به یک مشکل خوردم

تنظیمات به این شکل بود :
Cursor Location = cluseserver
Cursor Type = ctKeyset
Lock Type = itPessimistic

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

امیر :لبخندساده:

vcldeveloper
جمعه 14 اسفند 1388, 12:33 عصر
هر بانکی، هر ترکیبی از CursorLocation و CursorType و LockType را پشتیبانی نمیکنه. شما باید ترکیبی را استفاده کنید که بانک شما آن را پشتیبانی کنه، مثلا مقدار CursorType را تغییر بدید.

AmirSky
شنبه 15 اسفند 1388, 11:41 صبح
من از SQL Server2000 می کنم و اگر Cursor Type رو تغییر بدم دیگه

Lock Type = itPessimistic

رو قبول نمی کنه .
پس به نظر شما Cursor Type باید با این شرایط چه مقداری قرار بگیرد

vcldeveloper
شنبه 15 اسفند 1388, 12:01 عصر
پس به نظر شما Cursor Type باید با این شرایط چه مقداری قرار بگیرد
بستگی به کاربرد شما داره. CursorTypeایی که معمولا همیشه کار میکنه Static هست. البته سربارش بیشتر از Keyset هست.

AmirSky
شنبه 15 اسفند 1388, 12:31 عصر
بستگی به کاربرد شما داره. CursorTypeایی که معمولا همیشه کار میکنه Static هست. البته سربارش بیشتر از Keyset هست.

من فقط میخوام بررسی کنم که آیا رکورد مورد نظر در کلاینتهای دیگه در حال ویرایش است یا نه و در صورت اینکه در حال ویرایش بود یک پیغام نمایش بدهد. همین

باسپاس

mehdimdp
سه شنبه 18 اسفند 1388, 21:37 عصر
خب شما یک جور یک متغیر عمومی نمیتونید تعریف کنید؟؟؟

vcldeveloper
سه شنبه 18 اسفند 1388, 22:11 عصر
خب شما یک جور یک متغیر عمومی نمیتونید تعریف کنید؟
متغیر عمومی شما فقط توی برنامه خودتون کارکرد داره؛ ایشون چند کلاینت دارند که از سیستم های مختلف به یک بانک اطلاعاتی مرکزی وصل میشند، پس متغیر عمومی کاربردی براشون نداره.

ihpled
شنبه 22 اسفند 1388, 11:10 صبح
به جای متغیر عمومی می تونید جدولی مخصوص این کار در دیتابیس تعریف و فیلدی رو در دیتابیس برای این کار در نظر بگیرید (مثلاً جدولی با دو فیلد: نام جدول، وضعیت)

بعد هر edit یا insert یا .. جمله دلخواه خودتون رو در فیلد بنویسید
و در هر بار عملیات جدید ابتدا مقدار فعلی فیلد رو چک کنید

AmirSky
شنبه 22 اسفند 1388, 14:10 عصر
به جای متغیر عمومی می تونید جدولی مخصوص این کار در دیتابیس تعریف و فیلدی رو در دیتابیس برای این کار در نظر بگیرید (مثلاً جدولی با دو فیلد: نام جدول، وضعیت)
بعد هر edit یا insert یا .. جمله دلخواه خودتون رو در فیلد بنویسید
و در هر بار عملیات جدید ابتدا مقدار فعلی فیلد رو چک کنید


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

ممنون میشم اگر شما هم نظر خود را بگویید

حسین شهریاری
یک شنبه 23 اسفند 1388, 10:19 صبح
با تشکر از شما دوستان
اگر در برنامه بعد از ادیت برنامه به هر دلیلی برنامه بسته شود آن وقت آن رکورد همیشه در حالت ویرایش باقی می ماند.
من هم با شما موافقم فقط به نظر من این مشکل رو اگر با یک EXE جداگانه که آن تیبل در خالی نماید شاید بتوان حل نمود.

ممنون میشم اگر شما هم نظر خود را بگویید

سلام

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

مثلا در رويداد OnCloseQuery فرم بنويسيد:


if (Adotable1.state=dsedit) or (Adotable1.state=dsinsert) then
begin
canclose:=false;
showmessage('Dataset is Edit or Insert')
end;

موفق باشيد