DBGridEh为何不能汇总(主从表中)。 ( 积分: 100 )

  • 主题发起人 主题发起人 urlabelsoft
  • 开始时间 开始时间
U

urlabelsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGridEh为何不能汇总(主从表中)。

两层结构,在主从表中,我将从表采用dbgridEh来显示。
采用设置从表的DataSource为主表的数据集来显示主从。

现在问题:
当我设置了从表的显示控件:DBGridEh的
FooterRowCount:=1
SumList.Action:=True
后,然后加入字段,设置了“数量”字段 : fQty的
valueType:=ftSum.
但是就是不见它统计,而我在新增时,它会进行统计,保存后,我再选择下一条记录(主表),从表跟着改变,而这个统计不会变。

并且,一打开表单,它也不会统计。

谢谢!
 
你试一下
当改了主表后
SumList.Action:=false
再SumList.Action:=True来刷新一下!


这里有个过程!
///*****************************************************************************
//用控制 DbGridEh 加入 单元 GridsEh, DBGridEh,
//并要改 DBGridEh.pas中有个procedure OptimizeColsWidth(ColumnsList: TColumnsEhList);它是在protected中的,把它移动到public域,这样才能在程序中就可以调用



//--------------------------------------------------------------------------------

// 功能:设定 DbGridEh 合计行信息
// 参数: pDbGrid:TDBGridEh;
// pcFields : string ; 字段列表,字段用逗号分隔
// pvtType : TFooterValueType ; 统计类型 TFooterValueType = (fvtNon, fvtSum, fvtAvg, fvtCount, fvtFieldValue, fvtStaticText);
// pbISRequery : boolean=False ; 是否刷新 合计行信息 (默认为不刷新)
// AChangefvtStaticText:boolean=False ; 是否将 统计类型 转换为 fvtStaticText 类型 并将值:=统计值 (默认为不转换)
// 引用:StrToStringList
// 例如:DbGridEhFoot( DbGridEh1, 'Number,Sum', fvtSum,true,true); 设定数量和金额字段为合计统计 ,并刷新 合计统计 ; 将 统计类型 转换为 fvtStaticText 类型 并将值:=统计值
//--------------------------------------------------------------------------------
procedure My_DbGridEhFoot(pDbGrid: TDBGridEh; pcFields: string;
pvtType: TFooterValueType;pbISRequery : boolean;AChangefvtStaticText:boolean);
var nFldLoop : integer ;
cFieldName : string ;
tmpFldList : TStringList ;
sSumValue :string;
begin
pDbGrid.FooterRowCount := 1; // 指定网格尾部统计行行数
if pbISRequery then pDbGrid.SumList.Active := false; // // 使统计可以刷新

pDbGrid.SumList.Active := true; // 激活统计
// pDbGrid.FooterColor := clBtnFace ; // 指定统计行颜色

pDbGrid.Columns[0].Footer.ValueType := fvtStaticText;
pDbGrid.Columns[0].Footer.Value := '合计:';

tmpFldList := TStringList.Create ;
try
My_StrToStringList( Uppercase(pcFields),',',tmpFldList ); // 将字符串转换为串列表

For nFldLoop := 0 to pDbGrid.Columns.Count -1 do
begin
//使不是第一列的不显示为合计
if (trim(pDbGrid.Columns[nFldLoop].Footer.Value)='合计:') and (nFldLoop<>0) then
pDbGrid.Columns[nFldLoop].Footer.Value := '';

cFieldName := pDbGrid.Columns[nFldLoop].FieldName ; // 网格列字段名
if tmpFldList.IndexOf( uppercase( cFieldName ) ) >= 0 then
begin
if AChangefvtStaticText then //将统计类型 转换为 fvtStaticText 类型 并将值:=统计值
begin
pDbGrid.Columns[nFldLoop].Footer.ValueType := pvtType;
sSumValue:=pDbGrid.Columns[nFldLoop].Footer.SumValue;
pDbGrid.Columns[nFldLoop].Footer.ValueType := fvtStaticText;
pDbGrid.Columns[nFldLoop].Footer.Value:=sSumValue;
end//if AChangefvtStaticText then //将统计类型 转换为 fvtStaticText 类型 并将值:=统计值

else //正常的
pDbGrid.Columns[nFldLoop].Footer.ValueType := pvtType ; // 统计类型

end;
end ;



finally
tmpFldList.Free ;
end;//try..finally
end;
 
在单表中,是很好处理的,现在在主从中,是不是不能处理?
如果要时时sumlist.action:=False
那还不如我写代码来控制呢
 
我用的主从表是可以的,不知道你怎样设置导致不可以

不过可以在ClientDataset的AfterScroll或AfterOpen中加上一句:
DBGridEh1.SumList.RecalcAll;

让DBGridEh1重新合计一次,另外DBGridEh1的合计是有点傻傻的,有时要自己显式调用这个方法
 
DBGridEh1.SumList.RecalcAll;

加了这个,等于是来一次 DBGridEh1.SumList.Active:=false
DBGridEh1.SumList.Active:=True;
这样,会影响速度的。
 
是的,调用一次,他会循环整个从表重新合计一次,但由于它循环时会先进行DataSet.DisableControls,所以循环是在内存中进行,速度还是很快的。对于几百条记录的没什么影响,而且主表的AfterScroll或AfterOpen并不会切换很快,所以这个方法还是可以接受的。

不过还是看你自己
 

Similar threads

回复
0
查看
863
不得闲
D
回复
0
查看
825
DelphiTeacher的专栏
D
D
回复
0
查看
831
DelphiTeacher的专栏
D
D
回复
0
查看
664
DelphiTeacher的专栏
D
后退
顶部