PDA

View Full Version : مشکل درگرفتن میانگین



a-azad
چهارشنبه 30 مرداد 1387, 07:16 صبح
سلام.من می خواهم میانگین یک فیلد وتعداد رکوردها تحت شرایط خاص بدست بیارم
کدم به این صورت نوشتم

procedure TForm8.TntSpeedButton1Click(Sender: TObject);
begin
with ADOQuery1 do begin
Close;
SQL.Clear;
ADOQuery1.sql.Add('select avg(repairtime) average from table2 where nane1=:param1 and name2=:param2 and date1=:param3');
Parameters.ParamValues['param1']:=ComboBox1.Text;
Parameters.ParamValues['param2']:=ComboBox2.Text;
Parameters.ParamValues['param3']:=edit9.Text;
ADOQuery1.open;
tntedit2.Text:=IntToStr(ADOQuery1.RecordCount);
TntEdit3.text:=inttostr(ADOQuery1.FieldByName('ave rage').Asinteger);
end;
end;
ولی خطا می گیره می گه field distance در adoquery1وجودندارد
اصلاًربطی نداره
لطفاًراهنمایی کنید

Hsimple11
چهارشنبه 30 مرداد 1387, 10:14 صبح
سلام.من می خواهم میانگین یک فیلد وتعداد رکوردها تحت شرایط خاص بدست بیارم

average را زیادی نوشته اید. تابع AVG مخفف همان Average، معدل رکوردهای SELECT شما را حساب میکند و برای دادن نام مجازی (ALIAS) هم میتونید از As استفاده کنید :


SELECT AVG(FieldName) As Avg1 From MyTable

a-azad
چهارشنبه 30 مرداد 1387, 12:54 عصر
سلام .چه ربطی داشت..درست نشد بازم

Hsimple11
چهارشنبه 30 مرداد 1387, 13:07 عصر
فیلدی که میخواهید از اون میانگین بگیرید repairtime است؟

در نوشتن SQL خود دقت کنید. به فواصل و پارامترها.

a-azad
چهارشنبه 30 مرداد 1387, 14:39 عصر
می شه درستش کنین .اس .کیو.ال اش چک کردم تو query anlyser.مشکلی نداشت.

Vahid_moghaddam
چهارشنبه 30 مرداد 1387, 14:42 عصر
می شه مقدار sql.text رو بذارید؟

Hsimple11
چهارشنبه 30 مرداد 1387, 16:23 عصر
کدی رو که در پست شماره 2 نوشتم رو در یک برنامه جدید امتحان کنید.

اگر مشکل حل نشد، سورس برنامه تان را آپلود کنید.

SYNDROME
چهارشنبه 30 مرداد 1387, 20:11 عصر
ولی خطا می گیره می گه field distance در adoquery1وجودندارد
اصلاًربطی نداره
لطفاًراهنمایی کنید
پیغام فوق زمانی اتفاق می افتد که :
1- فیلد داخل بانکتان وجود نداشته باشد.
2-در Select مربوط به aDO به جای * نام فیلدها را نوشته باشید و نام فیلد مورد نظر نباشد.
3-فیلدها را به خود aDO اضافه کرده باشید و فیلد مورد نظر جزء فیلدها نباشد.
آیا شما نکات فوق را چک کرده اید؟
موفق باشید

a-azad
پنج شنبه 31 مرداد 1387, 13:36 عصر
پیغام فوق زمانی اتفاق می افتد که :
1- فیلد داخل بانکتان وجود نداشته باشد.
2-در Select مربوط به aDO به جای * نام فیلدها را نوشته باشید و نام فیلد مورد نظر نباشد.
3-فیلدها را به خود aDO اضافه کرده باشید و فیلد مورد نظر جزء فیلدها نباشد.
آیا شما نکات فوق را چک کرده اید؟
موفق باشید
بله همش چک کردم همش درست تعجب من ازاینجاست

Hsimple11
پنج شنبه 31 مرداد 1387, 14:29 عصر
همانطور که گفتم یک نمونه کوچک از برنامتان را آپلود کنید.

a-azad
پنج شنبه 31 مرداد 1387, 15:23 عصر
وقتی که کدم اینجوری ام می نویسم مشکل داره.یعنی وقتی یکی از فیلدها selectمی کنم
.بازم همان خطا قبل می ده.مشکلش تو select

