如何人为统计某个字段的合计值?(100分)

  • 主题发起人 主题发起人 kds
  • 开始时间 开始时间
K

kds

Unregistered / Unconfirmed
GUEST, unregistred user!
报表控件:QuickRep
报表每页显示20条记录,到20条后,换新页,能否人为统计每页上面20条记录的某个字段的合计值(每页都有一个合计)?
我不要用QrExpr控件,因为这个合计值我是有别的用途,QrExpr控件合计后的值取不出来,所以要人为统计(比如说,合计值放到QrLabel中)。
 
关注中..,我也遇到过该问题
 
onpreview 事件里不是都有个value参数吗,在那里用一个全局变量存储下来,就可以使用你
想用的数值了.
 
每页合计应该是小计,由于Footer Band会在每一页显示,所以可以在Footer Band中实现,
我使用的是ReportBuilder。
 
当然可以了。
下面是我报表的结果。
========================================
SHENZHEN PEPSI-COLA BEVERAGE CO.,LTD.
深圳百事可乐饮料有限公司
订购单编号 请购单编号 订购数量 请购数量
0008884 01576 60000000 60000000
验收单号 材料编号 材料名称 验收日期 验收数量
2003679 125050PEPSZ 空罐,百事,深圳 2003-03-20 568329
2011134 125050PEPSZ 空罐,百事,深圳 2003-03-17 357102
0008884 01576 60000000 60000000 925431
SHENZHEN PEPSI-COLA BEVERAGE CO.,LTD.
深圳百事可乐饮料有限公司
订购单编号 请购单编号 订购数量 请购数量
0008885 01577 70000000 140000000
验收单号 材料编号 材料名称 验收日期 验收数量
2004538 125050PEPSZ 空罐,百事,深圳 2003-06-14 831293
2004538 125050PEPSZ 空罐,百事,深圳 2003-06-14 185164
2004877 125050PEPSZ 空罐,百事,深圳 2003-06-24 92582
2004877 125050PEPSZ 空罐,百事,深圳 2003-06-24 623178
2004877 125050PEPSZ 空罐,百事,深圳 2003-06-24 139651
2004887 125050PEPSZ 空罐,百事,深圳 2003-06-25 641461
2004887 125050PEPSZ 空罐,百事,深圳 2003-06-25 72743
2004893 125050PEPSZ 空罐,百事,深圳 2003-06-25 33065
2004899 125050PEPSZ 空罐,百事,深圳 2003-06-26 489362
2004899 125050PEPSZ 空罐,百事,深圳 2003-06-26 105808
2004916 125050PEPSZ 空罐,百事,深圳 2003-06-27 403393
2004916 125050PEPSZ 空罐,百事,深圳 2003-06-27 72743
2004936 125050PEPSZ 空罐,百事,深圳 2003-06-23 476136
2004936 125050PEPSZ 空罐,百事,深圳 2003-06-23 266076
2004960 125050PEPSZ 空罐,百事,深圳 2003-06-20 2176000
2004977 125050PEPSZ 空罐,百事,深圳 2003-07-01 714204
2004977 125050PEPSZ 空罐,百事,深圳 2003-07-01 119034
2004991 125050PEPSZ 空罐,百事,深圳 2003-07-02 595170
2004998 125050PEPSZ 空罐,百事,深圳 2002-07-03 509201
2004998 125050PEPSZ 空罐,百事,深圳 2002-07-03 79356
0008885 01577 70000000 140000000 8625620
 
是不是正是你要的结果?
也就是说验收数量是合计。
在Delphi的Demo里面有QuickRep的例子,然后你打开QR3demo的Basic Master/Detail example。你可以看到他有各种合计的例子。
 
楼上说的结果也是我所要的结果,但是具体是怎么实现的:分页小计?
 
sword_liu的查询结果可以直接使用SQL语句来实现,以下摘自SQL SERVER在线帮助:
用 COMPUTE 和 COMPUTE BY 汇总数据
提供 COMPUTE 和 COMPUTE BY 是为了向后兼容。请改为使用下列组件:
Microsoft®
SQL Server™
2000 Analysis Services 和用于 Analysis Services 的 OLE DB 或 Microsoft ActiveX®
数据对象(多维)(ADO MD) 一起使用。有关更多信息,请参见 Microsoft SQL Server™
2000 Analysis Services。

