ورود

View Full Version : خطا در مورد دستور LOCAT



tik_tak
سه شنبه 23 مهر 1387, 18:57 عصر
با سلام من تو برنامه ام(دلفی 7)(sql2000) تو یکی از فرمهام چندتا کوئری استفاده کردم.تویه این کوئریهام از جدولایه مختلف استفاده کردم ولی وقتی این دستور رو واسه یکی از جدولام مینویسم ارور میده این جدولم تویکی از کوئری هام هست
این دستور :


if datamadoule1.adotable1.locate('id',d,[]) then
listbox1.items.add(true);

این ارور:


project project1.exe raised exception class ELOeException with message'Either BOF or EOF is True,or the current record has been deleted.Requested operation requires a current record'.process stopped.use step or Run to continue.


ولی نمیدونم چرا درحالیکه این دستوره درسته
وازاین دستور تو فرمهای دیگه م درموردهمین جدول استفاده کردم و اروری ام در کارنبوده

tik_tak
سه شنبه 23 مهر 1387, 22:44 عصر
IF DataModule1.datasource1.DataSet.BOF=true or DataModule1.datasource1.DataSet.eof=true then
else
if DataModule1.adotable1.locate('id',d,[]) then
); ListBox1.Items.add('true'

وقتی این قطعه کد رو بهجای اون کد بالایی مینویسم اون ارور نمیاد و این دستور لیست باکسم اجرا نمیشه
ولی میخوام دستور لیست باکس اجرا بشه
چیکارکنم که ازاین حالت
bof
و
eof
خارج بشه و ترو نشه ودستور اجرا بشه؟
کوئری هامم این شکلیه :


s:='...........';
DataModule1.ADOQuery1.Active:=False;
DataModule1.ADOQuery1.SQl.Clear;
DataModule1.ADOQuery1.SQL.Add(s);
DataModule1.ADOQuery1.Active:=true;

تویکی از تایپیکها درمورد این خطا گفته بود دستور بالایی رو اینجوری بنویس که این راهم امتحان کردم ولی بازم همون مشکل قبل هست


s:='...........';
DataModule1.ADOQuery1.Active:=False;
DataModule1.ADOQuery1.SQl.Clear;
DataModule1.ADOQuery1.SQL.text:=s;
DataModule1.ADOQuery1.Active:=true;

ghabil
چهارشنبه 24 مهر 1387, 01:07 صبح
اینو قبل از کدت بنویس جواب رو بگو (بعد از Active=true):



ShowMessage(IntToStr(Adoquery.RecordCount));

tik_tak
چهارشنبه 24 مهر 1387, 12:08 عصر
با سلام
این کوئری 1 مه :


procedure Tform1.query1();
var
s:string;
begin
s:='select * from table1,Table2 where Table2.co_g=table1.co_g AND table1.state=0 AND Table1.co_m IN (select co_m from Table3 where co_c='+Edit1.Text+') AND Table1.counter NOT IN (select counter from table4 where state=0)';
DataModule1.ADOQuery1.Active:=False;
DataModule1.ADOQuery1.SQl.Clear;
DataModule1.ADOQuery1.SQL.text:=s;
DataModule1.ADOQuery1.Active:=true;
end;


مثلا جواب این کوئری میشه 20 سطر ،اون شو مسیجم 20 رو نشون میده
اینم دومین کوئریمه :


procedure Tform1.query2(d:integer);
var
s:string;
begin
s:='select * from table5,table4 where table4.co_gh=table5.co_gh AND table4.counter='+inttostr(d);
DataModule1.ADOQuery2.Active:=False;
DataModule1.ADOQuery2.SQl.Clear;
DataModule1.ADOQuery2.SQL.text:=s;
DataModule1.ADOQuery2.Active:=true;
end;

این کوئریم مثلاً اگه شامل 5 سطز باشه اون شو مسیج 5 رو نشون میده

درضمن من این دستو رو اینجا نوشتم آ:


ShowMessage('Q1:'+IntToStr(DataModule1.Adoquery2.R ecordCount)+' Q2:'+IntToStr(DataModule1.Adoquery1.RecordCount));

IF DataModule1.datasource1.DataSet.BOF=true or DataModule1.datasource1.DataSet.eof=true then
else
if DataModule1.adotable1.locate('id',d,[]) then
);


