PDA

View Full Version : چگونگی استفاده مشترک دو کوئری



tefos666
شنبه 25 آبان 1387, 23:56 عصر
سلام دوستان من یک فرم دارم توش یک کمبو باکس گذاشتم و با انتخاب مقدار اون کوئری رو اجرا میکنم و میگم مثلا select * from all where name= combobox1.text چون وقت نبود کدش رو ننوشتم ، برای نمایش کوئری از پارامتر استفاده کردم من وقتی خروجی گرید رو میگیرم در جدولم یک ستون اعداد دارم که میخوام sum اون رو هم بگیرم مجبور شدم یک کوئری دیگه بزنم واسه sum ولی مشکلم اینه نمیدونم چجوری sum اون جدول فیلتر شده به وسیله کمبوباکس رو بگیرم ؟




dm.qrrahgiriostan.Close;
dm.qrrahgiriostan.SQL.Clear;
dm.qrrahgiriostan.SQL.Add('select idt as ˜Ï , namet as äÇã ,ostan as ÇÓÊÇä , sum (tedad) as ÌãÚ from nahal');
dm.qrrahgiriostan.SQL.Add('where ostan= :postan group by idt,namet,ostan ');
dm.qrrahgiriostan.Parameters.ParamByName('postan') .Value:=Trim (ComboBox2.Text);
dm.qrrahgiriostan.SQL.Add('order by idt');
dm.qrrahgiriostan.Open;

dm.qrsarjam.Close;
dm.qrsarjam.SQL.Clear;
dm.qrsarjam.SQL.Add('select count(tedad)as count_tedad,sum(tedad)as sumation from nahal');
dm.qrsarjam.Open;
Label6.Caption:=DBGrid2.Fields[0].AsString;
Label4.Caption:=DBGrid2.Fields[1].AsString;
در هر حال نتیجه sum که میگیرم ربطی به فیلتر قبلیم نداره و چون select * from all مجددا زده شده نتیجه کوئری دوم بی توجه به فیلتر اول کل ستون رو میده ؟ چجوری میتونم حلش کنم ؟

با calculated feild ? ضمنا گرید من خالی و وقتی کوئری open میشه اطلاعات رو نشون میده

با union ? نتونستم کدش رو بنویسم ، شاید مساله خیلی ساده باشه ولی خودتون میدونید گاهی اوقات ذهن یاری نمیکنه و کل برنامه گیر یک مشکل سادست لطفا کمک کنید .:بامزه:
البته خودم به ذهنم رسید یک جدول temp درست کنم و هرسری که کوئری میگیرم جدول رو خالی کنم تو temp و از temp کوئری مجدد بگیرم و نتیجه رو برگردونم ولی دیدم یه مقدار غیر معقولانه به نظر میاد و الکی برنامه برای هر تراکنش کلی سنگین میشه و....

behzad_dr
یک شنبه 26 آبان 1387, 20:14 عصر
دوست عزیز ، شما دقیقا با رابطه حاصل شده از اون دستورتون (به قول خودتون فیلتر)همون برخوردی رو در رابطه با sum بکن که همیشه با جدولهای دیگه می کردی ..

ضمن اینکه ، می تونستین از Group By استفاده کنید .

tefos666
یک شنبه 26 آبان 1387, 21:04 عصر
ممنون از اینکه لطف کردین لا اقل پاسخی دادین من مشکلم رو اینجوری تونستم حل کنم
اینجا هم نوشتم تا اگه کسه دیگه ای به این مشکل برخورد کمک حالش باشه . :گیج:


http://barnamenevis.org/forum/attachment.php?attachmentid=25536&stc=1&d=1226859161



sum:=0;
for i:=1 to DBGrid1.DataSource.DataSet.RecordCount do
begin
sum:= sum+StrToInt( DBGrid1.Fields[3].Value);

end;
DBGrid1.DataSource.DataSet.Next;
Label6.Caption:=IntToStr(sum);
end;
اومدم یک for گذاشتم از اول تا آخر گرید رو خوندم و مقدار فیلد اعداد رو دونه دونه تو متغیر sum جمع کردم .

behzad_dr
یک شنبه 26 آبان 1387, 21:12 عصر
درسته دوست عزیز من ..

اما انجام شدن عمل تنها کافی نیست ، کمینه انجام شدن مطرح است .. اون عمل شما دقیقا کارتون رو راه میندازه ولی غیر اصولی ..

فکر میکنم راه حل من مناسب باشه ، امتحان کنید !

tefos666
یک شنبه 26 آبان 1387, 21:22 عصر
درسته دوست عزیز من ..

اما انجام شدن عمل تنها کافی نیست ، کمینه انجام شدن مطرح است .. اون عمل شما دقیقا کارتون رو راه میندازه ولی غیر اصولی ..

فکر میکنم راه حل من مناسب باشه ، امتحان کنید !

دوست گرامی دقیقا مشکل من هم همینه که نتیجه ای که شما هم میگی همون گرید من هستش و تنها راهی که داشتم همون جدول temp بود که اونموقع فرض کن اگه حجم دیتا بالا باشد..... البته شاید هم من درست متوجه نشدم میشه مثال کدش رو بنویسی :قلب: ، ضمنا من برای query اولم از group by استفاده کردم جز این چاره ای نداشتم - دوستان اگر راه بهتری هست لطفا کمک کنید .

vcldeveloper
دوشنبه 27 آبان 1387, 02:21 صبح
اومدم یک for گذاشتم از اول تا آخر گرید رو خوندم و مقدار فیلد اعداد رو دونه دونه تو متغیر sum جمع کردم .
کد اشتباه هست، چون باید Dataset.Next در داخل حلقه for قرار بگیره. در ضمن، برای همچین مواردی که باید تعداد زیادی رکورد پیمایش بشند، باید از Dataset.DisableControls و Dataset.EnbaleControls استفاده کنید تا کارایی افزایش پیدا کنه.


مشکلم اینه نمیدونم چجوری sum اون جدول فیلتر شده به وسیله کمبوباکس رو بگیرم ؟

SELECT SUM(MyField) FROM MyTable WHERE Ostan = :paramMyParam

tefos666
دوشنبه 27 آبان 1387, 11:27 صبح
واقعا ممنونم :متعجب:
البته در مورد sum موفق نشدم چون اون باز sum یک کوئری رو میده و من 2تا کوئری دارم که جواب اولی به دومی وابسته است
ولی با این همه لطف کردین - متشکرم
راستی : کد for رو چون همینجوری تایپ کردم اینجا حواسم نبوده بیرون end گذاشتم در سورسم درسته - از بابت disable , enable کنترل خیلی جالب و آموزنده بود :قلب: