送分题,FastReport分组统计

caoyu_hk 2008-04-29 10:37:27
这样的一个数据集(我可以根据需要再调整,添加一些其他的信息列,保证报表的打印),要打印成这样的报表,应该怎么打

客户名称 结算单号 产品 数量 金额
张三 0001 A 10 100
张三 0001 B 20 300
张三 0001 C 15 45
张三 0001 D 70 350
张三 0002 E 30 150
张三 0002 F 8 320
.
.
.

打印出的格式要求是

---------------------------------------

结算单号: 0001 客户: 张三

A 10 100
B 20 300
C 15 45
D 70 350
小计 115 795
大写金额 柒佰玖拾伍元零角
操作员 : Admin 日期 : 2008.04.29
第一张 累计金额: 795

---------------------------------------

结算单号: 0002 客户: 张三

E 30 150
F 8 320
.(后面如果没有记录了,要补足每张单子4行的高度)
.
小计 38 470
大写金额 肆佰柒拾零元零角
操作员 : Admin 日期 : 2008.04.29
第二张 累计金额: 1265 (说明:这个值是本张报表小计金额与上一张的累计金额的和)

---------------------------------------

我用FastReport作,分组和小计是好实现的,我用GroupHead和MasterData,GroupFoot三个Band实现了,现在还有三个问题
1.我在GroupHead上放了一个Memo,写上[FrxData."结算单号"],结果打出来,两张上的结算单号都是0001,第二张应该是0002
2.每张上的小计我用GroupFoot实现了,但是由于小计结果是动态产生的,转化成大写形式应该怎么作,自定义函数么
3.现在每张单子要求是4条记录,最后一张很可能出现不足4条的情况,比如只有1条,这时候小计结果会打印到第2条记录的位置,底

下的信息都跑到上面去了,这个应该怎么处理

希望给予指点的朋友能说的详细写,那些信息放到哪个Band上,象现在,操作员和日期是死的,但是这一栏上下的内容又都是动态生成的,比较麻烦
...全文
674 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoyu_hk 2008-05-07
  • 打赏
  • 举报
回复
后来都自己研究出来了,其实难是不难的,不过除了SWind 给出了具体的解决方法,其他朋友说的都太简略,我帖子里的要求是详细点,所以尽管SWind 只给我解决了一个问题,分数也基本都给他了
xingyongjian 2008-05-05
  • 打赏
  • 举报
回复
不是分组显示,
提供多个MasterDataBand就可以了.
brightsea_pan 2008-05-02
  • 打赏
  • 举报
回复
1.将数据集整理成主从形式,可以解决单据号显示不正常的问题。
2.加空行,用脚本解决,根据FreeSpace的值,详见附件。
3.金额累加,用脚本解决,设置全局变量,我是在报表表中设置的,不知道可不可以有更好的地方设置。
brightsea_pan 2008-05-02
  • 打赏
  • 举报
回复
http://download.csdn.net/source/438259
看看这个是否能够解决?
caoyu_hk 2008-04-30
  • 打赏
  • 举报
回复
SWind的方法只能解决金额问题,金额其实我有个笨办法也能解决的
其他几个问题没人能回答了么
CACACACACA 2008-04-30
  • 打赏
  • 举报
回复
你是怎么做到的,我怎么做都做不到这样.
caoyu_hk 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengsh998 的回复:]
按客户名称和结算单号进行group by再透影出视图之后,再从这个视图中读取资料就可以了.
SQL的查询语句可以达到效果
[/Quote]
是,我现在就是这样作的,但是你仔细看我帖子就知道了,分组那部分已经好了,但是结算单号放在GroupHeader里结果不对,现在第二条SWind提出解决办法了,第三条我自己实现了,就是第一条,其实我相信很简单,应该怎么放置Band和Memo,我现在就是这点卡住了
边缘998 2008-04-30
  • 打赏
  • 举报
回复
按客户名称和结算单号进行group by再透影出视图之后,再从这个视图中读取资料就可以了.
SQL的查询语句可以达到效果
caoyu_hk 2008-04-30
  • 打赏
  • 举报
回复
自己定义纸张,不过这个跟纸张没关系吧
CACACACACA 2008-04-30
  • 打赏
  • 举报
回复
什么大小的纸张
SWind 2008-04-29
  • 打赏
  • 举报
回复
function TJzpzEdit1.MoneyCn(mmje: Double): string;
const
s1: string = '零壹贰叁肆伍陆柒捌玖';
s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';

function StrTran(const S, s1, s2: string): string;
begin
Result := StringReplace(S, s1, s2, [rfReplaceAll]);
end;
var
S, dx: string;
i, Len: Integer;
begin
if mmje < 0 then
begin
dx := '负';
mmje := -mmje;
end;
S := Format('%.0f', [mmje * 100]);
Len := Length(S);
for i := 1 to Len do
dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)
* 2 + 1, 2);
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰',
'零'),
'零拾', '零'), '零角', '零'), '零分', '整');
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零',
'零'),
'零亿', '亿'), '零万', '万'), '零元', '元');
if dx = '整' then
Result := '零元整'
else
Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');
end;
//////////
procedure TJzpzEdit1.FormCreate(Sender: TObject);
begin
frxReport1.AddFunction('function MoneyCn(mmje: Double): String;','Myfunction','小写金额转大写的函数');
end;
//////////
function TJzpzEdit1.frxReport1UserFunction(const MethodName: string;
var Params: Variant): Variant;
begin
if UpperCase(MethodName) = UpperCase('MoneyCn') then
Result := MoneyCn(Params[0]);
end;
//////////
报表中调用方法
MoneyCn(50000000)
caoyu_hk 2008-04-29
  • 打赏
  • 举报
回复
呵呵,我分组,小计已经实现了,问题是现在结算单号,大写金额这些解决不了
brightyang 2008-04-29
  • 打赏
  • 举报
回复
然后在afterprint里面控打
brightyang 2008-04-29
  • 打赏
  • 举报
回复
group by 单号

然后
:首先是要分组,因为如果不分组,想合并的列与其它列会自动打印。这样,只能使用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报表设计器所不能相比的诸多先进特性。
这个指南让你熟悉报表设计器和了解报表设计的基本概念(各种区域,数据源,二次表,等等)。指南将帮助你开始用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报表设计器所不能相比的诸多先进特性。

5,498

社区成员

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

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