Aşağıdaki fonksiyon dataset nesnesinin istenilen kolonunun toplamını/ortalamasını veya dataset içindeki kayıt sayısını veriyor.
Kod: Tümünü seç
Function DataSetColSummary(DataSet:TDataSet;Column,SumType:String):Double;
Var
Deger,minDeger:Double;
s:string;
d:Double;
sc,st,rn:integer;
TarihHesapla:boolean;
begin
Result:=0;
minDeger:=0;
Deger:=0;
DataSet.DisableControls;
rn:=DataSet.RecNo;
if SumType='Kayıt Sayısı' then
Result:=DataSet.RecordCount
else
Begin
if SumType='Ortalama' then st:=1
else
if SumType='Toplam' then st:=2
else exit;
Case DataSet.FieldByName(Column).DataType of
ftInteger,ftSmallint,
ftAutoInc,ftLargeint,
ftWord,ftFloat,ftCurrency:TarihHesapla:=False;
ftDate,ftTime,ftDateTime,ftTimeStamp:TarihHesapla:=True;
else exit;
End;
sc:=DataSet.RecordCount;
DataSet.First;
While Not DataSet.Eof do
Begin
d:=DataSet.FieldByName(Column).AsFloat;
Deger:=Deger+d;//sum,avg
if TarihHesapla then
Begin
if (minDeger=0) or (d<minDeger) then
minDeger:=d;
End;
DataSet.Next;
End;
if sc>0 Then
Begin
Case st of
1:
Begin
Deger:=Deger/sc;
end;
2:
Begin
if TarihHesapla then
Begin
Deger:=Deger-(minDeger*sc);
End;
End;
End;
End;
Result:=Deger;
End;
DataSet.MoveBy(rn-DataSet.RecNo);
DataSet.EnableControls;
End;
Kod: Tümünü seç
procedure TForm1.DBGrid1CellClick(Column: TColumn);
Var
a,b,c:Double;
begin
a:=DataSetColSummary(DBGrid1.DataSource.DataSet,Column.FieldName,'Ortalama');
b:=DataSetColSummary(DBGrid1.DataSource.DataSet,Column.FieldName,'Toplam');
c:=DataSetColSummary(DBGrid1.DataSource.DataSet,Column.FieldName,'Kayıt Sayısı');///bu pek kullanışlı değil. onun yerine dataset.recordcount daha uygun olur
Edit1.Text:=Trim(sysutils.format('%8.2n',[a]));
Edit2.Text:=Trim(sysutils.format('%8.2n',[b]));
Edit3.Text:=Trim(sysutils.format('%8.2n',[c]));
end;