PDA

View Full Version : محاسبه مانده در هر ردیف DBGrid



afsoon_k77
دوشنبه 30 فروردین 1389, 10:52 صبح
سلام
من می خوام در گرید یک ستون مانده داشته باشم که برای محاسبه آن مقدار قبلی این ستون در ردیف قبل با مقدار یک فیلد در ردیف جاری جمع یا تفریق می شه برای این کار باید چکار کنم؟
با تشکر

Jozef
دوشنبه 30 فروردین 1389, 17:06 عصر
دستورات خواندن از فیلد قبل رو به صورت یه select جداگونه بازیابی کنین و سپس محاسبات را انجام دهید.

afsoon_k77
دوشنبه 30 فروردین 1389, 17:11 عصر
فیلد مانده از نوع fkCalculated هست و نمیشه select گرفت

حسین شهریاری
سه شنبه 31 فروردین 1389, 21:59 عصر
یه فیلد محاسباتی ایجاد کنیدو...


Adotable.fieldbyname('Mande').asfloat:=Adotable.fi eldbyname('Bes').asfloat-Adotable.fieldbyname('Bed').asfloat+Value;
Value:=Value+Adotable.fieldbyname('Bed').asfloat-Adotable.fieldbyname('Bes').asfloat

البته قبلا باید مقدار متغیر Value را صفر کرده باشید.

khoshblagh
چهارشنبه 01 اردیبهشت 1389, 12:24 عصر
[quote=shahriar63;957908]یه فیلد محاسباتی ایجاد کنیدو...


Adotable.fieldbyname('Mande').asfloat:=Adotable.fi eldbyname('Bes').asfloat-Adotable.fieldbyname('Bed').asfloat+Value;
Value:=Value+Adotable.fieldbyname('Bed').asfloat-Adotable.fieldbyname('Bes').asfloat
میشه در باره این کد توضیح بدهید؟ متشکرم

afsoon_k77
چهارشنبه 01 اردیبهشت 1389, 12:31 عصر
یک فیلد محاسباتی تعریف کن و یک متغیر از نوع همین فیلد
در رویداد ONCalc دیتاستت دستور محاسبه فیلد بنویس




DataSet['Mandeh']:=Temp_Mandeh+dataset.FieldByName('Bad').AsFloat-dataset.FieldByName('Bes').AsFloat;
Temp_Mandeh:=dataset.FieldByName('Mandeh').AsFloat ;



در دستوری که نوشتم Temp_Mandeh اسم متغیرم که از نوع Float و نوع فیلدم هم از این نوع
این متغیر در واقع حاوی مقدار فیلد مورد نظرت در رکورد قبلی
در رویداد BeforeOpen دیتاستت مقدار این متغیر باید صفر بشه
موفق باشی

khoshblagh
چهارشنبه 01 اردیبهشت 1389, 13:05 عصر
یک فیلد محاسباتی تعریف کن و یک متغیر از نوع همین فیلد
در رویداد ONCalc دیتاستت دستور محاسبه فیلد بنویس




DataSet['Mandeh']:=Temp_Mandeh+dataset.FieldByName('Bad').AsFloat-dataset.FieldByName('Bes').AsFloat;
Temp_Mandeh:=dataset.FieldByName('Mandeh').AsFloat ;



در دستوری که نوشتم Temp_Mandeh اسم متغیرم که از نوع Float و نوع فیلدم هم از این نوع
این متغیر در واقع حاوی مقدار فیلد مورد نظرت در رکورد قبلی
در رویداد BeforeOpen دیتاستت مقدار این متغیر باید صفر بشه

موفق باشی

میشه یک نمونه ارائه بدهید. متشکرم

afsoon_k77
چهارشنبه 01 اردیبهشت 1389, 14:53 عصر
این یک نمونه بود دیگه کجاش و نمی فهمی؟

danesh1351
جمعه 03 اردیبهشت 1389, 13:14 عصر
دوست عزيز خوب دقت كن
فيلد محاسباتي را ايجاد كن .
يك متغيير اوليه ايجاد كن و مقدار اوليه مناسب را قبل از باز كرد جدول وارد كن .
در رويداد oncalc فيلد محاسباتي يك Query بنويس كه شرطي داشته باشد كه مقادير قبلي فيلد مورد نظر را محاسبه كرده و برگرداند .
سپس :
متغيير اوليه = متغير اوليه + مقدار محاسبه شده Query
مقدار فيلد محاسباتي = مقدار متغير اوليه

