因为自己找到的一些案例中,unidbgrid对某些列求和后,将求和结果一般放在最后一行。如果行数比较多或者有多页的情况,想知道汇总结果还是挺不方便。我一度怀疑unigui的设计者怎么连基本的使用习惯都不能兼顾,万般吐槽。
其实关键的设置如下,align设置为tobottom则自动将汇总行作为footer列示在表格的底部。不是人家设计的不好,要怪是自己知识不全面。
求和还有一个事件,需要对表格内部的列数据进行循环处理,得到列求和或列统计的结果。我设计了一个通用的求和事件
procedure TUniFramYwymain.UniDBGrid2ColumnSummaryResult(Column: TUniDBGridColumn;
GroupFieldValue: Variant; Attribs: TUniCellAttribs; var Result: string);
var
bk1: TBookmark;
f: Double;
s1: TStringList;
ss: string;
begin
inherited;
bk1 := UniDBGrid2.DataSource.DataSet.GetBookmark;
UniDBGrid2.DataSource.DataSet.DisableControls;
ss := '合同金额,' + //
'已开发票,已收款,审批金额,已付款,已收发票,' + //
'可用金额,欠进项,欠发票';
s1 := Splitstring(ss, ','); //'已开发票,已收款,校对收款,审批金额,已付款,校对付款,已收发票,可用金额,欠进项,欠发票'
if s1.indexof(Column.FieldName) >= 0 then
begin
f := 0;
Column.Field.DataSet.First;
while not Column.Field.DataSet.Eof do
begin
f := f + Column.Field.Value;
Column.Field.DataSet.Next;
end;
Result := FormatFloat('#,##0.00', f);
Attribs.font.Style := [fsBold];
Attribs.Font.Color := clNavy;
end;
UniDBGrid2.DataSource.DataSet.GotoBookmark(bk1);
UniDBGrid2.DataSource.DataSet.EnableControls;
end;
只需要将需要自己unidbgrid中需求和的数据列字段名列表放到ss变量中。
这里还要一个要点,如果先不保存设置tbookmark再恢复,将出现页码跳转时页面显示不正确的错误。这一点也是经过多次测试后才找出的问题所在。最后效果如图
综上所述,unidbgrid的求和设置有两个大坑,分别是:
1、align设置为tobottom才能显示 footer类似的求和统计栏
2、在unidbgrid的ColumnSummaryResult事件中,一定要先保存数据表的游标,在循环执行完再恢复现场,这样在多页的状态下才能保证正常的跳转。