ورود

View Full Version : مشکلی در دیلیت عنصر در جدول پیرو(یا فرعی)؟؟



tik_tak
یک شنبه 05 اسفند 1386, 18:51 عصر
سلام
وقتی دوتا جدول یکی اصلی یکی پیرو یا فرعی دارم و با دستکاری خاصیتهای
MASTERSOURC
,
MASTERFIELD
بهم ربطشون دادم نمیتونم از جدول پیرو چیزی رو حذف کنم این خطاها میاد :


project projecta.exe raised exception class EDatabaseError with message
'Row cannot be located for updating.some values may have been changed
since it was last read'.process stopped.Use Step or Run to countinue.







PROJECT1
Row cannot be located for updating.some values may have been changed sinc it was last read;


دستور حذف و اینجوری نوشتم :



IF DataModule2.ADOTable5.Locate('shomareh;name;kind',
VarArrayOf([strtoint(edit1.text),edit2.Text,edit3.Text]),[])=true then
DataModule2.adotable5.Delete;

باید چی کار کنم ؟؟

حمیدرضاصادقیان
یک شنبه 05 اسفند 1386, 20:38 عصر
احتمالا وقتی شما میخواهید عمل حذف رو انجام بدید قبلش روی دیتابیس عمل اضافه یا بروزرسانی انجام دادید.شما همین پیغام خطا رو در بخش جستجو کن خیلی بهش پاسخ داده شده و راه حلش هم بیان شده.
موفق باشید.
http://barnamenevis.org/forum/showthread.php?t=71888&highlight=Row+cannot+be+located

tik_tak
یک شنبه 05 اسفند 1386, 21:03 عصر
سلام
من تو ادیت هم ،همین مشکل رو دارم ......
ولی از اون لینکه چیزی نفهمیدم...!

SYNDROME
یک شنبه 05 اسفند 1386, 21:35 عصر
سلام
من تو ادیت هم ،همین مشکل رو دارم ......
ولی از اون لینکه چیزی نفهمیدم...!
آیا کدی را که لینک آن را حیمدرضا گذاشت استفاده کردی و باز هم خطا فوق را می دهد؟
موفق باشید

tik_tak
یک شنبه 05 اسفند 1386, 23:06 عصر
سلام
اون لینکی که گذاشته بودن لینک یه تا پیک بود که نتونستم ازش استفاده کنم....
یعنی نیمدونم باید چیکار کنم
اما آقای amir_safidah تو چندتا تاپیک قبل اینارو گفته بودن:::::::::::::::



دوست غزیز tik_tak کدی که دوستان دادن باید کار کنه اگر کار نمیکنه یه احتمال میتونه در اینجا وجود داشته باشه و اون هم اینه که زمانی که شما میخواهید یه رکورد رو پاک کنید جدول دوم شما در حالت Edit یا Insert باشه یعنی این که شما تغییرات قبلی رو ذخیره نکردید و حالا دارید سعی میکنید که یه رکوردی رو حذف کنید که تغییر جدیدی رو به بانک ارسال کنید .
خوب برای رفع مشکل یه پیشنهاد بهت میکنم . برای ذخیره کرده اطلاعات فقط از دستور Post استفاده نکن این کد رو در زمان ذخیره اطلاعات اعمال کن .
کد:

try ADOConnection1.BeginTrans; ADOTable2.UpdateBatch; ADOConnection1.CommitTrans; except ADOConnection1.RollbackTrans; End;


این کد رو شما به جای ADOTable2.Post قرار بده و در ضمن مطمئن شو که در زمانی که کاربر میخواد یه رکورد رو حذف کنه جدول دوم شما اطلاعاتش رو قبلا ذخیره کرده باشه و در حالت Edit یا Insert نباشه .
خوب شاید بپرسی که چطور میشه فهمید که جدول دوم در حالت Edit یا Insert هست یا نه خوب این کار هم خیلی ساده انجام میشه .
فرض میکنیم که کاربر میره و روی دکمه Delete کلیک میکنه خوب ما قبل از این که برنامه به دستور Delete برسه یه کد کنترلی اضافه میکنیم که اگر جدول در حالت Edit یا Insert بود دستور Delete انجام نشه تا مشکلی پیش نیاد . این کد رو در رویداد OnClick مربوط به دکمه Delete قرار بده :
کد:


if ADOTable2.State in [dsEdit,dsInsert] then ShowMessage('You should save your new information!') else begin ADOTable2.Delete; ADOTable2.UpdateBatch; end;


منم طبق گفته ایشون رو دکمه ادد عنصر تو جدول پیرو یا همون جدول دومی یا فرعی
به جای adotable2.post کد اولی
و رو دکمه حذف در همون جدول دومی یا پیرو این کدرو نوشتم::::


begin
IF DataModule2.ADOTable5.Locate('shomareh;name;kind', VarArrayOf([strtoint(edit1.text),edit2.Text,edit3.Text]),[])=true then
if DataModule2.ADOTable5.State in [dsEdit,dsInsert] then
ShowMessage('You should save your new information!')
else
begin
DataModule2.ADOTable5.Delete;
DataModule2.ADOTable5.UpdateBatch;
end;
end;