ROLLUP 运算符。有关更多信息,请参见用 ROLLUP 汇总数据。
COMPUTE BY 子句使您得以用同一 SELECT 语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。
COMPUTE 子句需要下列信息:
可选的 BY 关键字,该关键字可按对一列计算指定的行聚合。

行聚合函数名称;例如,SUM、AVG、MIN、MAX 或 COUNT。

要对其执行行聚合函数的列。
COMPUTE 生成的结果集
COMPUTE 所生成的汇总值在查询结果中显示为分离的结果集。包括 COMPUTE 子句的查询的结果类似于控制中断报表,即汇总值由指定的组(或称中断)控制的报表。可以为各组生成汇总值,也可以对同一组计算多个聚合函数。
当 COMPUTE 带有可选的 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:
每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。

每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
当 COMPUTE 不带可选的 BY 子句时,SELECT 语句有两个结果集:
每个组的第一个结果集是包含选择列表信息的所有明细行。

第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。
COMPUTE 用法示例
下列 SELECT 语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计:
USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance)
下列查询在 COMPUTE 子句中加入可选的 BY 关键字,以生成每个组的小计:
USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type
此 SELECT 语句的结果用 12 个结果集返回,六个组中的每个组都有两个结果集。每个组的第一个结果集是一个行集,其中包含选择列表中所请求的信息。每个组的第二个结果集包含 COMPUTE 子句中两个 SUM 函数的小计。

说明 一些实用工具(如 osql)显示多个小计或合计聚合汇总的方式可能会使用户以为每个小计都是结果集中的单独一行。这是由于该实用工具设置输出格式的方式;小计或合计聚合返回时单独占用一行。其它应用程序(如 SQL 查询分析器)将多个聚合设置在同一行。

比较 COMPUTE 和 GROUP BY
COMPUTE 和 GROUP BY 之间的区别汇总如下:
GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。

COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。
下列查询使用 GROUP BY 和聚合函数;该查询将返回一个结果集,其中每个组有一行,该行中包含该组的聚合小计:
USE pubs
SELECT type, SUM(price), SUM(advance)
FROM titles
GROUP BY type

说明 在 COMPUTE 或 COMPUTE BY 子句中,不能包含 ntext、text 或 image 数据类型。

请参见
查询基础知识
SELECT
©1988-2000 Microsoft Corporation。保留所有权利。
 
关注中......我没灌水啊。瞎说
 
To:sword_liu
结果是我想要的,但是你验收数量合计值是怎么得到的,如果是用QrExpr作合计的话,那和我的问题还是差很远呢。换句话说,QrExpr得到的合计值有没有办法取出来呢,就拿你例子中的验收数量合计值来说,能和一个固定的数 5 作比较吗?
其实问题就是出在 合计值怎么样取出来?
 
噢,我知道你说的了。
其实我是用QREXPR,对一个字段做Sum。
例如:
QREXPR的EXPRESSION为sum([REC_QTY]),其中REC_QTY是验收数量字段
 
你说的这个我会,我也知道怎么做,主要是我现在需要合计出来的这个值要和另外的值作比较来判断这张报表是否数据平衡?
对于这个合计值怎么来取出或者由什么办法作合计后能取出这个合计值,我不知道怎么做?
 
设一个全局变量A:=0对应数字字段SA,那好每次打印SA时,将A:=A+SA。
以上解决了如何求和,现在解决如何在每一页打印出来?
前面说了,由于Footer Band是每一页都打印的,那就在Footer Band上放置一个
Label,其打印内容由A求得就可以了。
如果你只要每一页的SA的合计值,那还得A:=0才行。
 
To:chnplzh
你说的方法很好,我现在正在尝试,可是尝试中发现这样的值好像不正确,也许是我做的有问题,还在尝试ING。。。
 
to CHNPLZH
其实没你想得那么复杂,我用了主从报表的概念。
也就是说我用了两个ADODataSet,两个DataSource,然后把第二个ADODataset的DataSource指向
第一个DataSource,第一个DataSource的DataSet指向第一个ADODataSEt,同样,第二个DataSource的DataSet指向第二个ADODataSet。然后指定ADODataSet2的MasterField为关联字段。
至于其它的就很简单了。
 
To:sword_liu
最初我是用的主从表,和你说的差不多,但是后来由于表中的数据被改(领导说该的),不能在用主从表了,其实麻烦也好不麻烦也好,我现在最需要的就是得到正确的值 :)
 
