再加分200,就同一简单问题相问,Grid分类汇总

knife_s 2005-10-08 11:29:08
我需要自己扩充一个StringGrid,排序等功能都写好了,需要一个汇总功能

类似于SQL语句的Group by

下面是我写的一个函数,GroupCol为关键字,addCol1,AddCol2为需要汇总的列,

前贴:http://community.csdn.net/Expert/TopicView.asp?id=4284214 ,谁解决了一共400,



procedure RGrid.collect(GroupCol,addCol1,AddCol2: integer);
var
i,j:Integer;
TempStr1,TempStr2 :String;
begin
i := 2;
while i <= self.RowCount do
begin
TempStr1 := self.Cells[GroupCol,i];
if TempStr1 = '' then exit;
for j := 1 to i -1 do
begin
TempStr2 := self.Cells[GroupCol,j];
if TempStr2 = '' then exit;
if TempStr2 = TempStr1 then
begin
self.Cells[addCol1,j] := FloatToStr (StrToFloat(self.Cells[addCol1,i])
+ StrToFloat(self.Cells[addCol1,j]));

self.Cells[addCol2,j] := FloatToStr (StrToFloat(self.Cells[addCol2,i])
+ StrToFloat(self.Cells[addCol2,j]));
self.DelRows(i,1);
end;
end;
end;
end;
...全文
170 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
winxkm 2005-10-09
  • 打赏
  • 举报
回复
楼主统计的次序是否能够跟填充stringGrid单元格同时进行呢? 比如说,我计算的列,你一遍填充数据,一边通过变量累计求和,无需再在最后另外统计了,你认为呢?
knife_s 2005-10-09
  • 打赏
  • 举报
回复
呵呵,谢谢各位兄弟

据我想,应该是个简单问题吧

knife_s 2005-10-09
  • 打赏
  • 举报
回复
to winxkm 本来是可以的,其中几个是在填充的时候就分类汇总了,

这个由于有特殊要求,所以只有想办法在控件中实现功能了



上面那段代码少了一个 i := i + 1;

knife_s 2005-10-08
  • 打赏
  • 举报
回复
TO getit911 因为一来领导不赞成使用第三方控件,二来自己写的控件在这个程序中已使用多次,改动的话恐怕有不稳定的因素。

To aiiri

谢谢您的代码。还是一样:(

如果只有一种物品,可以正确汇总,

如果有二种以上,就不能正确汇总了,

问题不在continue或exit上,因为应用于一张单据,如果为空,就可以退出了,下面可以肯定也没有了数据
雄牛 2005-10-08
  • 打赏
  • 举报
回复
友情UP.....
aiirii 2005-10-08
  • 打赏
  • 举报
回复
if TempStr2 = '' then exit; 也同样
aiirii 2005-10-08
  • 打赏
  • 举报
回复
if TempStr1 = '' then exit;

改为:

if TempStr1 = '' then continue;
看如何
getit911 2005-10-08
  • 打赏
  • 举报
回复
用EhLib控件,已经提供了这些功能
tetsuya 2005-10-08
  • 打赏
  • 举报
回复

汗~~~
刚才没有看清楚内容就回复了。。

如果要分类的话

应该要加入一个二维动态数组。 或者结构数组
type
AddField = record
FieldName : string ;
fieldValue :real ;
end ;
如果碰到一个fieldName 里面没有的 就数组增加一条 , 然后 在滚动 字符表的时候表格进行统计对应到fieldvalue 。 统计完成显示到表格行上

/***---

没做过。。。随便说说~
tetsuya 2005-10-08
  • 打赏
  • 举报
回复
给你一个我写的 AdvstringGrid 上面写的 ,参考一下。

var aRow : integer ;

//统计界面上N个表
procedure TFrmMain.SetAsgFooter(iFlag: Integer);
var
iArg : Integer;
iCardNum : Integer;
fCardPay : Real;
begin
iCardNum := 0;
fCardPay := 0.00;
DeleteAsgFooterRow(iFlag); //删除表最后一个合计行
// AsgDelNullRow();
case iFlag of
1: // 设置 售卡表 begin
ARow := Asg_Sale_Card.RowCount;
for iArg := 1 to ARow - 1 do
begin
if Asg_Sale_Card.Cells[1, iArg] <> '' then
begin
iCardNum := iCardNum + StrToInt(Asg_Sale_Card.Cells[9, iArg]);
fCardPay := fCardPay + StrToFloat(Asg_Sale_Card.Cells[10, iArg]);
end;
end;

if Asg_Sale_Card.RowCount = 2 then
begin
if Trim(Asg_Sale_Card.Cells[3, 1]) <> '' then
begin
Asg_Sale_Card.RowCount := Asg_Sale_Card.RowCount + 1;
end;
end
else
Asg_Sale_Card.RowCount := Asg_Sale_Card.RowCount + 1;
ARow := Asg_Sale_Card.RowCount;

Asg_Sale_Card.Cells[1, ARow - 1] := '合计:';
Asg_Sale_Card.Cells[10, ARow - 1] := FormatFloat('0.00', fCardPay);
Asg_Sale_Card.Cells[9, ARow - 1] := IntToStr(iCardNum);
end;
0: // 设置 单位信息表
begin

ARow := Asg_Comp.RowCount;

for iArg := 1 to ARow - 1 do
begin
if (Asg_Comp.Cells[1, iArg] <> '') then

fCardPay := fCardPay + StrToFloat(Asg_Comp.Cells[9, iArg]);
end;
if Asg_Comp.RowCount = 2 then
begin
if Trim(Asg_Comp.Cells[3, 1]) <> '' then
begin
Asg_Comp.RowCount := Asg_Comp.RowCount + 1;
end;
end
else
Asg_Comp.RowCount := Asg_Comp.RowCount + 1;

ARow := Asg_Comp.RowCount;

Asg_Comp.Cells[1, ARow - 1] := '合计:';
Asg_Comp.Cells[9, ARow - 1] := FormatFloat('0.00', fCardPay);
end;
end;
end;
yanlls 2005-10-08
  • 打赏
  • 举报
回复
如果第一条和第二条值不需要累加,是否是死循环
knife_s 2005-10-08
  • 打赏
  • 举报
回复
想了半天还是没有结果,

呵呵, 顶上去

难道大家一样不喜欢动脑吗:)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