procedure TForm8.TntSpeedButton1Click(Sender: TObject);
begin
with ADOQuery1 do begin
Close;
SQL.Clear;
ADOQuery1.sql.Add('select repairtime from table2 where nane1=:param1 and name2=:param2 and date1=:param3');
Parameters.ParamValues['param1']:=ComboBox1.Text;
Parameters.ParamValues['param2']:=ComboBox2.Text;
Parameters.ParamValues['param3']:=edit9.Text;
ADOQuery1.open;
tntedit2.Text:=IntToStr(ADOQuery1.RecordCount);
);
end;
end;
به جای repairtimeهرکدام از فیلده تیبلم بزارم بازم همان خطا می گیره.میگه فلان فیلد توadoqueryنیست.درصورتی هست
حالا اگر به جای select فیلد خاص select *استفاده کنم recordcount جواب میده.
لطفاًبه من کمک کنید

procedure TForm8.TntSpeedButton1Click(Sender: TObject);
begin
with ADOQuery1 do begin
Close;
SQL.Clear;
ADOQuery1.sql.Add('select * from table2 where nane1=:param1 and name2=:param2 and date1=:param3');
Parameters.ParamValues['param1']:=ComboBox1.Text;
Parameters.ParamValues['param2']:=ComboBox2.Text;
Parameters.ParamValues['param3']:=edit9.Text;
ADOQuery1.open;
tntedit2.Text:=IntToStr(ADOQuery1.RecordCount);

end;
end;

Hsimple11
پنج شنبه 31 مرداد 1387, 16:34 عصر
چرا بعد از* SELECT کلمه Average؟؟؟!!

پیشنهاد میکنم در تالار SQL SERVER در همین سایت در مورد SELECT و سایر دستورات SQL ابتدا جستجو بفرمایید.

a-azad
پنج شنبه 31 مرداد 1387, 21:44 عصر
چرا بعد از* SELECT کلمه Average؟؟؟!!

پیشنهاد میکنم در تالار SQL SERVER در همین سایت در مورد SELECT و سایر دستورات SQL ابتدا جستجو بفرمایید.
ببخشید اشتباه تایپی بود الان درستش کردم

a-azad
شنبه 02 شهریور 1387, 07:58 صبح
کل برنامه ام خواستم upload کنم .failشد فقط آن unit گذاشتم

SYNDROME
شنبه 02 شهریور 1387, 20:08 عصر
بر روی aDO دابل کلیک کنید و کلیه فیلدهایی که به ADO اضافه شده است را پاک کنید.
موفق باشید

a-azad
یک شنبه 03 شهریور 1387, 07:17 صبح
بر روی aDO دابل کلیک کنید و کلیه فیلدهایی که به ADO اضافه شده است را پاک کنید.
موفق باشید
سلام .همه فیلدها delet کردم.ولی برنامه runمی کنم خطا می دهد
can not perform this operation on closed dataset

بااینکه adoqueyمن active=true لطفاًراهنمایی کنید

a-azad
یک شنبه 03 شهریور 1387, 07:38 صبح
سلام کدم مشکل دستوری نداره؟

SYNDROME
یک شنبه 03 شهریور 1387, 18:52 عصر
سلام کدم مشکل دستوری نداره؟
نمی توان بدون اجرا و تست گفت.
ولی فکر نکنم مشکل خاصی داشته باشد.
اجرا کنید اگر مشکلی بود مطرح کنید.
موفق باشید

a-azad
یک شنبه 03 شهریور 1387, 21:03 عصر
نمی توان بدون اجرا و تست گفت.
ولی فکر نکنم مشکل خاصی داشته باشد.
اجرا کنید اگر مشکلی بود مطرح کنید.
موفق باشید
سلام .همه فیلدها delet کردم.ولی برنامه runمی کنم خطا می دهد
can not perform this operation on closed dataset

بااینکه adoqueyمن active=true لطفاًراهنمایی کنید

vcldeveloper
دوشنبه 04 شهریور 1387, 01:21 صبح
procedure TForm8.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
ADOQuery1.Requery();
end;
1- کد بالا ارزشی نداره.



tntedit3.text:=inttostr(ADOQuery1average.AsInteger );2- در کوئریی که SQL اش بصورت دینامیک در زمان اجرا ساخته میشه، ایجاد فیلدها بصورت استاتیک (مثل ADOQuery1average) معنی نداره. باید بجاش از AdoQuery1.FieldByName استفاده می کردید.