不管怎么样,很高兴和你sword_liu这样探讨问题,谢谢!!!
 
To:sword_liu
帮我看看这样有没有问题
procedure TFrmMasterDetail.QRDBText3Print(sender: TObject;
var Value: String);
begin
nManNum :=nManNum+StrToInt(Value);
//onprint事件中取到字段累加和
end;

procedure TFrmMasterDetail.QrpMasterDetailEndPage(Sender: TCustomQuickRep);
begin
//每页结束时显示那个累加和,QrLabel10在Footer Band中
QrLabel10.Caption :=IntToStr(nManNum);
end;
procedure TFrmMasterDetail.QrpMasterDetailStartPage(
Sender: TCustomQuickRep);
begin
nManNum := 0;
//新页的时候把累加和重新置0
end;
 
(The Part I)
procedure TFrmFactoryReport1.BtnPrintClick(Sender: TObject);
var
PageNumber: Integer;
begin
//get the number of pages
PageNumber:=0;
FrmFactoryOutPut.QuickRep1.Prepare;
PageNumber:= FrmFactoryOutPut.QuickRep1.QRPrinter.PageNumber;
FrmFactoryOutPut.QuickRep1.QRPrinter.Free;
FrmFactoryOutPut.QuickRep1.QRPrinter:= nil;
SumPageNumber:= PageNumber;
DataModule1.ADOFactoryOutPut.First;
FrmFactoryOutPut.QRLabel8.Caption:= '共 ' + IntToStr(PageNumber) + ' Page ';
FrmFactoryOutPut.Count_Amount:= 0;
FrmFactoryOutPut.QuickRep1.Preview;
end;

The Part II
public
{ Public declarations }
CountAmount: Integer;
Function AddNumber(sStr: String) : String;
function VarToString(Var InputVar: Real;
DecimalPoint:Integer) : String;
var
FactoryAmount: Integer;
procedure TFrmFactoryOutPut.QRBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
FactoryAmount:= 0;
end;

procedure TFrmFactoryOutPut.QRBand3AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
FactoryAmount:= FactoryAmount + DataModule1.ADOFactoryOutPut.Fields.FieldByName('FactoryAmount').AsInteger ;
end;

procedure TFrmFactoryOutPut.QRBand4BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
CountAmount:= CountAmount + FactoryAmount;
QRLabel48.Caption:= 'Amount of The Page: ' + AddNumber(IntToStr(FactoryAmount)) + ' 件';
if Pos(IntToStr(FrmFactoryReport1.SumPageNumber),QRSysData2.Caption) > 0 then
begin
QRLabel48.Caption:= QRLabel48.Caption + ' All : ' + AddNumber(IntToStr(CountAmount)) + ' 件';
end;
end;

Function TFrmFactoryOutPut.AddNumber(sStr: String): String;
begin
if Length(sStr) > 3 then
begin
if Length(sStr) > 6 then
begin
AddNumber:= Copy(sStr,0,Length(sStr)-6) + ',' + Copy(sStr,Length(sStr)-5,3) + ',' + Copy(sStr,Length(sStr)-2,3);
end
else
AddNumber:= Copy(sStr,0,Length(sStr)-3) + ',' + Copy(sStr,Length(sStr)-2,3);
end
else
AddNumber:= sStr;
end;

procedure TFrmFactoryOutPut.QRBand4AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
if Pos(IntToStr(FrmFactoryReport1.SumPageNumber),QRSysData2.Caption) > 0 then
CountAmount:= 0;
end;

function TFrmYarnStateReport.VarToString(Var InputVar: Real;
DecimalPoint:Integer) : String;
var
strOut : String;
i,j : integer;
begin
str(InputVar:14:DecimalPoint,StrOut);
StrOut := trim(StrOut);
if DecimalPoint = 2 then
i := 6 else
i := 3;
while length(strout) > ido
begin
j := length(StrOut) - i + 1;
insert(',',strout,j);
i := i + 4;
end;
i := length(StrOut) - 2;
if Copy(StrOut,1,2) = '-,' then
StrOut := '-'+Copy(StrOut,3,i);
VarToString := StrOut;
end;
 
The Function AddNumber: 1000 ===> 1,000
The Function VarToString: 1000.00001 ====> 1,000.00
1000 ====> 1,000.00
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部