FastReport分组统计的问题,一句话说不清,请高手进来看看

royalkern 2006-03-03 08:18:36
报表有五个字段,分别为:员工编号,员工姓名,考勤异常类型,天值(即异常的时间算多少天数)
考勤异常类型有:迟到,早退等等

报表以“员工编号”为分组头条件

在分组脚统计时我想统计成,某员工迟到多少天,早退多少天。。。这种形式
就是想把某员工的各种异常类型总天值统计出来。

我在FastReport写了如下语句,但是不成功,好LateDay天值只取分组第一行的值
begin
LateDay := 0;
for i := 0 to [LINE#]-1 do
begin
if [frm_OnDutySum.adsAbnormal."memo"]='迟到' then
begin
LateDay:=LateDay+[frm_OnDutySum.adsAbnormal."Valueday"];
end;
end;
end

注:[frm_OnDutySum.adsAbnormal."memo"]即异常类型字段
[frm_OnDutySum.adsAbnormal."Valueday"]为天值,单位:天


想不通如何弄了,请高手指教,谢谢了。
...全文
582 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewQger 2006-03-28
  • 打赏
  • 举报
回复
mark
royalkern 2006-03-08
  • 打赏
  • 举报
回复
问题解决了,是用bybylyly(风之子) 的方法,谢谢,是最简单的

我具体写下来
1.在分组头设置如下变量
LateDays := 0;   --迟到
EarlyDays := 0;   --早退
AbsentDays := 0;  --旷工

2.在主项数据里面判断
begin
if [frm_OnDutySum.adsAbnormal."memo"] = '迟到' then
LateDays := LateDays + [Abnormal]
else if [frm_OnDutySum.adsAbnormal."memo"] = '早退' then
EarlyDays := EarlyDays + [Abnormal]
else if [frm_OnDutySum.adsAbnormal."memo"] = '旷工' then
AbsentDays := AbsentDays + [Abnormal];
end

注:[frm_OnDutySum.adsAbnormal."memo"]是异常类型在报表中的显示

3.在分组脚中如下显示
迟到:[LateDays] 天 早退:[EarlyDays] 天 旷工:[AbsentDays] 天
bybylyly 2006-03-08
  • 打赏
  • 举报
回复
在GROUP HEADER里设置变量A,B,C,然后在MASTER DATD里判断,如果是迟到的就A=:A+1,然后在GROUP FOOTER里加[A][B][C]把各变量的值显示出来就行了,根本不用写语句这么麻烦!你去试试!一定好用
NS_RMP 2006-03-07
  • 打赏
  • 举报
回复
子报表fastreport里面
NS_RMP 2006-03-07
  • 打赏
  • 举报
回复
子报啊
royalkern 2006-03-06
  • 打赏
  • 举报
回复
To: lovendII(流氓都做了城管)

用SQL语句是可以实现:迟到几天,早退几天,旷工几天这样的查询结果的
但是这个结果怎么插入到报表的分组脚中显示
royalkern 2006-03-06
  • 打赏
  • 举报
回复
可能我的表达还没清楚吧,大家有点误会我的意思了
我的报表结果是如下这样的

员工编号  员工姓名  异常类型  天值
001     张三    迟到    0.5
001     张三    迟到    0.5 
张三合计 迟到:1.0天 早退:0天  旷工:0天   --这部分是分组脚统计 
002     李四    旷工    1.0
002     李四    旷工    1.0
李四合计 迟到:0天  早退:0天  旷工:2.0天 
003     王五    早退    0.5
王五合计 迟到:0天  早退:0.5天  旷工:0天 



royalkern 2006-03-06
  • 打赏
  • 举报
回复
TO jmhlp(网事如风) :
我的报表要把所有的记录显示出来,
所以不能用sum(天值)这样的求法
在组脚[Sum(frm_OnDutySum.adsAbnormal."天值")]这个语句会把所有的天值统计出来
我要的效果是统计其中几条记录,而不是所有

lovendII 2006-03-06
  • 打赏
  • 举报
回复
用sql语句来实现吧
jmhlp 2006-03-06
  • 打赏
  • 举报
回复
不好意思,写错一点:
用面的试试
'select 员工编号,员工姓名 sum(天值) as 迟到 ,旷工=(select sum(天值) from table as B where b.考勤异常类型='旷工' and b.员工编号=a.员工编号 group by 员工编号,员工姓名,考勤异常类型),早退=(select sum(天值) from table as c where c.考勤异常类型='早退' and c.员工编号=a.员工编号 group by 员工编号,员工姓名,考勤异常类型) from Table as a where a.考勤异常类型='迟到' group by 员工编号,员工姓名,考勤异常类型'再在报表中用员工编号分组,再在组脚 迟到合计:[Sum(frm_OnDutySum.adsAbnormal."迟到")]
早退合计:[Sum(frm_OnDutySum.adsAbnormal."早退")]
旷工合计:[Sum(frm_OnDutySum.adsAbnormal."旷工")]
总合计:[Sum(frm_OnDutySum.adsAbnormal."迟到")+frm_OnDutySum.adsAbnormal."早退")+frm_OnDutySum.adsAbnormal."旷工")]
jmhlp 2006-03-06
  • 打赏
  • 举报
