修复DBGrideh使用TMemTableEh在Footers求平均值为0的Bug
来源:互联网 发布:淘宝店铺认证信息修改 编辑:程序博客网 时间:2024/06/05 18:34
在一个项目中,使用DBGrideh,当使用自带的内存数据集时,对于Footers添加的求平均值,一直显示为0,其他汇总数据都是可以的,而切换使用TClientDataSet或者TADODataSet,所有汇总数据包括平均值都有值。
打开相关部分源码查看了下,发现DBGrideh自带的内存数据集关于汇总平均数这块,竟然没有处理……,什么情况?
原始相关函数:
procedure TCustomMemTableEh.GetAggregatedValuesForRange(FromBM, ToBM: TUniBookmarkEh; FieldName: String; var ResultArr: TAggrResultArr; AggrFuncs: TAggrFunctionsEh);var FromRN, ToRN: Integer; i: Integer; v: Variant; VarTypeNum: Integer; FieldIndex: Integer;begin ResultArr[agfSumEh] := Null; ResultArr[agfCountEh] := 0; ResultArr[agfAvg] := Null; ResultArr[agfMin] := Null; ResultArr[agfMax] := Null; if not Active then Exit; if FromBM <> NilBookmarkEh then if UniBookmarkValid(FromBM) then FromRN := UniBookmarkToRecNo(FromBM) else Exit else FromRN := 1; if ToBM <> NilBookmarkEh then if UniBookmarkValid(ToBM) then ToRN := UniBookmarkToRecNo(ToBM) else Exit else ToRN := RecordCount; if (FieldName = '') and (AggrFuncs = [agfCountEh]) then begin for i := FromRN-1 to ToRN-1 do ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1; Exit; end; if FRecordsView.MemTableData.DataStruct.FindField(FieldName) = nil then Exit; VarTypeNum := FRecordsView.MemTableData.DataStruct.FieldByName(FieldName).GetVarDataType; FieldIndex := FRecordsView.MemTableData.DataStruct.FieldIndex(FieldName); for i := FromRN-1 to ToRN-1 do begin v := FRecordsView.RecordView[i].Rec.Value[FieldIndex, dvvValueEh]; if not VarIsNullEh(v) then begin if (agfCountEh in AggrFuncs) or (agfAvg in AggrFuncs) then ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1;<span style="white-space:pre"></span>//当设置求平均值时,此处仅仅做了一次记数累计 if (VarTypeNum in [varSmallint, varInteger, varSingle, varDouble, varCurrency,{$IFDEF EH_LIB_6} varShortInt, varWord, varInt64, varLongWord,{$ENDIF} varByte, varDate]) or (VarTypeNum = varFMTBcd) then begin if (agfSumEh in AggrFuncs) and (VarTypeNum <> varDate) then if VarIsNullEh(ResultArr[agfSumEh]) then ResultArr[agfSumEh] := v else ResultArr[agfSumEh] := ResultArr[agfSumEh] + v; if agfMin in AggrFuncs then if VarIsNullEh(ResultArr[agfMin]) then ResultArr[agfMin] := v else if ResultArr[agfMin] > v then ResultArr[agfMin] := v; if agfMax in AggrFuncs then if VarIsNullEh(ResultArr[agfMax]) then ResultArr[agfMax] := v else if ResultArr[agfMax] < v then ResultArr[agfMax] := v; end end; end; if <span style="color:#ff0000;">agfMax</span> in AggrFuncs then<span style="white-space:pre"></span>//求平均值,此处的触发条件竟然是 agfMax .... if not VarIsNullEh(ResultArr[agfSumEh]) then ResultArr[agfAvg] := <span style="color:#ff0000;">ResultArr[agfSumEh]</span> / ResultArr[agfCountEh]; //此处因为没有在agfAvg时对agfSumEh 求和汇总,该值应为0;end;
修改方法:
1、打开MemTableEh.pas
2、找到GetAggregatedValuesForRange函数,修改成如下:
procedure TCustomMemTableEh.GetAggregatedValuesForRange(FromBM, ToBM: TUniBookmarkEh; FieldName: String; var ResultArr: TAggrResultArr; AggrFuncs: TAggrFunctionsEh);var FromRN, ToRN: Integer; i: Integer; v: Variant; VarTypeNum: Integer; FieldIndex: Integer;begin ResultArr[agfSumEh] := Null; ResultArr[agfCountEh] := 0; ResultArr[agfAvg] := Null; ResultArr[agfMin] := Null; ResultArr[agfMax] := Null; if not Active then Exit; if FromBM <> NilBookmarkEh then if UniBookmarkValid(FromBM) then FromRN := UniBookmarkToRecNo(FromBM) else Exit else FromRN := 1; if ToBM <> NilBookmarkEh then if UniBookmarkValid(ToBM) then ToRN := UniBookmarkToRecNo(ToBM) else Exit else ToRN := RecordCount; if (FieldName = '') and (AggrFuncs = [agfCountEh]) then begin for i := FromRN-1 to ToRN-1 do ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1; Exit; end; if FRecordsView.MemTableData.DataStruct.FindField(FieldName) = nil then Exit; VarTypeNum := FRecordsView.MemTableData.DataStruct.FieldByName(FieldName).GetVarDataType; FieldIndex := FRecordsView.MemTableData.DataStruct.FieldIndex(FieldName); for i := FromRN-1 to ToRN-1 do begin v := FRecordsView.RecordView[i].Rec.Value[FieldIndex, dvvValueEh]; if not VarIsNullEh(v) then begin if (agfCountEh in AggrFuncs) or (agfAvg in AggrFuncs) then ResultArr[agfCountEh] := ResultArr[agfCountEh] + 1; if (VarTypeNum in [varSmallint, varInteger, varSingle, varDouble, varCurrency,{$IFDEF EH_LIB_6} varShortInt, varWord, varInt64, varLongWord,{$ENDIF} varByte, varDate]) or (VarTypeNum = varFMTBcd) then begin if <span style="color:#009900;">((agfSumEh in AggrFuncs) or (agfAvg in AggrFuncs))</span> and (VarTypeNum <> varDate) then <span style="color:#3333ff;">//此处修改</span> if VarIsNullEh(ResultArr[agfSumEh]) then ResultArr[agfSumEh] := v else ResultArr[agfSumEh] := ResultArr[agfSumEh] + v; if agfMin in AggrFuncs then<span style="white-space:pre"></span> if VarIsNullEh(ResultArr[agfMin]) then ResultArr[agfMin] := v else if ResultArr[agfMin] > v then ResultArr[agfMin] := v; if agfMax in AggrFuncs then if VarIsNullEh(ResultArr[agfMax]) then ResultArr[agfMax] := v else if ResultArr[agfMax] < v then ResultArr[agfMax] := v; end end; end; if <span style="color:#009900;">agfAvg </span>in AggrFuncs then <span style="color:#3333ff;">//此处修改</span> if not VarIsNullEh(ResultArr[agfSumEh]) then ResultArr[agfAvg] := ResultArr[agfSumEh] / ResultArr[agfCountEh];end;
0 0
- 修复DBGrideh使用TMemTableEh在Footers求平均值为0的Bug
- vc6 在win7 0x64 下的bug修复
- 求复数的平均值
- sql 横向求平均值(排除为0项)
- DBGridEH 的使用
- DBGridEh的使用
- 关于在DBGridEh的一个字段使用checkbox的方法
- 在BCB中使用DBGridEh列排序的方法
- BUG修复:EasyPlayer卡在首帧的bug修改
- AndFix Bug热修复框架的使用
- 使用可变参数列表实现求平均值的函数
- 堆的使用,输入数组个数和元素,求平均值
- 使用可变参数,实现函数,求函数参数的平均值
- 使用可变参数,实现函数,求函数参数的平均值
- 关于PyAsm在Windows下的安装使用及bug修复
- android studio如何使用已创建的tag,切换到tag,在tag基础上修复BUG
- 求平均值的简捷方法
- 求两个整数的平均值
- C++异常机制
- 求前K小的数和第K小的数
- Lucene实现自定义分词器(同义词查询与高亮)
- fopen、open和popen区别
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- 修复DBGrideh使用TMemTableEh在Footers求平均值为0的Bug
- kinetic-swift---kinetic object server
- 更新ADT,出现Cannot complete the install because of a conflicting dependency.
- windows常用命令
- multi update only works with $ operators
- mysql中limit的优化
- 流行浏览器内核分类及不同版本的样式区别
- java自定义注解及注解使用(注解学习一)
- 插入排序