PDA

View Full Version : چرا اين دستور كار نمي كند ؟



tikzahraaran
جمعه 08 آذر 1387, 00:19 صبح
با سلام دوباره

من مي خوام از جدولم كه اطلاعات حسابداري در آن ذخيره شده است هنگامي كه دكمه ديدن سند را مي زنيم ركوردهايي كه مربوط به يك شماره سند خاص است را به من نشان دهد ولي با پيام List Index Out Boands مواجه مي شوم لطفا به من بگوييد اشكال اين دستور در چي است


Dviwe.ADOQuery1.close;
Dviwe.ADOQuery1.SQL.Clear;
Dviwe.ADOQuery1.SQL.Add(' INSERT INTO temp_art SELECT * FROM movaghat where shomaresanad=:shomaresanad ');
Dviwe.ADOQuery1.Parameters.ParamValues['shomaresanad']:=Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value;
Dviwe.ADOQuery1.ExecSQL;

لازم به ذكر است كه شماره سند را از دي بي گريدي كه ليست كليه سندها را نشان مي دهد انتخاب مي كنم
البته بايد ذكر كنم كه ركوردهاي خواسته شده به جدول Temp_art انتقال داده مي شود ولي پس از آن پيام List Index Out Boands نمايش داده مي شود

متشكرم

amin_alexi
جمعه 08 آذر 1387, 11:47 صبح
سلام
من فکر کنم مشکل از این خط باشه !!

Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value;

Mohammad_Mnt
جمعه 08 آذر 1387, 13:17 عصر
Dviwe.ADOQuery1.Parameters.Params[0]:=Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value;
Dviwe.ADOQuery1.Open;

tikzahraaran
جمعه 08 آذر 1387, 15:25 عصر
sdeqweweqwe

tikzahraaran
جمعه 08 آذر 1387, 15:35 عصر
ضمن تشكر از شما
اگر اين خط را در برنامه بنويسم به عبارت
params[0] گير ميده و اگر خط اول را طبق نوشته خودم پيش برم و خط دوم را
open بذارم خطاي زير را مي دهد CommandText does not return a result set



Dviwe.ADOQuery1.Parameters.Params[0]:=Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value;
Dviwe.ADOQuery1.Open;


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

سلام
من فکر کنم مشکل از این خط باشه !!

Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value;

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

amin_alexi
جمعه 08 آذر 1387, 17:26 عصر
با توجه به متن Error تنها بخشی که تو این چند خط میبینم از Index استفاده شده همین قسمته ! شما در DBGrid اطلاعات دارید !
یعنی این دستورات قبل از مقدار دهی به DbGrid اجرا میشه یا بعد از اون !!

tikzahraaran
جمعه 08 آذر 1387, 21:03 عصر
با توجه به متن Error تنها بخشی که تو این چند خط میبینم از Index استفاده شده همین قسمته ! شما در DBGrid اطلاعات دارید !
یعنی این دستورات قبل از مقدار دهی به DbGrid اجرا میشه یا بعد از اون !!

بازم سلام
من در دي بي گريد اطلاعات دارم ببينيد روال كار بدين شرح است كه من ابتدا در فرم صدور سند چند آرتيكل يا همان ركورد را وارد مي كنم و هنگام ثبت آن سند اطلاعاتم وارد دو تا تيبل مي شود يكي از آنها كه شامل كليه ركوردهاي آن سند است كه مثلا شش تا ركورد با شماره سند 3 ذخيره شده است و در دسترس كاربر نيست و نمي تواند كليه اطلاعات آن را به صورت معمولي ببيند و در تيبل ديگر كه جمع دو ستون گريد ( بدهكار و بستانكار ) و شماره سند و تاريخ آن سند ذخيره مي شود كه در دسترس كاربر است و مي تواند آن را ببيند حال من مي خوام وقتي كه مثلا در دي بي گريدي كه اطلاعاتش را از تيبل دوم مي گيرد كليك كرده و مثلا سند شماره 3 را انتخاب كرده است با زدن دكمه ديدن سند كليه ركوردهايي كه شماره سند آنها 3 است و در جدول اول قرار دارند در فرم ديدن گزارش نشان داده شود

بازهم از كمك شما متشكرم
:قلب:

amin_alexi
شنبه 09 آذر 1387, 07:47 صبح
سلام
در این جور مواقع فکر نمی کنم بیشتر از این بشه کمک کرد !
آخه سورس که دست ما نیست که Trace کنیم و ببینیم کجا ایراد داره ...
شما سعی کن به جای
Fields[0].Value; از معادل این دستور مثل FieldByName('FldName').AsInteger استفاده کن ببین بازم Error میده !

Mohammad_Mnt
شنبه 09 آذر 1387, 18:53 عصر
دقیقا" توی کدوم خط ایراد می گیره؟
+ اون Open که نوشتم را پاک کنید، از همون ExecSql استفاده کنید

mafazel
یک شنبه 10 آذر 1387, 07:43 صبح
سلام دوست عزیز
با نظر amin_alexi موافقم. به احتمال بسیار زیاد Dataset ی که DBGrid1 به اون وصله باز نشده.
یعنی مشکل از Smovaghat.DBGrid1.DataSource.DataSet.Fields[0].Value است. برای Trace برنامه همه دستورات رو حذف کنید و دستور زیر رو بجای اونا امتحان کنید:


ShowMessage(DBGrid1.DataSource.DataSet.Fields[0].AsString);
اگر همون خطا رو داد مشکل یقینا همینه. بنابراین اول اون DataSet رو Open کنید بعد دستورات مورد نظرتون رو اجرا کنید.

چند تا مورد میگم که بنظر من ریسک خطای برنامه تون رو کم میکنه:
1- چرا در Query.SQL اول Clear میکنید بعد Add می کنید؟ خوب یکباره Text رو مقدار بدید.
2- چرا پارامتر تعریف می کنید بعد همونجا پارامتر رو مقدار میدید؟ خوب یکباره مقدار بدید.
3- پارامتر همنام با فیلد تعریف نکنید.
4- چرا سراغ DBGrid.DataSource.DataSet میروید؟ خوب مستقیما سراغ مثلا Table1 بروید.
5- برای کد نویسی زیباتر و راحت تر از نامگذاری مناسب تر استفاده کنید. مثلا نام فرمهاتون رو با Frm شروع کنید مثلا FrmDView یا FrmSmovaghat
من کد زیر رو براتون پیشنهاد می کنم(با فرض اینکه فیلد شماره سند عددی است):


var
S: string;
begin
Dviwe.ADOQuery1.Close;
S := Smovaghat.Table1.Fields[0].AsString;
S := ' INSERT INTO temp_art SELECT * FROM movaghat where shomaresanad='+S;
Dviwe.ADOQuery1.SQL.Text := S;
Dviwe.ADOQuery1.ExecSQL;

mahtab_mmm85
یک شنبه 17 آذر 1387, 11:10 صبح
ايراد دستور شما در جمله Insert شما است يا با Insert را حذف كنيد و يا در انتهاي جمله يك Select از جدول جديد بزنيد و به جاي ExceSql از OPen استفاده كنيد