回复
用一个交叉报表可以解决,
否则就要用这样的查询语句
select 员工编号,员工姓名 sum(天值) as 迟到 ,旷工=(select sum(天值) from table as B where b.考勤异常类型='旷工' and b.员工编号=a.员工编号 group by 员工编号,员工姓名,考勤异常类型),早退=(select sum(天值) from table as c where c.考勤异常类型='早退' and c.员工编号=a.员工编号 group by 员工编号,员工姓名,考勤异常类型) from Table as a where c.考勤异常类型='迟到' group by 员工编号,员工姓名,考勤异常类型 ’再在报表中用员工编号分组,再在组脚[Sum(frm_OnDutySum.adsAbnormal."迟到")+frm_OnDutySum.adsAbnormal."早退")+frm_OnDutySum.adsAbnormal."旷工")]
jmhlp 2006-03-05
  • 打赏
  • 举报
回复
如果有可能,最好用分组查询实现:
‘select 员工编号,员工姓名,考勤异常类型,sum(天值) as 天值 from Table group by 员工编号,员工姓名,考勤异常类型’再在报表中用员工编号分组,再在组脚[Sum(frm_OnDutySum.adsAbnormal."天值")]
jmhlp 2006-03-05
  • 打赏
  • 举报
回复
用一个交叉报表就解决了所有问题
royalkern 2006-03-04
  • 打赏
  • 举报
回复
不要沉了啊,顶起来!

高手都到哪里去,帮帮忙,谢谢!
royalkern 2006-03-04
  • 打赏
  • 举报
回复
怎么没人知道呢?
:首先是要分组,因为如果不分组,想合并的列与其它列会自动打印。这样,只能使用FR自带的隐藏重复数据的功能,但很多类似报表都是要求合并行居中的,这点FR就不能自动实现了。 2:要全并的列放在分组脚中,其它放在分组数据BAND中,这样,打印完分组数据BAND后,动态改变分组脚中要合并列的TOP和HEIGHT就可以了。而且这样打印,因为要合并的行实际上只打印了一遍,因此应该效率更高。所以这就需要在打印分组数据BAND后有一个可记录此分组已打印高度的功能。 3:代码解释 procedure MCOnAfterData(Sender: TfrxComponent); begin if =1 then MC.Tag:=Int(MC.Height) else MC.Tag:=MC.Tag+Int(MC.Height); end; 因为FR的在每次分组后重新计数,使用MC.Tag保存现在数据BAND上的所有不合并行的总高度。当然也可以使用一个变量,但放着这么多TAG不用,多浪费呀。况且使用TAG的语法也比使用变量简单,使用变量使程序看上去很难懂。 if >=1 then 这样的写法看起来多痛苦呀。 procedure MBBOnAfterData(Sender: TfrxComponent); begin MBB.Tag:=GetStandHeight(MBB.CalcHeight); //这一句是为了保持行高的一致性,如果不需要直接 MBB.Tag:=MBB.CalcHeight; //这样可能计算的行高不是标准行高的整数倍。 MBB.Visible:=False; end; procedure MD1OnBeforePrint(Sender: TfrxComponent); begin if =1 then MBB.Visible:=True; end; 上二句只是为了不多次统计CalcHeight,但不能直接设可视性为假,否则不会触发MBBOnAfterData事件。 计算此例中可能会很高的列的计算高度,这是在宽度已经确定的情况下计算的。 因为此例中的第二列单行高度可能大于其它列的总高度。如果没有此例中的特殊情况,可以省略。 4:如果此例中没有第二列单行高度可能大于其它列的总高度的话,MBB是不需要的。 5:如果不是要求空行为多行多列显示的话,GFOnBeforePrint也是不需要的,只需要在GF上放二个MEMOVIEW,宽高和左边距分别与上方的二个相同,调用我例子中注释掉的代码改变它们的TOP和HEIGHT即可。 6:TAG是所有Tcomponent的属性呀,这是我最常使用的一个属性。
这个指南让你熟悉报表设计器和了解报表设计的基本概念(各种区域,数据源,二次表,等等)。指南将帮助你开始用FastReport创建报表,但它不能告诉你怎样使用其它基本的报表设计器。 如果你不熟悉报表设计器,我们建议你参考QuickReport的帮助系统。QuickReport的指南已经包含在你的Delphi拷贝中。QuickReport的大部分基本概念也适用于FastReport,然而,FastReport能提供更多的弹性和最终用户的自定义。 关于FastReport的说明 FastReport是高弹性的报表设计器,用于报表的数据可以从任何类型的数据源获取,包含字符列表,BDE数据库,ADO数据源(不使用BDE),Interbase(使用IBO),Pascal数组和记录,以及一些不常用的数据源。 整个FastReport系统是用Delphi的Pascal编写的。FastReport不需要动态链接库,但需在你的项目中占用大约400kb(Delphi 5)。如果你想最终用户拥有设计能力,这将在你的.EXE中增加大约500kb。虽然这看上去比较大,但这只是其它设计的几分之一。你同样应该考虑到FastReport不仅仅只是包含最终用户更改报表设计的能力,还能够适应查询和数据库的变化。FastReport还包含自己的脚本语言,让应用程序和最终用户能够更容易地改变报表。如果你的大部分应用使用FastReport,你可以简单地配置FastReport BPL(大约1400kb)而所有你的应用程序只需要保留很少的一部分。 你可以发现FastReport有一个非常吸引人的用户界面,使用最新的用户界面组件,例如可停靠的工具栏。你的最终用户将会非常愿意使用这个设计器,只需使用鼠标就可以创建大多数报表。 FastReport是名副其实的快速报表:较其它一些Delphi报表设计器而言,你可以发现没有什么可以接近于它的开发速度。报表预览窗口一直是大多数报表设计器的弱点,高品质的外观,赋于你的应用程序非常专业的用户界面。 FastReport是一个已经拥有三年历史的非常成熟的报表设计器,成长使它拥有其它Delphi报表设计器所不能相比的诸多先进特性。

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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