PDA

View Full Version : Row can not be located for updating



Sepidar
پنج شنبه 12 آذر 1383, 13:25 عصر
این ایراد رو واسه چی میگیره؟
مشخصات سیستم و برنامه:
Win XP Service Pack 2
Delphi 6
ADO
یه دیتا ست هم دارم که یه دیتا گرید و یه دیتا لوک آپ کومبو باکس بهش وصلن!

vcldeveloper
جمعه 13 آذر 1383, 04:12 صبح
این خطا موقعی روی میده که روی Dataset عملیات Update یا Delete صورت بگیره.

فرض کنیم شما یک جدول داشته باشید به اسم Tableبا ساختار زیر:
1- PrimaryKey
2- Filed1
3- Filed2

اگر شما مقدار Field 1 رو تغییر بدید، ADO کد SQL شبیه به این تولید میکنه:


UPDATE Table SET Filed1="New Value" WHERE PrimaryKey="Some Value" AND Field1="Previous Value"

این کد وابسته به مقدار قبلی Field1 هست. اگر قبل از ثبت این تغییرات برنامه یا کاربر و یا کاربران دیگه مقدار این فیلد رو به چیز دیگه ای تغییر بدند (مثلا "Previous Value" رو به "Some other Value" تغییر بدند، دستور العمل بالا نمیتونه رکورد مورد نظر رو پیدا کنه. در نتیجه رکوردی Update یا Delete نمیشه و خطای بالا ظاهر میشه.
برای جلوگیری از خطای بالا می تونید یکی از دو کار زیر رو انجام بدید:

1- خاصیت LockType دیتا ست رو به ltPessimistic تغییر بدید. در این صورت رکورد مورد نظر قفل میشه و امکان تغییر در آن توسط کاربران دیگه وجود نخواهد داشت.

2-
ADOQuery1.Properties['Update Criteria'].Value := 0; //adCriteriaKey
;
با استفاده از کد بالا، ADO در هنگام update ، رکورد رو فقط از طریق PrimaryKey پیدا میکنه و شرط Field1="Previous Value رو لحاظ نمیکنه. در این حالت فقط در صورتی پیغام خطای بالا داد میشه که PrimaryKey همزمان توسط دو کاربر تغییر داده بشه.

ali_abbasi22145
دوشنبه 11 تیر 1386, 10:13 صبح
سلام
مرسی آقای کشاورز عزیز
1-به نظر شما کدام دو روش بالای شما بهتر برای بانکهایی به حجم 650 مگابایت به بالا( که هررکورد آن یک عکس 300و یک عکس72 DPI دارد) با حدود 8 تا 10 کاربر مناسب تر است؟

2-آیا دستور ADOQuery1.Properties['Update Criteria'].Value := 0; //adCriteriaKey را در رویداد AfterOpen جدولهای بانک باید بنویسیم؟
البته قبلا من برای مشکلی که همزمان دو کاربر یک رکورد را باز می کردند و پیغام خطا می داد من کد زیر را نوشتم که حل شد و حالا این کد شما مشکل قبل را تکرار نمی کند؟
واین هم کد قبلی من در رویداد AfterOpen جدولها:
ADOTable1.Active := True;
ADOTable1.Properties['Update Criteria'].Value := adCriteriaKey;

vcldeveloper
چهارشنبه 13 تیر 1386, 09:44 صبح
-به نظر شما کدام دو روش بالای شما بهتر برای بانکهایی به حجم 650 مگابایت به بالا( که هررکورد آن یک عکس 300و یک عکس72 DPI دارد) با حدود 8 تا 10 کاربر مناسب تر است؟
بستگی به این داره که کاربران شما چقدر نیاز دارند بر روی رکوردهای مشتر ک کار کنند (یعنی آنها را ویرایش کنند/نه صرفا نمایش رکورد).
البته می تونید هر دو کار را همزمان هم انجام بدید؛ یعنی هم از LockType = itPessimistic استفاده کنید، هم از Update Criteria.


البته قبلا من برای مشکلی که همزمان دو کاربر یک رکورد را باز می کردند و پیغام خطا می داد من کد زیر را نوشتم که حل شد و حالا این کد شما مشکل قبل را تکرار نمی کند؟
این کد هم همون کار را انجام میده و فرقی با اون نداره.
در ضمن، در رویداد OnAfterOpen یک DataSet نیازی به Active کردن اون نیست، چون این رویداد زمانی فراخوانی میشه که DataSet فعال شده باشه. پس خصوصیت Active همیشه در زمان فراخوانی این رویداد True هست.

ali_abbasi22145
چهارشنبه 13 تیر 1386, 10:36 صبح
[QUOTE=علی کشاورز;362034]بستگی به این داره که کاربران شما چقدر نیاز دارند بر روی رکوردهای مشتر ک کار کنند (یعنی آنها را ویرایش کنند/نه صرفا نمایش رکورد).
البته می تونید هر دو کار را همزمان هم انجام بدید؛ یعنی هم از LockType = itPessimistic استفاده کنید، هم از Update Criteria.

با سلام و تشکر فراوان
کاربران من از با رکوردهای مشترک خیلی کار ویرایش ندارند و ممکن است نمایش رکوردهای مشترک داشته باشد آنهم نه در حد خیلی زیاد.

vcldeveloper
چهارشنبه 13 تیر 1386, 11:43 صبح
در صورتی که از Update Criteria استفاده کنید، تا زمانی که دو کاربر همزمان فیلد کلید یک رکورد را ویرایش نکنند، مشکلی نخواهید داشت. در صورتی که این اتفاق بیافته، کاربر دوم یک پیغام خطا دریافت می کنه.

SYNDROME
چهارشنبه 13 تیر 1386, 13:25 عصر
با سلام


1- خاصیت LockType دیتا ست رو به ltPessimistic تغییر بدید. در این صورت رکورد مورد نظر قفل میشه و امکان تغییر در آن توسط کاربران دیگه وجود نخواهد داشت.

1-دستوری که برای این کار است را چه طور می نویسند؟
2-آیا عمل قفل شدن رکورد از لحظه ای که Edit تا Postرکورد مورد نظر را قفل می کند یا جور دیگری است؟
با تشکر

ali_abbasi22145
چهارشنبه 13 تیر 1386, 14:34 عصر
سلام
من حالتی را می خواهم که عمل قفل شدن رکورد از لحظه ای که Edit تا Postرکورد مورد نظر را قفل می کند باشد بعد Postرکورد کاربر دیگر بتواند تغییر دهد که روشهای قبل اینکار را نمی کنند.
من تست کردم حالتی را که کاربر اول درمد Edit رفت و Post نکرد و همان رکورد را کاربر دوم به مد Edit برد و Post کرد و بعد برنامه را به کل بست ولی کاربر اول هنوز امکان تغییر ندارد و این درحالی است کاربر اول باید بتواند ذخیره کند.

vcldeveloper
شنبه 16 تیر 1386, 04:02 صبح
-دستوری که برای این کار است را چه طور می نویسند؟
فقط خاصیت lockType را تغییر بدید.
در این حالت، وقتی کاربر رکوردی را Edit می کند، تا زمانی که از حالت Edit خارج نشود (از طریق Cancel کردن تغییرات، یا ذخیره تغییرات)، کاربران دیگه امکان Edit کردن آن رکورد را ندارند.

mehdimdp
یک شنبه 19 مهر 1388, 23:47 عصر
سلام
من با دلفی 7کار میکنم.
بانک اطلاعاتی اکسس 2003
من بعضی وقتها هنگام post با این خطا مواجه می شم.
برنامه ی من تک کاربره هستش
من خاصیت lockType رو هم تغییر دادم ولی بازم فایده ای نداشت.
میگید چیکار کنم؟

vcldeveloper
دوشنبه 20 مهر 1388, 05:27 صبح
من با دلفی 7کار میکنم.
بانک اطلاعاتی اکسس 2003
من بعضی وقتها هنگام post با این خطا مواجه می شم.
برنامه ی من تک کاربره هستش
من خاصیت lockType رو هم تغییر دادم ولی بازم فایده ای نداشت.
میگید چیکار کنم؟
بررسی کنید که جدول مورد نظر شما حتما فیلد کلید داشته باشه. اگر فیلد کلید دارید، مورد شماره 2 در پست دوم تاپیک را انجام بدید.