PDA

View Full Version : این خطا- row cannot be located



V60
یک شنبه 10 تیر 1386, 01:18 صبح
اساتید بزرگ سلام
لطفا نزنید!!!! ده بار تو سایت سرچ کردم و همه مسائلی که گفته شده بود را رعایت کردم ولی باز هم یا این ایراد را می گیره یا این ایراد را می ده


Insufficient key column information for updating or refreshing

البته یک چیزهایی می دونم !!! من این کارها را کرده ام
از دلفی 7 استفاده می کنم و اکسس 2003
یک فرم دارم روش یک adoqouery قرار داده ام در این کوری این کد را نوشته ام


select BalanceSheet.id,CompanyName.id,BalanceSheet.name
from BalanceSheet right join CompanyName on (BalanceSheet.id = CompanyName.id)

و یک دیتا اکسس و یک دیبی گرید روی فرم قرار داده ام ، وقتی این کوری را باز می کنم ، همانطور که از کد معلومه ((( البته هر دو تا جدولی که دارم فیلد کلیدی براشون تعریف کرده ام که همان id است ))) تمام رکوردهای جدول companyname را باز می کند و به ازای آن اگر جدول balancesheet رکوردی داشت که id برابری داشت آن را در برابر خود قرار می دهد و اگر نداشت آن را خالی نشان می دهد . مشکل من وقتی شکل می گیرد که می خواهم آن رکوردهای خالی را پر کنم ، اگر فیلد balancesheet.id را تغییر دهم row cannot be located را نشان می دهد که به معنی این است که این رکورد تغییر کرده و نمی تونم پیداش کنم من از این کد هم که اساتید گذاشته بودند استفاده کردم :


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

ولی افاقه نکرد .
و اگر بخواهم فیلدی غیر از فیلد کلیدی را از جدول balancesheet تغییر دهم ، ان خطای دومی را می دهد.
حالا نمی دونم کجای کار گیر داره؟؟؟؟

m-khorsandi
یک شنبه 10 تیر 1386, 08:09 صبح
وقتی RecordSet ات حاصل یک Join هست، باید مشخص کنی که قصد داری چه جدولی رو ویرایش/حذف/درج کنی، برای این کار میتونی از ویژگی داینامیک Unique Table استفاده کنی.



ADOQuery1.Properties['Unique Table'].Value := 'base_table';


http://msdn2.microsoft.com/en-us/library/ms680834.aspx

V60
یک شنبه 10 تیر 1386, 11:33 صبح
آقای خرسندی عزیز
نشد که نشد!!!
من این کد را اضافه کردم ولی بعد از اجرا باز هم همان مشکل را می گیرد.


ADOQuery1.edit;
ADOQuery1.Properties['Unique Table'].Value := 'Balancesheet';
ADOQuery1.Properties['Update Criteria'].Value := adCriteriaKey;
ADOQuery1BalanceSheetid.AsString:='990';
ADOQuery1.post;

ولی باز همان ارور را می دهد که ردیف را پیدا نمی کند !! این خط را کجا باید اضافه کنم ، البته من خط زیریش را حذف کردم و حتی با بالایش جابه جا هم کردم ولی باز هم همان خطا را می دهد ، از توجهتان ممنون.

SYNDROME
یک شنبه 10 تیر 1386, 13:08 عصر
با سلام

آقای خرسندی عزیز
نشد که نشد!!!
من این کد را اضافه کردم ولی بعد از اجرا باز هم همان مشکل را می گیرد.


ADOQuery1.edit;
ADOQuery1.Properties['Unique Table'].Value := 'Balancesheet';
ADOQuery1.Properties['Update Criteria'].Value := adCriteriaKey;
ADOQuery1BalanceSheetid.AsString:='990';
ADOQuery1.post;

ولی باز همان ارور را می دهد که ردیف را پیدا نمی کند !! این خط را کجا باید اضافه کنم ، البته من خط زیریش را حذف کردم و حتی با بالایش جابه جا هم کردم ولی باز هم همان خطا را می دهد ، از توجهتان ممنون.
کد را به شکل زیر بعد از True کردن Active مربوط به ADO در اول برنامه و فقط یک بار بنویسید.


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

