PDA

View Full Version : سوال: میانگین ماهیانه



a-azad
سه شنبه 05 شهریور 1387, 08:27 صبح
سلام من می خوام میانگین در ماه حساب کنم
اینجوری می خواهم بنویسم.اگر مبدا ومقصد برابر مقدار مشخصی بود و مثلاً ماه فرودین از comboboxانتخاب شد وسال 87 بوداین 4 شرط چک کنه
حالا اگر ماه فروردین بود بیاد رکوردهایی که از تاریخ01/01/1387تا31/01/1387را نشان بده
میشه کمکم کنین این کدبنویسم
ممنون

ENG_COM1979
سه شنبه 05 شهریور 1387, 09:39 صبح
شما میتونید شرطهاتون رو توی دستور fillter استفاده کنید.
ولی متوجه نشدم که منظورتون از میانگین ماهیانه چی بود.
ADOQuery1.Filtered:=true;
ADOQuery1.Filter:='field_month='+quotedstr(combobo x1.text)+'and field_start='+quotedstr(label1.caption)+'and field_end='+quotedstr(label2.caption )+'and field_year='+quotedstr(label3.caption);
خروجی کد فوق می شه رکوردهای مورد نیاز شما که می تونید ازشون استفاده کنید.

SYNDROME
چهارشنبه 06 شهریور 1387, 06:42 صبح
اگر می خواهید رکوردهایی که در بازه یک ماه ذخیره شده اند را برگردانید 2 روش می توانید استفاده کنید.
1-از Between استفاده کنید:


Select * From Tbl_Test Where Date1 Between '1387/01/01' and '1387/01/31'

و یا فقط شرط را در سطح ماه و سال چک کنید :


Select * From Tbl_Test Where Substring(Date1,1,7) = '1387/01'

موفق باشید

a-azad
چهارشنبه 06 شهریور 1387, 07:14 صبح
سلام.
چه طوری باید بنویسم.می خوام بگم
اگر فیلد soure وdestibationبرابر مقدار خاصی بودند ومقدار فیلد ماه مثلاً فروردین بود وسال ام مثلاً87بود select آن طورشما نوشتی حساب کنه.ifها کجاباید بنویسم وچندتا؟
حالا لطفا بگید این همه if چه طوربنویسم

vcldeveloper
یک شنبه 10 شهریور 1387, 13:31 عصر
چه طوری باید بنویسم.می خوام بگم
اگر فیلد soure وdestibationبرابر مقدار خاصی بودند ومقدار فیلد ماه مثلاً فروردین بود وسال ام مثلاً87بود select آن طورشما نوشتی حساب کنه.
یعنی کل مشکلتون در نوشتن چندتا شرط در SQL هست؟!


SELECT * FROM MyTable WHERE (Destination=:param1 AND Source=:param2) AND (MyYear=:param3 AND MyMonth=:param4)
برای دادن مقدار به پارامترها هم باید از خصوصیت Parameters و متد CreateParam آن استفاده کنید که قبلا درباره اش در سایت توضیح داده شده.

a-azad
دوشنبه 11 شهریور 1387, 08:59 صبح
من منظورم چیز دیگه ای برنامه ام upload می کنم.

a-azad
سه شنبه 19 شهریور 1387, 09:19 صبح
سلام لطفاً برنامه رو نگاه کنید
لطفاً بگید کدش چطور باید بنویسم.شرطم باید اینطوری باشه.
اگر مبدا ومقصد مقدار مشخص داشت
وماه مثلا فروردین بود سال 1387 بود بیاد

مقدار date بین31/01/1387 و 01/01/ 1387
پیداکنه مشکلم روی این ماه وسالش.اینجوری کلی if باید بنویسم به ازا هر سال 12 تا if راه دیگه ای هست یا نه ؟

اصغر (پآچ)
سه شنبه 19 شهریور 1387, 14:45 عصر
سلام دوست من

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

بنظر من بهتره اول بیای سال رو بگیری و بعد از اینکه کاربر سال رو وارد کرد با یه کوئری بیای تمام مبداهات رو توی ComboBox مبدا وارد کنی و بعد از اینکه مبدا انتخاب شد بیای تمام مقاصدی که کالا از اون مبدا به اونها ارسال شده رو توسط یه کوئری جدید توی ComboBox مبدات لیست کنی و بعد از مشخص شدن سال و مبدا و مقصد بیای تمام ماه هایی که ارسال شده رو توی ComboBox ماهت لیست کنی و بعد با ترکیب کوئری موجودی که بدست آوردی از این روش با کدی که آقای غفاری بهت دادن:
Select * From Tbl_Test Where Date1 Between '1387/01/01' and '1387/01/31' ترکیب کنی نتیجه ای رو که میخوای بدست میاری
اگه هرجا مشکلی داشتی بگو کمکت کنم

موفق و موید باشی