ولی بازم همون ارور و میداد وخط


DataModule2.ADOTable5.UpdateBatch;

رنگی میشد؟
باید چی کار کنم الان

SYNDROME
دوشنبه 06 اسفند 1386, 06:12 صبح
در زمان باز کردن فرمتان و زمانی که ADO را Open می کنید دو دستور زیر ر اب نویسید.


ADOQuery1.Active := True;
ADOQuery1.Properties['Unique Table'].Value := 'Tbl_Test';
ADOQuery1.Properties['Update Criteria'].Value := adCriteriaKey;

خط اول : Open کردن ADOQuery.
خط دوم : نام جدولی که می خواهید اطلاعات از آن پاک شود(البته اگر در SQL خود از Join استفاده کرده اید)
خط سوم:دقیقاً همینجوری بنویسید تا برای جستجوی رکورد برای حذف بر اساس فیلد کلید عمل جستجو انجام شود.
موفق باشید

tik_tak
دوشنبه 06 اسفند 1386, 10:49 صبح
سلام
ممنونم
ولی من با کوئری ننوشتم که !!
کد حذفمو نیگاه کنید ............!!

tik_tak
دوشنبه 06 اسفند 1386, 11:07 صبح
نمیدونم شاید تو اکسس یا دلفی باید تو ارتباط این دوتا جدول

خاصیتی رو در نظر میگرفتم یا تیک میزدم در مورد updat شدن ..نمیدونم این فقط یه حدسه !

vcldeveloper
دوشنبه 06 اسفند 1386, 11:55 صبح
مسلما استفاده از Transaction و BatchUpdate در این مثال هایی که زدید هیچ مفهومی نداره. جوابی که دوستان میدن برای اینه که شما تحقیق کنید وببینید کدومشون میتونه مشکل شما رو حل کنه، نه اینکه هر کی هر چی گفت رو شما Copy\Paste کنید توی برنامه!
اکیدا توصیه می کنم که یه کتاب خوب دلفی که توش مباحث کار با بانک اطلاعاتی را توضیح داده باشه، مطالعه کنید تا از سردرگمی در بیاید.

موفق باشید

tik_tak
دوشنبه 06 اسفند 1386, 20:40 عصر
اینadCriteriaKeyرو نمیشناسه ؟


ADOQuery1.Properties['Update Criteria'].Value := adCriteriaKey;

SYNDROME
سه شنبه 07 اسفند 1386, 07:50 صبح
اینadCriteriaKeyرو نمیشناسه ؟


ADOQuery1.Properties['Update Criteria'].Value := adCriteriaKey;

یونیت ADOInt را Use کنید.
موفق باشید

tik_tak
سه شنبه 07 اسفند 1386, 21:40 عصر
سلام
تویکی از تاپیکهای کار با پایگاه داده در دلفی به این خطا جواب داده بودن که منم این کارارو انجام دادم ولی کاملا بی فایده بود
من تو اونت
oncreat
فرمم این کدهارو اضافه کردم :


DataModule2.ADOTable5.Active:=true;
DataModule2.ADOTable5.Properties['Update Criteria'].Value := adCriteriaKey;



تو قسمت اضافه کردن رکورد به این جدول فرعی هیچ خطایی نداد طبق معمول اینجوری نوشتم :


DataModule2.ADOTable5.Insert;
.
.
.
.
.
DataModule2.ADOTable5.Post;


وقسمت کلیک دکمه دیلیت رکورد از جدول فرعیم هم این کد رو گذاشتم:


if DataModule2.ADOTable5.Locate('shomareh;name',VarAr rayOf([strtoint(edit1.text),edit2.text]),[])=true then
DataModule2.ADOTable5.Delete ;



که رو این خط همون ارور اولی رو میده :


DataModule2.ADOTable5.Delete ;

جدولام رو هم تو اکسس
فرعی<---------------------اصلی
چند<-----------به---------یک
وهر سه تیک


enforce refrential integrity
casecade update related fields
casecade delet relared records

زدم
پس واسه چی بازم ارور میده ؟

SYNDROME
چهارشنبه 08 اسفند 1386, 07:59 صبح
شما ADO خود را به یک View متصل کرده اید؟
موفق باشید

tik_tak
پنج شنبه 09 اسفند 1386, 08:58 صبح
جدول اولی یا اصلی یا فاکتور

شماره-----------قیمت فروخته شده-------نام خریدار------نام فروشنده
1-----------------3000---------------------علی------------حسن
2-----------------6000---------------------مهرداد----------محسن
3-----------------5000---------------------رضا-------------حسن

و.........



جدول دومی یا فرعی
شماره------------کدکالا----------قیمت
1------------------1001-----------2000
1------------------1002-----------1000
2----------------1020------------3000
2----------------1102------------1000
2----------------1003------------2000
و..........



از این جدول دومیه نمیشه چیزیرو حذف یا ویرایش کرد

dkhatibi
پنج شنبه 09 اسفند 1386, 11:42 صبح
در صورت عجله. جداول را از حالت Master/Detail خارج کرده
برای حذف از رویداد OnAfterDelete و ... برای دستکاری در هر دو جدول استفاده نمایید.