3- مطمئن نیستم که وقتی در زمان اجرا خصوصیت SQL یک AdoQuery را تغییر میدید، خودش پارامترها را بسازه، اگر روی ParamValues هم خطا می گیرید، باید بجاش از CreateParam استفاده کنید.



میگه فلان فیلد توadoqueryنیست.درصورتی هست4- کجا هست؟ در جدول Table2 یا در فیلدهای AdoQuery؟! باید دقت داشته باشید که AdoQuery فقط فیلدهایی که در SELECT بهشون اشاره شده رو میشناسه (یعنی فیلد محاسباتی که براش نام مستعار Average در نظر گرفتید)، نه تمام فیلدهای جدولی که دارید ازش کوئری می گیرید.

a-azad
دوشنبه 04 شهریور 1387, 08:42 صبح
procedure TForm8.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
ADOQuery1.Requery();
end;
1- کد بالا ارزشی نداره.



tntedit3.text:=inttostr(ADOQuery1average.AsInteger );2- در کوئریی که SQL اش بصورت دینامیک در زمان اجرا ساخته میشه، ایجاد فیلدها بصورت استاتیک (مثل ADOQuery1average) معنی نداره. باید بجاش از AdoQuery1.FieldByName استفاده می کردید.


3- مطمئن نیستم که وقتی در زمان اجرا خصوصیت SQL یک AdoQuery را تغییر میدید، خودش پارامترها را بسازه، اگر روی ParamValues هم خطا می گیرید، باید بجاش از CreateParam استفاده کنید.

4- کجا هست؟ در جدول Table2 یا در فیلدهای AdoQuery؟! باید دقت داشته باشید که AdoQuery فقط فیلدهایی که در SELECT بهشون اشاره شده رو میشناسه (یعنی فیلد محاسباتی که براش نام مستعار Average در نظر گرفتید)، نه تمام فیلدهای جدولی که دارید ازش کوئری می گیرید.
سلام.ممنون ازراهنمایتون .adoquery1به صورت dynamic قراردادم.وهمونطور که گفتین به صورت fieldbyname نوشتم.دیگه آن خطا نمی دهد.میانگین درست حساب می کنه ونمایش می دهد ولی مشکلی که هست در recordcount چه تعداد رکوردها یکی باشه چه n تا مقدار یک برمیگردانه.ممنون می شم که این مشکلمم برطرف کنین

vcldeveloper
دوشنبه 04 شهریور 1387, 10:42 صبح
ولی مشکلی که هست در recordcount چه تعداد رکوردها یکی باشه چه n تا مقدار یک برمیگردانه.
از کجا می دونید که تعداد رکوردهای برگردانده شده بیشتر از یک بوده و RecordCount اشتباه کرده؟!

a-azad
دوشنبه 04 شهریور 1387, 11:52 صبح
از کجا می دونید که تعداد رکوردهای برگردانده شده بیشتر از یک بوده و RecordCount اشتباه کرده؟!
سلام.آخه وقنی بیش از یک رکورد این خصوصیت دارن بازم یک برمیگردونه.مطمئنم
توی اس.کیو.ال با select countامتحان کردم

vcldeveloper
دوشنبه 04 شهریور 1387, 12:54 عصر
احتمالا در کوئری خودتون اشتباهی کردید.

a-azad
دوشنبه 04 شهریور 1387, 13:36 عصر
احتمالا در کوئری خودتون اشتباهی کردید.
اشتباهی پیدا نمی کنم.کدم مشکلی نداره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Vahid_moghaddam
دوشنبه 04 شهریور 1387, 13:56 عصر
برای اینکه مطمئن بشید پیشنهاد می کنم یه AdoQuery به فرم اضافه کنید. دستور sql رو بنویسید و اجراش کنید و این خط رو هم اینطوری بنویسید:

tntedit3.text:=inttostr(ADOQuery.fieldbyname('aver age').AsInteger);

SYNDROME
دوشنبه 04 شهریور 1387, 18:09 عصر
بهتر است DataSet خود را به یک DBGrid وصل کنید تا نتیجه دستورات را در آن نمایش دهد.
موفق باشید

a-azad
سه شنبه 05 شهریور 1387, 08:20 صبح
سلام .ممنون ازهمگی من مشکلم حل شد