سلام
من می خوام در گرید یک ستون مانده داشته باشم که برای محاسبه آن مقدار قبلی این ستون در ردیف قبل با مقدار یک فیلد در ردیف جاری جمع یا تفریق می شه برای این کار باید چکار کنم؟
با تشکر
سلام
من می خوام در گرید یک ستون مانده داشته باشم که برای محاسبه آن مقدار قبلی این ستون در ردیف قبل با مقدار یک فیلد در ردیف جاری جمع یا تفریق می شه برای این کار باید چکار کنم؟
با تشکر
دستورات خواندن از فیلد قبل رو به صورت یه select جداگونه بازیابی کنین و سپس محاسبات را انجام دهید.
فیلد مانده از نوع fkCalculated هست و نمیشه select گرفت
یه فیلد محاسباتی ایجاد کنیدو...
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 را صفر کرده باشید.
[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
میشه در باره این کد توضیح بدهید؟ متشکرم
یک فیلد محاسباتی تعریف کن و یک متغیر از نوع همین فیلد
در رویداد ONCalc دیتاستت دستور محاسبه فیلد بنویس
DataSet['Mandeh']:=Temp_Mandeh+dataset.FieldByName('Bad').AsFloat-dataset.FieldByName('Bes').AsFloat;
Temp_Mandeh:=dataset.FieldByName('Mandeh').AsFloat ;
در دستوری که نوشتم Temp_Mandeh اسم متغیرم که از نوع Float و نوع فیلدم هم از این نوع
این متغیر در واقع حاوی مقدار فیلد مورد نظرت در رکورد قبلی
در رویداد BeforeOpen دیتاستت مقدار این متغیر باید صفر بشه
موفق باشی
این یک نمونه بود دیگه کجاش و نمی فهمی؟
دوست عزيز خوب دقت كن
فيلد محاسباتي را ايجاد كن .
يك متغيير اوليه ايجاد كن و مقدار اوليه مناسب را قبل از باز كرد جدول وارد كن .
در رويداد oncalc فيلد محاسباتي يك Query بنويس كه شرطي داشته باشد كه مقادير قبلي فيلد مورد نظر را محاسبه كرده و برگرداند .
سپس :
متغيير اوليه = متغير اوليه + مقدار محاسبه شده Query
مقدار فيلد محاسباتي = مقدار متغير اوليه
بابت نظرات دوستان ممنون
اين قطعه كد كاملا جواب مي ده
ولي يه ايراد اساسي داره
اونم اينه كه اگه روي گريد كليد 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];
2016-09-03_10-21-13.jpg
البته اسم ستونها رو بخاطر خوانایی بیشتر برای شما اینطوری نامگذاری کردم و معمولا اسامی با معنی نزدیک انگلیسی ارجح ترند. تاریخ رو هم قاعدتا شما بصورت پارامتر ارسال خواهید کرد
پ.ن : لازم به یادآوری ست که این کویری روی 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
موفق باشیم
آخرین ویرایش به وسیله hp1361 : شنبه 13 شهریور 1395 در 11:46 صبح
برای نسخه های پایین تر اس کیو ال (تا 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
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
***سلام خسته نباشین ***
میخوام ستونهای یک فیلد رو با یک ادیت ضرب کنم و حاصل هر ستون رو روبروی همون ستون در فیلد دیگر قرار دهد
لطفا راهنمایی کنید
*** با تشکر فراوان ***
باسلام
فیلدهای محاسباتی در هر پیمایش دوباره محاسبه میشوند برای حل این مشکل فیلد محاسباتی باید بصورت فیلد محاسباتی داخلی (InternalCalcField)تعریف بشه و کد بالا داخل شرط زیر قرار بگیره تا در هنگام پیمایش رکوردها عملیات محاسبه دوباره انجام نشه.
if DataSet1.State = dsInternalCalc then begin
end;