View Full Version : بهترین روش برای محاسبه مبلغ کل
snackeye
جمعه 03 دی 1389, 05:46 صبح
سلام
من یه دیتابیس mdb دارم که توی دلفی ازش استفاده میکنم
1 جدول داریم که توش این فیلدها هست :
date
price
توی دلفی توی 1 فرم این اطلاعات رو توی یک dbgrid نشون میدیم و 1 جا داریم برای جستجو
مثلا میخوایم توی تاریخ x مبلغ چقدر بوده یا این که توی ماه x کل مبلغ چقدر بوده و هر بار هم که توی query تغییراتی انجام میشه 100 % باید عملیات محاسبه مبلغ کل دوباره انجام بشه و با توجه به query فعلی مبلغ کل نشون بده
حالا روشی که من استفاده میکنم اینه :
یه action تعریف کردم به نام calctotalprice که توش با استفاده از یک adoquery دیگه select کردم و کل مبلغ رو محاسبه میکنم و میارم توی label روی فرم ! اما حالا اگه کاربر گزارش رو بر اساس مثلا دی ماه خواست که مبلغ کل دی ماه رو نشون بده نمیدونم باید چیکار کنم ! آخه اینجوری فقط میشه مبلغ کل ماه ها رو گرفت - الان با این وضعیت راهش اینه که هر دفعه query که انجام شده رو بگیره و با اون مبلغ کل حساب کنه که کار عاقلانه ای نیست و مشکلات دیگه ای پیش میاد
میدونم که روش من غلطه - میخوام هم اشتباهاتم رو بدونم هم راه های پیشنهادی که همه استفاده میکنن برای این کار
ممنون
pezhvakco
جمعه 03 دی 1389, 17:44 عصر
از روشی که نوشتی برای جمع یک ماه چیزی نفهمیدم ؟
ولی اگر منظورت اینه که می خوای جمع مبلغ یک ماه رو بدست بیاری، باید دستور جمع رو برای ستون Price با یک شرط برمبنای تاریخ بنویسی .
اگر تاریخ رو به صورت YYYY/MM/DD نگهداری می کنی :
SELECT SUM(price) AS Expr1
FROM Table1
WHERE (date LIKE '1389/01/%')اگر تاریخ رو به روشی دیگری نگهداری می کنی بخش شرط را بر مبنای اون بنویس .
snackeye
جمعه 03 دی 1389, 18:54 عصر
ممنون
من هم الان همین کار رو میکنم اما وقتی query از جای دیگه تغییر میکنه باید هر دفعه این کار رو انجام بدم - حالا انجام دادنش به کنار ، این که باید همین query رو دوباره انجام بدم مشکله !
ببینید من فرض کنید توی قسمت جستجو ماه مهر رو وارد میکنم و توی جدول فقط ماه مهر و مبلغ هاش رو نشون میده حالا ممکنه هر تغییر دیگه ای انجام بده کاربر توی جستجو - خوب اون کوئری sum رو توی همون کوئری که نمیتونم انجام بدم باید یه کوئری دیگه بسازم - توی اون هم تشخیص این که الان توی اون کوئری چی هست که مبلغ کلش رو حساب کنه یه خورده مشکله !
میدونم منظورمو متوجه نمیشید اما 1 خورده بهش فکر کنید متوجه میشید منظورم دقیقا چی هست
ممنون
pezhvakco
جمعه 03 دی 1389, 19:17 عصر
اما وقتی query از جای دیگه تغییر میکنه باید هر دفعه این کار رو انجام بدم
جای دیگه کجای ؟
خوب اون کوئری sum رو توی همون کوئری که نمیتونم انجام بدم باید یه کوئری دیگه بسازم
منظورتون از اینکه میگین یک کوئری دیگه بسازم چیه ؟
توی اون هم تشخیص این که الان توی اون کوئری چی هست که مبلغ کلش رو حساب کنه یه خورده مشکله !
خیلی شلوغش کردین با گفتن : " این و اون "
شما یک ADODataSet یا ADOQuery روی فرم بزار و بعد از انجام تنظیمات کانکشن ( Connection ) در اون بخش برنامه که میخوای گزارش بگیری کد دستوری رو که نوشتم به ADODataSet بده و اون رو فعال کن :
procedure TForm13.BitBtn1Click(Sender: TObject);
var
Com_Tx, Shomare_Mah : string;
begin
Shomare_Mah:= ؟؟ //-- شماره ماه رو از کاربر بگیره -
Com_Tx:='SELECT ISNULL(SUM(price), 0) AS Expr1 ';
Com_Tx:=Com_Tx + 'FROM Table1 ';
Com_Tx:=Com_Tx + 'WHERE (date LIKE ' + QuotedStr('1389/' + Shomare_Mah + '/%') + ') ';
ADODataSet.Close;
ADODataSet.CommandText:=Com_Tx;
ADODataSet.Open;
Label1.Caption:=IntToStr(ADODataSet.FieldByName('E xpr1').AsInteger);
end;
میدونم منظورمو متوجه نمیشید اما 1 خورده بهش فکر کنید متوجه میشید منظورم دقیقا چی هست
باز خوبه خودت میگی ؟
snackeye
شنبه 04 دی 1389, 03:29 صبح
ممنون
کد شما این اررور رو میده :
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Wrong number of arguments used with function in query expression 'ISNULL(SUM(price), 0)''. Process stopped. Use Step or Run to continue.
---------------------------
اما اونجوری که به نظرم اومد کد شما درواقع همون کد من هست - کد شما الان خروجی که میاره یه کوئری هست با 1 فیلد به اسم expr که فقط مبلغ کل هست - مشکل من دقیقا همینه - من میخوام توی grid تمام چیزا رو نشون بده یعنی نام و تاریخ و مبلغ و .... و در آخر مبلغ کل رو پایین grid نشون بدم - اما اینجوری نمیشه
pezhvakco
شنبه 04 دی 1389, 12:33 عصر
برای پیام خطا : فکر کنم یا کد دستور رو درست ننوشتی یا کد با ساختار جدول هماهنگ نیست .
من میخوام توی grid تمام چیزا رو نشون بده یعنی نام و تاریخ و مبلغ و .... و در آخر مبلغ کل رو پایین grid نشون بدم - اما اینجوری نمیشه
شما یک DBGrid1 بذار روی فرم و اون رو به جدول اصلی که داده ها توش است وصل کن و یک لیبل یا ادیت هم بذار پایین جدول (زیر ستون Price) .
برای نمایش گزارش جدول اصلی تو براساس اون خواصتت فیلتر کن (تاریخ مورد نظر) و اون کوئری رو هم بر همون مبنا بدست بیار و خروجی کوئری رو تو ادیت نمایش بده .
آماتور دلفی
دوشنبه 20 دی 1389, 13:26 عصر
من می خوام جمع یک ستون از یک تیبل رو با کوئری بگیرم و بریزم توی یک متغیر .می شه راهنماییم کنید .
Query2.SQL.Add('select sum(mab),sum(tedad) from khat.db
mohsen24000
دوشنبه 20 دی 1389, 22:25 عصر
var sum_mab,sum_tedad: integer;
begin
query2.close;
query2.sql.clear;
Query2.SQL.Add('select sum(mab) as sum_mab,sum(tedad) as sum_tedad from khat.db');
query2.open;
if query2.recordcount>0 then begin
sum_mab:=query2.fieldbyname('sum_mab').asinteger;
sum_tedad:=query2.fieldbyname('sum_tedad').asinteg er;
end;
end;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.