مطمئنم کوئریام درستن چن وقتی یه دی بی گرید میارم و اون وصلش میکنم به کوئری همون چیزی رو که میخوام نشون میده ولی این ارور نمیزاره ، همه چیزو خراب کرده نمیزاره اون دستور locat اجرا بشه !!

ghabil
چهارشنبه 24 مهر 1387, 13:30 عصر
قبل از Lcoate کردن جدولت رو یکبار Refresh کن ببین تاثیری میکنه :-\

tik_tak
چهارشنبه 24 مهر 1387, 13:38 عصر
datamadoule1.adotable1.refresh;

refresh
کردم بی تاثیر بود

بازم Eof یا bof ، میشن true که اون شرط اجرا نمیشه !

tik_tak
چهارشنبه 24 مهر 1387, 20:42 عصر
کسی نیست بگه باید چیکارکنم؟؟؟؟؟؟؟؟؟؟؟

SYNDROME
پنج شنبه 25 مهر 1387, 06:35 صبح
زمانی که به دستور Locate رسید :
1-Active مربوط به ADO را چک کن.
2-تعداد رکوردهای ADO را چک کنید.
*اگر فیلدی به aDO اضافه کرده اید پاک کنید.
*اگر در رویدادهای ADO چیزی نوشته اید پاک کنید.
*تعداد فیلدهایی که دستور داخل ADO بر می گرداند را چک کنید و ببینید ID جزء آنها است.
مراحل فوق را تست کنید و نتیجه را در اینجا قرار دهید.
موفق باشید

tik_tak
پنج شنبه 25 مهر 1387, 07:37 صبح
با سلام

1.


datamadoule1.adotable1.active=TRUE


2.


datamadoule1.adotable1.RecordCount=صفر

درحالی که بیش از 100 تا رکورد تو جدولمه !!

*فیلدی اضافه نکردم

*تو رویداداشم چیزی ننوشتم

*تعداد فیلدایی که برگردوند درست بود


datamadoule1.adotable1.fieldcount=15

نمیدونم با چه دستور نام فیلدارو نشون بدم ولی تعدادش که درست بود پس حتماً
id
بینشون بوده....

فقط مورد دومی که تعداد رکوردایه جدولمو 0 نشون میده ایراد داره !

در ضمن این جدول table 1 خودش دیتیله یعنی خاصیت مستر سورسش وصله به یه جدوله مستر دیگه

SYNDROME
پنج شنبه 25 مهر 1387, 21:37 عصر
با سلام

1.


datamadoule1.adotable1.active=TRUE


2.


datamadoule1.adotable1.RecordCount=صفر

درحالی که بیش از 100 تا رکورد تو جدولمه !!

*فیلدی اضافه نکردم

*تو رویداداشم چیزی ننوشتم

*تعداد فیلدایی که برگردوند درست بود


datamadoule1.adotable1.fieldcount=15

نمیدونم با چه دستور نام فیلدارو نشون بدم ولی تعدادش که درست بود پس حتماً
id
بینشون بوده....

فقط مورد دومی که تعداد رکوردایه جدولمو 0 نشون میده ایراد داره !

در ضمن این جدول table 1 خودش دیتیله یعنی خاصیت مستر سورسش وصله به یه جدوله مستر دیگه
مستر دیتله را قطع کنید و دوباره برنامه را تست کنید.
اگر باز هم نشد این بار یک aDO جدید بگذارید و فقط Connection آن را متصل کنید و دستور SQL را نویسید و Locate را تست کنید.
نتیجه ها را اینجا قرار دهید.
اگر باز هم جواب نگرفتید برنامه را خود را اینجا قرار دهید تا تاست شود.
موفق باشید

tik_tak
پنج شنبه 25 مهر 1387, 22:28 عصر
سلام
این مشکل و یکی ازدوستام حل کردن
اشکال از مسترسورس بود در واقع خاصیت مستر سورس
اگه این خاصیت نباشه
دستور locate جواب میده ولی چن من میخوام که باشه پس به جایه locate کوئری مینویسم اینجوری دیگه اون خطاهه نمیاد

بازم ممنونم