View Full Version : مشکل با Adoquery
mina_148m
شنبه 20 بهمن 1386, 14:37 عصر
سلام،
من این دستور رو نوشتم ولی موقع اجرا برنامه قفل می کنه
من می خوام با شرط سال، فیلدای یه جدولمو جمع کنه به من نشون بده
with form29.adoquery1 do
begin
with sql do
begin
clear;
add('select DatemoneyWithMaliyat');
add ('from tablemoney');
add ('where Year= "'+edit10.Text+'"');
end;
open;
end;
with form29.ADOQuery1 do
begin
First;
while not EOF do
begin
e:= fieldByName('DatemoneyWithMaliyat').Asstring;
u:=u+ strtoint(e);
end;
open;
end;
label11.Caption :=inttostr(u);
end;
با تشکر از لطف دوستان
vcldeveloper
شنبه 20 بهمن 1386, 15:58 عصر
بجای این کد دستور SQL خود را اصلاح کنید:
SELECT SUM(DatemoneyWithMaliyat) as SumOfPayments FROM tableMoney WHERE Year = MyValue
بجای MyValue شرط خودتون رو بنویسید.
دستور بالا مجموع فیلد DatemoneyWithMaliyat را برای رکوردهایی که شرط MyValue را دارند حساب میکنه و در فیلدی با نام SumOfPayments برگشت میده. با این کد لازم نیست خودتون حلقه بسازید و مقادیر را تک تک با هم جمع کنید.
در ضمن، اگر هم قرار بود از کد بالا استفاده کنید، نیازی نبود که مقدار فیلد DatemoneyWithMaliyat را بصورت string بگیرید و بعد آن را تبدیل به Integer کنید. می تونستید بنویسید:
e:= fieldByName('DatemoneyWithMaliyat').AsInyteger;
نکته دوم درباره کد بالا هم اینه که مقدار فیلد در شرایطی خوانده میشه که جدول تا پایان حلقه WHILE اصلا Open نشده! باید Open قبل از First نوشته می شد.
SYNDROME
شنبه 20 بهمن 1386, 16:06 عصر
حرف علی کاملا درست است با استفاده از تابع Sum می توانی به نتیجه دلخواه بررسی
کد زیر را کمی اصلاح کردم فکر کنم اینجوری درست شده باشد.
with form29.ADOQuery1 do
begin
First;
while not EOF do
begin
e:= fieldByName('DatemoneyWithMaliyat').Asstring;
u:=u+ strtoint(e);
Next;
// Open;
end;
end;
label11.Caption :=inttostr(u);
end;
موفق باشید
vcldeveloper
شنبه 20 بهمن 1386, 16:18 عصر
با استفاده از تابع Sum می توانی به نتیجه دلخواه بررسی
کد زیر را کمی اصلاح کردم فکر کنم اینجوری درست شده باشد.
وقتی از SUM استفاده میکنه، نیازی به این کد نداره، فقط کافیه دستور SQL رو بنویسه و جدول رو Open بکنه و مقدار فیلد مربوطه (در مثال من، SumOfPayments) را بخونه. همین.
mina_148m
شنبه 20 بهمن 1386, 21:05 عصر
خیلی خیلی ممنون از کمک و توجه تون
من شرمنده ام کدو به این روش تغییر دادم و لی error میده
missing sql property
form29.adoquery1.Active:=true;
form29.adoquery1.First ;
with form29.adoquery1 do
begin
with sql do
begin
clear;
add('select SUM(DatemoneyWithMaliyat) as SumOfPayments') ;
add ('from tablemoney');
add ('where Year= "'+edit10.Text+'"');
end;
open;
end;
label11.Caption :=inttostr(u);
اقای syndrome از کدتونخیلی ممنون امتحان کردم ولی یه عدد اشتباهی به من داد که نمی دونم از جمع چی بوده
تشکر
vcldeveloper
یک شنبه 21 بهمن 1386, 02:44 صبح
این دو تا اون بالا چیکار می کنند؟! وقتی هنوز به خصوصیت SQL مقداری ندادید، چطور انتظار دارید که کوئری Active بشه؟!
form29.adoquery1.Active:=true;
form29.adoquery1.First ;کدتون باید همچین چیزی بشه:
var
MySum : Currency;
begin
MySum := 0.00;
with AdoQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT SUM(DatemoneyWithMaliyat) as SumOfPayments ');
SQL.Add('FROM MoneyTable ');
SQL.Add('WHERE Year = :paramYear');
Parameters.CreateParameter('paramYear',ftInteger,p dInput,0, Edit1.Text);
//Parameters.ParamByName('paramYear').Value := Edit1.Text;
if not Prepared then Prepared := True;
Open;
if Active then
MySum := FieldByName('SumOfPayments').AsCurrency;
end;
end;
SYNDROME
یک شنبه 21 بهمن 1386, 07:52 صبح
اقای syndrome از کدتونخیلی ممنون امتحان کردم ولی یه عدد اشتباهی به من داد که نمی دونم از جمع چی بوده
البته علی آقا که جواب دادند.
فقط برای اطلاعتان بگویم که
بهترین راه برای تست فوق استفاده از یک BreakPoint و چک کردن مقادیر داخل e و u است.
هر بار که Loop شما اجرا می شود مقادیر را چک کنید تا متوجه اشکال بشوی.
به کد من نگاه کردم ولی فکر نکنم اشکالی داشته باشد.
شاید قبلا در U و یا e مقدار داشته باشید.
موفق باشید
mina_148m
یک شنبه 21 بهمن 1386, 11:50 صبح
سلام،
اقای کشاورز خیلی ممنونم از کدی که دادید
من نوشتم- شرمنده الانم به من خطای access vialation میده
من تو کده قبلیم وقتی اون دو تا کدوی که گفتید اضافیه رو نمی نوشتم هم همین خطای دسترسی رو می دهد
ببخشید من یه سواله دیگه دارم
شاید اینجا جاش نباشه ولی چون به همین سوالم مربوط می شه
با اجازتون همینجا می نویسم
من می خوام زمانی که از پرداختهام گزارش بگیره تو زمان گزارش گیری زیر ستون پرداختها
جمعشونو نشون بده منتها نمی خوام این مقدارها تو جدولم ثبت بشه فقط مو ع گزارش گیری با quickrep می خوام اجر گزارش بیاد
من چند تا qrexpr روی فرم گزارشم گزاشتم روی یه باند از نوع rbsummary و تو expreesion هر کدوم نوشتم sum(datewithmaliya - این مال یکیشه
منتها وقتی زمان طراحی preview میگیرم مقدارهاشون صفر ولی تو اجرا هیچی نشون نمیده
می خواستم لطف کنید بگید این روشم مشکلش کجاست و اگه راه بهتری هست خیلی خیلی ممنون می شم کمک کنید
با تشکر فراوان
SYNDROME
یک شنبه 21 بهمن 1386, 17:44 عصر
الانم به من خطای access vialation میده
من تو کده قبلیم وقتی اون دو تا کدوی که گفتید اضافیه رو نمی نوشتم هم همین خطای دسترسی رو می دهد
دقیقاً در زمان اجرای کدوم خط پیغام فوق داده می شود؟
موفق باشید
vcldeveloper
یک شنبه 21 بهمن 1386, 22:54 عصر
من می خوام زمانی که از پرداختهام گزارش بگیره تو زمان گزارش گیری زیر ستون پرداختها
جمعشونو نشون بده منتها نمی خوام این مقدارها تو جدولم ثبت بشه فقط مو ع گزارش گیری با quickrep می خوام اجر گزارش بیاد
من چند تا qrexpr روی فرم گزارشم گزاشتم روی یه باند از نوع rbsummary و تو expreesion هر کدوم نوشتم sum(datewithmaliya - این مال یکیشه
منتها وقتی زمان طراحی preview میگیرم مقدارهاشون صفر ولی تو اجرا هیچی نشون نمیده
مربوط به این تاپیک نیست. در بخش ابزارهای گزارش گیری مطرح کنید.
کدی که دادید
من نوشتم- شرمنده الانم به من خطای access vialation میده
روی کدوم خط پیغام میده؟ چک کنید که پارامتر مربوطه ساخته شده باشه. توی SDAC وقتی در SQL یک پارامتر ذکر بشه، نیازی به Create پارامتر نیست، خودش میسازه، فقط باید مقدارش رو تعیین کرد، اما توی ADO فکر کنم باید قبل از مقدار دهی پارامتر با CreateParam ساخته بشه (همون کاری که در کد کردم).
mina_148m
یک شنبه 21 بهمن 1386, 23:08 عصر
سلام،
من بعده این خطا ok می زنم می ره اخر برنامه نمی تونم بفهمم کدوم خط ولی بعد که دکمه اجرا می زنم خطای
parameter object is improperly defined . inconsistent or incomplete information was provided
من دقیقا" همه این دستور ها رو تو button نوشتم فقط edit1 رو edit10 کردم, تو lebel بجای inttostrکردمfloattostr
خیلی ممنونم
vcldeveloper
دوشنبه 22 بهمن 1386, 03:05 صبح
این خط رو کامنت کنید:
Parameters.CreateParameter('paramYear',ftInteger,p dInput,0, Edit1.Text);
و بجاش خط زیر را از کامنت خارج کنید:
Parameters.ParamByName('paramYear').Value := Edit1.Text;
من که با Access توی دیباگر دلفی آزمایش کردم، یه خطا در Jet Engine می داد و بعدش نتیجه رو می نوشت، اما خارج از دلفی بدون خطا و درست کار می کرد.
mina_148m
دوشنبه 22 بهمن 1386, 11:48 صبح
سلام،
اقای کشاورز از کمکتون ممنونم
بازم نشد
من نمونه برنامه رو اینجا می زارم
اگه لطف کنید نگاه کنید که من کجای برنامرو اشتباه می کنم خیلی ممنون می شم
فقط کافی تو edit10 جلوی سال مقدار 1386 بنویسیدو دکمه محاسبه رو بزنید
حمیدرضاصادقیان
دوشنبه 22 بهمن 1386, 12:23 عصر
سلام.من کد شما رو اصلاح کردم. نحوه تعریف پارامتر باید به شکل زیر باشه
where name=:nam
یعنی اول باید = بذارید بعد : .
در ضمن نام جدولتون هم اشتباه تایپ شده بود.الان درست شد.
mina_148m
دوشنبه 22 بهمن 1386, 13:15 عصر
سلام،
اقای صادقیان از کمک و دقت نظرتون خیلی ممنونم
الان دوباره اولش همون خطای دسترسی رو میده و لی اجرا که دوباره میزنم مقداره درست رو برام می یاره:عصبانی:
واقعا نمی دونم باید چیکار کنم
خیلی خیلی ممنون می شم کمکم کنید این خطا برا چیه ؟:افسرده:
حمیدرضاصادقیان
دوشنبه 22 بهمن 1386, 13:22 عصر
برای من هم این خطا رو داد. نمیدونم ظاهرا فایلی که درایور اکسس رو لود میکنه یک مشکلی داره که این پیغام خطا رو میده. ولی وقتی Exe رو اجرا کنی نباید مشکلی باشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.