V60
یک شنبه 10 تیر 1386, 18:51 عصر
سلام
باز هم نشد و همون ایراد را می گیره
آقای SYNDROME من کاری را که شما گفتید را هم انجام دادم یعنی روی فرمم دو تا دکمه قرار دادم در دکمه اول کوری را فعال کرده و اون کدها را نوشتم و در دکمه دوم کوری را در حالت edit قرار داده و مقدار id را برای جدول balancesheet تغییر دادم و دستور post را انجام دادم ولی باز هم ایراد گرفت.

ببینم اصلا شما اگر بخواهید دو جدول را right یا left join بکنید و در یک کوری قرار دهید و بعد مقدار ها را تغییر بدهید چه کار می کنید ؟ یکی این سوال من را جواب بده ؟ اصلا این کار اصول نیست ؟؟؟ یعنی من باید توی یک جدول تغییر بدهم و بعد با استفاده از locate بگردم توی جدول دیگر پیدا کنم و اگر نبود append کنم ؟؟ من این کار را می تونم بکنم ولی اصلا به نظرم اصولی نیست؟
برسید به داد این ناتوان گیج شده !!!!

saman020
یک شنبه 10 تیر 1386, 18:57 عصر
یک فیلد عددی autoincreament به جدول اضافه کنید

m-khorsandi
دوشنبه 11 تیر 1386, 07:49 صبح
من سعی کردم وضعیتی مشابه وضعیت شما رو ایجاد کنم، ایجاد هم شد ولی مشکلی وجود نداشت. یعنی دقیقاً یک کوئری با دو جدول که Right Join هم شدند، موقع درج/حذف/ویرایش به راحتی کار می‌کند. از دو تا جدول تو Query ات استفاده کردی، ساختار اونها رو اینجا بذار.

SYNDROME
دوشنبه 11 تیر 1386, 13:17 عصر
با سلام
شما در جداولتان فیلد از نوع کلید تعریف کرده اید؟

حمیدرضاصادقیان
دوشنبه 11 تیر 1386, 19:02 عصر
دوست عزیز من این مشکل براییم پیش اومد وقتی جدولم رو نگاه کردم دیدم فیلدهام کلید نداره و به همین خاطر این خطا رو میگرفتم.وقتی که کلیدها رو روی جدولم قرار دادم مشکل حل شد.

V60
دوشنبه 11 تیر 1386, 23:32 عصر
سلام
من در هر جدول یک فیلد کلیدی دارم و آن هم همان id است .
آقای خرسندی عزیز ، همانطور که می بینید در اول تاپیک از دو تا جدول استفاده کرده ام ،همانطور که می بینید چون از right join استفاده کردم رکوردهای متناظر با هر id در جدول اول اگر در جدول دوم وجود نداشته باشند ، بازهم برای کوری یک رکورد دیده می شود ، حالا مشکل من اینه که می خواهم در این کوری edit انجام بدهم و اونجایی که رکوردی در جدول دوم وجود ندارد یک id تعریف کنم ولی نشد و این ایراد را می گیره ، ساختار جدول را هم ارسال می کنم .

m-khorsandi
سه شنبه 12 تیر 1386, 07:55 صبح
select BalanceSheet.id,CompanyName.id,BalanceSheet.name
from BalanceSheet right join CompanyName on (BalanceSheet.id = CompanyName.id)


تو این کوئری از جدول BalanceSheet فیلدی به نام name انتخاب شده در صورتیکه تو جدول BalanceSheet چنین فیلدی وجود نداره!

V60
سه شنبه 12 تیر 1386, 17:29 عصر
آقای خرسندی
بایدببخشید ، من این فیلد را تغییر داده ام و اضافه کرده ام .
با تشکر ولی اشکال مربوط به این نمی باشد ، چون بدون خطا کوری open می شود.
متشکرم و منتظر.

SYNDROME
سه شنبه 12 تیر 1386, 22:12 عصر
با سلام

آقای خرسندی
بایدببخشید ، من این فیلد را تغییر داده ام و اضافه کرده ام .
با تشکر ولی اشکال مربوط به این نمی باشد ، چون بدون خطا کوری open می شود.
متشکرم و منتظر.
اگر می توانی Sourceرا به همراه بانک قرار بده تا سریعتر مشکلت حل شود.

V60
چهارشنبه 13 تیر 1386, 00:00 صبح
سلام
هر کاری کردم مدیریت ضمیمه باز نشد نمی دونم چرا !!! pop menu blocked
ولی خیلی ساده اش اینه که روی فرم دو تا کلید است یک دیتا سورس یک کوری یک دبی گرید که درون کدهای کلید ها اینگونه نوشته شده


procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.close;
ADOQuery1.open;
ADOQuery1.Properties['Unique Table'].Value := 'Balancesheet';
ADOQuery1.Properties['Update Criteria'].Value := 0 ;

end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.edit;
ADOQuery1BalanceSheetid.AsString:='990';
ADOQuery1.post;
end;

و در کوری هم این کد نوشته شده


select *
from BalanceSheet right join companyname on (BalanceSheet.id=companyname.id)

بعد روی کوری دابل کلیک کرده ام و فیلدهای balancesheet.id و companyname.id را اضافه کرد ه ام
بعد برنامه را اجرا می کنم
کلید اول را می زنم
می رم روی دیبیگرید و یکی از رکوردهایی که در companyname وجود دارد و در balancesheet وجود ندارد را انتخاب می کنم و سپس کلید دو را فشار می دهم ، و اینجاست که ایراد می گیرد
خیلی متشکر

m-khorsandi
چهارشنبه 13 تیر 1386, 10:23 صبح
بین جدول CompanyName و BalanceSheet از RightJoin استفاده کردی تا اگه رکورد مرتبطی درBalanceSheet وجود نداشت، اطلاعات CompanyName را نمایش دهد و در کنار آن هم فیلد خالی BalanceSheet را که اصلاً وجود ندارد، نشان دهد. الان می‌خواهی یکی از رکوردها که وجود فیزیکی ندارد را ویرایش کنی!!؟؟

V60
شنبه 16 تیر 1386, 18:31 عصر
اره ، دقیقا همینه ، یعنی نمی شه ؟؟
چطور می شه این کاری را که من می خواهم انجام بدم را انجام بده ؟؟؟؟
باید از دو تا adotable استفاده کنم ؟؟؟ و کلی کد بنویسم؟
البته من در این روش برای جدول balancesheet وقتی می خواستم اضافه کنم حتما به فیلد کلیدی مقدار می دادم ، حالا چی کار کنم؟

V60
جمعه 13 مهر 1386, 22:47 عصر
سلام
آقای خرسندی من هنوز جواب این سوال را دریافت نکرده ام . چه کار باید بکنم تا این مشکل را بتوانم حل کنم، آیا حتما باید از قبل آن رکورد را ایجاد کنم ؟؟ به نظرم این کار خیلی ابلهانه می اد چون ممکنه که من این رکورد را ایجاد کنم ولی وقتی کوری گرفتم رکورد جوین شده را ثبت نکنم آن وقت یک رکورد اضافه شده است به جدول بالانس . درست است ؟ حالا من چه کنم که این پیش نیاد

m-khorsandi
شنبه 14 مهر 1386, 07:38 صبح
جوابی که دادم رو یکبار دیگه با دقت بخون.

sql_qassem
سه شنبه 23 مهر 1387, 21:52 عصر
من هم اين مشكل رو توي ثبت بعد از درج ركورد جديد دارم. البته قبلا كار مي كرده ولي امروز مشكل دارم.
توضيح : اينكه من در فرم ورود اطلاعاتم دو فيلد رو از دو فرم ديگه پر مي كنم .
يكي راهنمايمون كنه . مرديم بابا. از بس كه توي كل اينترنت گشتيم .
يكي مي گفت اين مشكل رو با اين روش حل كرده كه : اول كه درج كرده يك مقدار موقت به فيلد كليد داده و ثبت كرده و بعد كنترل كرده در صورتي كه كاربر منصرف شده اون رو حذف كرده . اما اين براي من امكان پذير نيست
چون من براي فرم ورود اطلاعاتم تمپليت نوشتم و روش بالا يعني به هم زدن كل تمپليت . از طرفي كليد هاي تمام جداول من هم نام نيستند كه بتونم تازه با قبول اين ريسك مشكل رو حل كنم
از طرفي چون من از اين تمپليت در سيستم هاي ديگه استفاده مي كنم . توسعه هاي بعدي اين تمپليت رو نمي تونم روي سيستم فعليم به روز كنم.

SYNDROME
چهارشنبه 24 مهر 1387, 06:36 صبح
به پست شماره 6 لینک زیر یک نگاه بندازید.
http://barnamenevis.org/forum/showthread.php?p=614404&posted=1#post614404
موفق باشید