a-azad
چهارشنبه 20 شهریور 1387, 20:33 عصر
سلام .من کدم براي فروردين اينطور نوشتم
procedure TForm12.TntSpeedButton1Click(Sender: TObject);
begin
if ((tntedit1.Text='1387') and (ComboBox3.Text='فروردين')) then
begin
with ADOQuery1 do begin
Close;
SQL.Clear;
ADOQuery1.sql.Add('select avg(repairtime) as average from table2 where nane1=:param1 and name2=:param2 and date1 between 1387/01/01 and 1387/01/31');
Parameters.ParamValues['param1']:=ComboBox1.Text;
Parameters.ParamValues['param2']:=ComboBox2.Text;
ADOQuery1.open;
tntedit3.text:=ADOQuery1.FieldByName('average').As String;
end;
end
else
showmessage('اطلاعات اين مسيرموجود نيست');
end;

اين errorميده

syntax error converting the nvarchar value '1387/01/12' to a column of data type int.
اشکالش کجاست؟

a-azad
چهارشنبه 20 شهریور 1387, 20:39 عصر
سوال 2:آیا منطقی هست این عبارت 12 بار برای هر سال تکرار بشه؟

SYNDROME
پنج شنبه 21 شهریور 1387, 06:50 صبح
سوالتان کمی نا مفهوم است؟
منظورتان از منطقی وجود دارد یعنی چی؟
موفق باشید

a-azad
پنج شنبه 21 شهریور 1387, 14:48 عصر
سلام.می شه بگین دلیل آن error که می ده چیه؟
منظورم این درست اینقدر کد طولانی نوشت؟راه حل دیگه ای نیست؟

vcldeveloper
جمعه 22 شهریور 1387, 02:59 صبح
می شه بگین دلیل آن error که می ده چیه؟دلیلش اینه که تاریخ ها را در داخل علامت نقل و قول قرار ندادید. باید میشد:

QuotedStr('1387/01/01')از اون بهتر این بود که برای اون دو تاریخ هم از پارامتر استفاده کنید تا هم دچار همچین مشکلی نشید، هم مجبور نباشید برای هر ماه کوئری را دوباره بسازید. این کار باعث میشه که هر بار SQL Server برای کوئری یک Execution Plan جدید بسازه، در حالی که اگر کوئری یک بار براساس پارامترها ساخته بشه و در مراجعات بعدی، فقط مقدار پارامترها تغییر کنه، SQL Server فقط یک بار Execution Plan میسازه و کوئری را برای مراجعات بعدی ذخیره میکنه، یعنی در مراجعات بعدی، کوئری مثل یک Stored Procedure اجرا میشه، در نتیجه سرعت اجرای کوئری هم افزایش پیدا میکنه، لازم هم نمیشه برای 12 ماه، 12 تا کوئری مختلف بنویسید.

در ضمن، این هم قبل از Open کردن کوئری بنویسید:


if not AdoQuery1.Prepared then
AdoQuery1.Prepared := True;

a-azad
شنبه 23 شهریور 1387, 09:58 صبح
دلیلش اینه که تاریخ ها را در داخل علامت نقل و قول قرار ندادید. باید میشد:

QuotedStr('1387/01/01')از اون بهتر این بود که برای اون دو تاریخ هم از پارامتر استفاده کنید تا هم دچار همچین مشکلی نشید، هم مجبور نباشید برای هر ماه کوئری را دوباره بسازید. این کار باعث میشه که هر بار SQL Server برای کوئری یک Execution Plan جدید بسازه، در حالی که اگر کوئری یک بار براساس پارامترها ساخته بشه و در مراجعات بعدی، فقط مقدار پارامترها تغییر کنه، SQL Server فقط یک بار Execution Plan میسازه و کوئری را برای مراجعات بعدی ذخیره میکنه، یعنی در مراجعات بعدی، کوئری مثل یک Stored Procedure اجرا میشه، در نتیجه سرعت اجرای کوئری هم افزایش پیدا میکنه، لازم هم نمیشه برای 12 ماه، 12 تا کوئری مختلف بنویسید.

در ضمن، این هم قبل از Open کردن کوئری بنویسید:


if not AdoQuery1.Prepared then
AdoQuery1.Prepared := True;
سلام
من مشکل اولم یعنی همون error برطرف شد.با راهنمایی شما
ولی مشکل دوم که همون نوشتن این کوئری 12 بار برای هر سال هنوز برطرف نشده
البته با اینکه اینکار 12 بار برای هر سال هم تکرار می کنم بازم جواب
نمی گیرم
نمی دونم اون پارامتری که برای تاریخ می گین چطور بنویسم
لطفاً من راهنمایی کنید

vcldeveloper
شنبه 23 شهریور 1387, 17:19 عصر
نمی دونم اون پارامتری که برای تاریخ می گین چطور بنویسم
همونجوری که Param1: و Param2: را در کد SQL استفاده کردید و بعد در کد دلفی بهشون مقدار دادید.