fastreport的世纪巨难问题,,,,,,,,,,,,,,,,,,难道只有等FR的老总出马? (50分)
分类:报表/统计图形 delphiyesterday (2003-10-28 0:19:00)
程序运行时自定义fastreport报表的一些问题:
我是第一次用fastreport,因为看到fastrepot可以自定义报表,
我的目的如下述:
例如销售发货单有很多种打印格式(要按收货单位的格式进行套打),我的做法是在打印时允许用户自已定义好格式,保存到数据存中,然后调用打印。
有下列问题急待解决:
1.在程序中有许多query(table),我在调用frReport1.DesignReport设计报表时如何只指定其中某几个query出现在设计表中;
2.query中的字段的中文名称如何加进去,在它的数据字典的字段别名中可以加,但我是想在设计前就加上(不能让用户去加)
最终我做成的打印管理器会编译成一个bpl,所有程序都可以调用,在调用之前,只要将相应的query(table)准备好即可。
望各位经验丰富之大侠把我从打印报表中解脱出来,不胜感激!
vmao (2003-10-28 7:56:00)
这两个问题可以看作是“无理要求”,驳回!
mzr (2003-10-28 8:12:00)
象这种要求恐怕只有你自己重新做一个自己的报表组件了。
Netsoft (2003-10-28 9:27:00)
如果想实现呢,
自己可以去看代码的啦,
呵呵~~~~~~~~~~~~~~~~~~~~~~
delphiyesterday (2003-10-28 11:01:00)
各位,给点真东西出来呵.....
衫菜 (2003-10-28 11:08:00)
还是用QREPORT吧,能实现的。
delphiyesterday (2003-10-28 11:14:00)
qreport能实现?
delphiyesterday (2003-10-28 11:21:00)
who can help me???
anchony (2003-10-28 11:29:00)
I Think no man if you really to used the fastreport
fastreport is good control but it isn't the omnipotence
delphiyesterday (2003-10-28 14:11:00)
up............................................................
whf (2003-10-28 14:20:00)
实现并不难:用代码生成数据字典即可
delphiyesterday (2003-10-28 14:32:00)
whf,如何用代码生成数据字典呢?
app2001 (2003-10-28 14:40:00)
Fastreport 动态连接库
[内容]
一、目录清单
bin目录用于fr24目录下的FastReport2.47包文件编译后的bpl文件存放目录
dcu目录用于存放编译后的dcu文件
demo目录为演示目录,当觉得此动态库有利用价值的话可以将其下的相关文
件复制到其它目录以备将来所用。
fr24目录为FastReport2.47经本人修改后的所有源代码及新增的几个报表控
件fr_AngLbl.pas及fr_MoneyMemo.pas,用户只需将fr24/source下的
fr7.dpk项目文件编译安装即可。
report目录为动态连接库源代码目录。
二、功能说明
本动态连接库主要目的是将报表与系统分开,为缩小应用系统的大小,同时也
为统一管理报表提供了可能,在应用系统中只需按提供的接口进行调用即可,
在使用之前请仔细阅读以下内容:
1、请将下列文件复制到指定目录
1>将demo目录下的uDll.pas文件复制到源代码目录且应用程序源项目可以
找到的地方。
2>将demo目录下的reports目录,report.ini, report.dll文件复制到应
用系统的运行目录.
3>uDll.pas文件对调用函数进行了详细的描述。
uReport.pas文件对修改的FastReport部分函数进行了详细的描述。
2、当您发布系统时,为了清除掉演示数据(如果您不想清除可以不做),请将
上面复制的reports目录下的所有文件删除,将report.ini文件内容清空。
3、uDll.pas文件调用说明
在此文件中声明了所有动态连接库中的可以调用的功能接口,只需按相应
的调用参数调用即可,具体调用信息请参考uDll.pas中的函数备注。
4、report.ini文件内容说明
在此文件中描述了动态连接库调用的一些相应信息,其中图示如下:
[System] <------------此项为系统段
Total=3 <------------此项为系统中所有的报表总数
[ERP_Order]<------------此项为功能模块段[mID=ERP dID=Order]
Count=3 <------------此项为功能模块段的报表计数,此处为3
Index=2 <------------此项为功能模块段用户最后选择的报表索引
1=R00001,2003/07/31 14:47:44,订单清单
2=R00002,2003/07/31 14:49:21,订单清单(日期)
3=R00003,2003/07/31 14:52:19,订单清单(页码)
<-------上面的三项为报表的信息,以逗号分隔,分别为
=>
1,2,..表示第一,二,..张报表。
=>
R00001,R00002,..表示报表在reports目录下的文件名。
=>
2003/07/31 14:47:44 .. 表示报表修改的时间。
=>
订单清单.. 表示报表名称。
当有其它的功能模块调用时将会产生新的功能模块段,此处不再赘述。
三、版权声明
本程式没有加密,完全公开,如果您觉得不错或提供更宝贵的意见或您加强了
部分程式的功能请给我发邮件,我们大家交流一下。
my e_mail: dragon_lsw@163.com
四、愿我们大家共同进步, 谢谢您的支持。
2003.10.20
http://www.51delphi.com/delphi/soft?type=报表
也许你想要的就是这种方式呢???去看看吧
yhw1999 (2003-10-28 17:58:00)
delphiyesterday1.
1. 你试试以下方法是否可行 ?
原理: 把你不想要显示的表名放在报表的 DisabledDatasets 列表中
ts1 := TStringList.Create();
try
//屏蔽数据源
RptFr1.Dictionary.GetDatasetList(ts1);
for i := 0 to ts1.Count - 1do
begin
if ts1.Strings <>
'djmxtable' then
RptFr1.Dictionary.DisabledDatasets.Add(ts1.strings);
if ts1.Strings <>
'XXXXX' then
// 此处写上你不需要显示表的名称
RptFr1.Dictionary.DisabledDatasets.Add(ts1.strings);
end;
finally
ts1.free;
end;
2. 第二个问题刚才也是我做过的, 我做的程序允许用户在运行时可以自己设计报表,但是你总不能全部字段都用英文显示吧, 因此我把他转成了中文. 我的做法如下:
1) 首先将你使用的表的字段名及中文名称保存在表中, 如果是固定的或者以后再不需要改动,也可直接写在程序中.
2) 在设计前 找到报表中相应的字段名称 换成中文,下面是我写的代码:
s1:= 'frmQuery1.Tquery';
qry1.Open;
// 里面放的是 英文字段和中文字段
with fr1.Dictionarydo
begin
while not qry1.Eofdo
begin
s2 := s1 + qry1.FieldByName('fdName').AsString;
// fdname 为英文字段名称
FieldAliases[s2] := qry1.FieldByName('ChnName').AsString;
// chname 为中文字段名称
qry1.Next;
end;
end;
delphiyesterday (2003-10-29 13:37:00)
app2001的看来也是好东东,不过我暂时看不明,我会慢慢研究......
但yhw1999的对我来讲真是我这几年一直所想得到的东东,,,,,,
朋友,你真的是太好了.....
我现在能做什么?
除了高兴之外还有的.....
也许是高兴得流眼泪吧. 我的QQ:23425998, MSN:yesterday97@hotmail.com
13156191018 (2003-10-29 13:32:00)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2257794
esunhong (2003-10-29 19:15:00)
我来试一试,先谢谢delphiyesterday1及yhw1999
esunhong (2003-10-29 20:30:00)
s1:= 'frmQuery1.Tquery';
qry1.Open;
// 里面放的是 英文字段和中文字段
with fr1.Dictionarydo
begin
while not qry1.Eofdo
begin
s2 := s1 + qry1.FieldByName('fdName').AsString;
// fdname 为英文字段名称
FieldAliases[s2] := qry1.FieldByName('ChnName').AsString;
// chname 为中文字段名称
qry1.Next;
end;
end;
?????????????????????
请问yhw1999,s2里是什么东西 s2 frmQuery1.Tquery字段名 这是什么?我这样试没什么反映
weifang (2003-10-29 20:55:00)
fr的老縱出馬肯定不行的啦!老縱只認識錢!
lhc4000 (2003-10-29 21:13:00)
他说的是总工程师吧
woyaoying (2003-10-29 21:25:00)
楼主你的意思是想让用户可以修改报表后并且保存到数据库。
目的是不是就是让用户自定义报表。
如果是,老总肯定先吐血!
世纪难题?
差点把我吓死,至于吗?用不着这么虚张声势吧。
yhw1999 (2003-10-30 1:21:00)
这里写错了, s1:= 'frmQuery1.Tquery';
应该为 s1:= 'frmQuery1.Tquery.';
后面应该加一个 "."
s2的内容例如为spname字段的名称
s2 := 'frmQuery1.Tquery.spname'
FastReport就是通过这个名字找字段的,并将其内容赋在中文字段名称
fr1.Dictionary.FieldAliases[s2] := '商品名称';
yhw1999 (2003-10-30 1:32:00)
从昨天回答问题到现在又解决了一个使用FastReport的难题:
那就是让你设计的报表在不同的Form调用下也可显示的问题, 也就是在换了数据环境的情况下也能够正常显示.
看了FastReport的代码整整两天才找到解决办法.
另外, 我以前还对FastReport作过一些功能上的增强, 不知有人要吗 ?
delphiyesterday, 我使用FastReport和你的想法一样, 在Form中调用设计窗口让用户自己设计报表,然后以流的方式存在数据库中, 报表中的字段及变量全部设成中文名称;
在设计界面增加了报表导入,导出的功能;又增加了方便报表控件排列格式的功能: 垂直最小间隔,等高,等宽距 三种;修改并让可以在不同的Form中正常显示报表.
以上的功能都已完成,并已用在商业系统中.
现在还没有用完成的功能有: 增加处理成大写金额的函数, 增加动态报表的功能(自动根据当前Form生成报表), 不知你否能帮帮我
delphiyesterday (2003-10-30 12:53:00)
我想下,不过我的水平麻麻呵,我现在还有个问题:我用的fastreport报表保存成WORD文件时格式全乱了,如何才能保存成不变格式的WORD文件? 多谢.
lzhuan (2003-10-30 13:07:00)
開始轉向FastReport.
yhw1999 (2003-10-31 13:12:00)
我还没有转成Word格式保存,不过我过段时间会做转成Wrod格式的,
wwwwb (2003-11-03 10:05:00)
我用
s1:= 'table1.bh';
frreport1.Dictionary.FieldAliases[s1] := '商品名称';
frreport1.DesignReport;
可以设置别名,但又无法预览。不知是否是FR2.5的BUG?
yhw1999 (2003-11-05 1:32:00)
To wwwwb:
我看过FR的源代码,如果我没有记错的话:FR表示一个字段时的格式应该为:
Form名称+表名+字段名称,你设置的没有Form名,这实际上没有起作用。
另外,我记着源码中好像是这样做的:当你设置一个变量的名称时,如找不到此变量,那么会自动创建一个以你指定名称为名的变量。此例中也就是创建了一个"table1.bh“的变量,但实际上你真实字段的名称应为: Form名+'table1.bh',我想这就是错误的原因吧!
wwwwb (2003-11-05 8:41:00)
谢谢YHW1999,是这样,我在D6的FORM中放入一TABLE1,然后用上述代码设置字段别名,
然后在FR中插入字段别名(已经是中文名称),预览时报无法找到字段别名(
table1.商品名称)。
用你的方法在字段别名中连中文名称都找不到,不知是否是没有理解你的意思?
我用:
s1:= 'form1.table1.bh';
frreport1.Dictionary.FieldAliases[s1] := '商品名称';
再次感谢!
wwwwb (2003-11-05 9:45:00)
自己已解决,在BNDSOURCES中加入FRDATASET1,用上述代码即可,也可预览