hedayat
پنج شنبه 11 شهریور 1395, 13:25 عصر
بابت نظرات دوستان ممنون
اين قطعه كد كاملا جواب مي ده
ولي يه ايراد اساسي داره
اونم اينه كه اگه روي گريد كليد pageup يا pageDown رو بزني كلا بهم مي ريزه

كسي براي اين قضيه راه حلي نداره؟؟؟

hp1361
شنبه 13 شهریور 1395, 09:52 صبح
بابت نظرات دوستان ممنون
اين قطعه كد كاملا جواب مي ده
ولي يه ايراد اساسي داره
اونم اينه كه اگه روي گريد كليد pageup يا pageDown رو بزني كلا بهم مي ريزه

كسي براي اين قضيه راه حلي نداره؟؟؟

سلام

پیشنهاد من اینه که محاسبات ر سمت دیتا بیس انجام بدی و نتیجه رو در دیبی گرید نمایش بدی. یعنی اینکه مانده گیری برای هر رکورد و مانده کل مربوط به تمام رکورد های پیشین رو درون دیتا بیس انجام بدی.

بدین صورت که با استفاده از یک کویری موارد مورد نظرت رو از دیتابیس بخوای:


SELECT
[RegDate],
Bes,Bed,Bes-Bed AS Mande,
SUM(Bes-Bed) OVER (ORDER BY [RegDate] ROWS UNBOUNDED PRECEDING) As MandeKol
FROM dbo.TblMain
WHERE RegDate>='2016-09-03' AND RegDate<='2016-09-05'
ORDER BY [RegDate];


142371

البته اسم ستونها رو بخاطر خوانایی بیشتر برای شما اینطوری نامگذاری کردم و معمولا اسامی با معنی نزدیک انگلیسی ارجح ترند. تاریخ رو هم قاعدتا شما بصورت پارامتر ارسال خواهید کرد

پ.ن : لازم به یادآوری ست که این کویری روی SQL SERVER 2012 به بالا کار خواهد کرد.

پ.ن 2: اگر از Firebird 3 استفاده کنید، کد SQL به شکل زیر قابل استفاده خواهد بود


select
regdate,
bed,
bes,
bes-bed AS Mande,
sum(bes-bed) over(order by regdate) as mondekol
from new_table
order By RegDate



موفق باشیم

یوسف زالی
شنبه 13 شهریور 1395, 10:53 صبح
برای نسخه های پایین تر اس کیو ال (تا 2000 تست کردم) هم می تونید از این راه استفاده کنید:




select *, 0 Mande
into #T
from TBL
order by RegDate


decalre @Mande decimal
set @Mande = 0


update #T
set @Mande = Mande = @Mande + Bes - Bed


select *
from #T


drop table #T

Hassan247
چهارشنبه 15 دی 1395, 09:34 صبح
***سلام خسته نباشین ***
میخوام ستونهای یک فیلد رو با یک ادیت ضرب کنم و حاصل هر ستون رو روبروی همون ستون در فیلد دیگر قرار دهد
لطفا راهنمایی کنید
*** با تشکر فراوان ***

omegao
دوشنبه 02 اسفند 1395, 22:37 عصر
بابت نظرات دوستان ممنون
اين قطعه كد كاملا جواب مي ده
ولي يه ايراد اساسي داره
اونم اينه كه اگه روي گريد كليد pageup يا pageDown رو بزني كلا بهم مي ريزه

كسي براي اين قضيه راه حلي نداره؟؟؟

باسلام
فیلدهای محاسباتی در هر پیمایش دوباره محاسبه میشوند برای حل این مشکل فیلد محاسباتی باید بصورت فیلد محاسباتی داخلی (InternalCalcField)تعریف بشه و کد بالا داخل شرط زیر قرار بگیره تا در هنگام پیمایش رکوردها عملیات محاسبه دوباره انجام نشه.


if DataSet1.State = dsInternalCalc then begin

end;