200分求购 这样的报表该如何做呢?(200分)

A

app2001

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个表结构是这样的
商品类型、结算方式、销售金额
数据如下:
1、西瓜、现金、0.5
2、西瓜、IC卡、1.5
3、黄瓜、现金、1.0
4、黄瓜、IC卡、2.0
5、木瓜、现金、2.5
6、木瓜、IC卡、3.0
现在要制做如下格式的报表:
西瓜、黄瓜、木瓜
现金 0.5 1.0 2.5
IC卡 1.5 2.0 3.0
如果还有其它商品类型的话,列头还要动态增加
我现在用的是FR2.45报表控件来做报表的
这样的报表该如何实现呀?
 
1:动态生成临时表
SELECT 商品类型,计算方式,销售金额 INTO TEMPTABLE FROM TABLENAME GROUP BY 商品类型,计算方式
2:动态创建报表,
1。动态创建QRTABEL,
2。编程控制打印的位置
3。预览-打印
 
用存储过程做,先新建个表(4个字段),放数据也就是你要显示的东西
对商品类型分类保存起来。( ‘’,‘西瓜’,‘黄瓜’,‘木瓜’)
再把结算类型分类出来,在加上上面的条件循环。(‘现金’,‘0.5’,‘1.0 ’, ‘2.5’)
循环就可以了。再当表显示出来就可以了
 
Fr报表里有一个交叉报表的控件,能不能实现我的要求呢,如果要生成临时表,
好象有些麻烦呢
 
数据如下: Table1 (表名)
Code_No, Type, Money (字段名)
1、西瓜、现金、0.5
2、西瓜、IC卡、1.5
3、黄瓜、现金、1.0
4、黄瓜、IC卡、2.0
5、木瓜、现金、2.5
6、木瓜、IC卡、3.0
现在要制做如下格式的报表:
西瓜、黄瓜、木瓜
现金 0.5 1.0 2.5
IC卡 1.5 2.0 3.0
如果还有其它商品类型的话,列头还要动态增加
過程如下:
select Code_No,Type,Sum(Money) as Total_Scalar
into #T
from Table1 Group by Code_No,Type
Create #Temptab(Add_ID int IDENTITY (1, 1) NOT NULL,Type varchar(50) Null) --返回表
insert into #Temptab(Type) select Type from #T
declare @Code_No varchar(50),@Type varchar(50),@Total_Scalar float
declare #MyCur cursor For Select Code_No,Type,Total_Scalar from #T
Open #MyCur
Fetch Next from #MyCur into @Code_No,@Type,@Total_Scalar
while @@fetch_status=0
begin
if not ( Exists(select Name from Syscolumns where Id in(select ID from Sysobjects where Name='#Temptab') and Name='A'+@Code_No) )
Exec(' Alter Table #Temptab add A'+@Code_No+' varchar(50) Null')
Exec(' Update #Temptab set A'+@Code_No+'='+@Total_Scalar+' where Type='+''''+@Type+'''')
Fetch Next from #MyCur into @Code_No,@Type,@Total_Scalar
end
Close #MyCur
Deallocate #MyCur
select * from #Temptab
Drop table #T
Drop table #Temptab
返加了如#Temptab結構的表結構做報表應不成問題了吧
 
哈,库表结构与报表格式跟我做的几乎一样,我是通过ClientDataSet重新定义数据域
实现的。不要用交叉表,交叉表很难看。
 
请教,请教,怎么用ClientDataSet来做法?
 
1、首先取商品类型用于定义数据域:
ADOQuery1.SQL.Text:=select distinct 商品类型 from table;
ADOQuery1.Open;
ClientDataSet1.Data:=DataSetProvider1.Data;
//DataSetProvider1与ADOQuery1相连
2、遍历ClientDataSet1定义ClientDataSet2(最终报表数据集)的数据域
procedure AddFields;
var s:string;
i:smallint;
begin
for i:=1 to ClientDataSet1.RecordCountdo
begin
ClientDataSet1.recno:=i;
s:=ClientDataSet1.fieldbyname('商品类型').asstring;
ClientDataSet2.FieldDefs.add(s+'现金',ftfloat);
ClientDataSet2.FieldDefs.add(s+'IC卡',ftfloat);
end;
ClientDataSet2.CreateDataSet;
end;
3、取原始数据
ADOQuery1.SQL.Text:=select 商品类型,结算方式,销售金额 from table;
ADOQuery1.Open;
ClientDataSet1.Data:=DataSetProvider1.Data;
4、遍历ClientDataSet1,将其数据转换到ClientDataSet2就行了
 
FastReport报表的列要动态创建,因为ClientDataSet2(最终报表数据集)的数据域是动态
创建的.
 
升级到fr2.47吧,fr2.47对制作交叉报表很方便的
 
只要你用过计算字段,你会了现这个很好解决的,
 
2中方式
1、动态生成SQL语句。这个通过一个循环即可实现。
2、交叉报表,也很简单啊,看看DEMO就知道了。
 
用FR 的 frCrossView 吧,非常方便的..
步骤:
1.添加ADOQUERY 取得数据,SQL语句:SELECT Code_No, Type, Money FROM table1
2.添加FrReport 与 FrDbDataSet ,将 FrDBDataSet 与 ADOQuery 连接.
3.设计FrReport , 插入 Cross-Tab 对象.弹出Cross-Tab editor.
Cross-tab view 设置如下:
| Code_No
_________|____________
Type | Money
|
完成后预览,OK . [我使用的FR2.47]
 
老大,我一定给分你,xpmenu我已经下了可还是不行呀
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2384817
 
FR_Desgn, FR_DSet,
FR_DBSet, FR_Class;
这些单元是FR中的吗?
 
http://www.2ccc.com/article.asp?articleid=128
FastReport 2.5 简体中文注册版 (报表控件)
 
我做过类似的报表,当时我就被难在列头需要动态添加,后来我无可奈何,做了一张临时表,使这个列头成为这种表的一个字段,你这个数据是很简单的数据,所以非常容易,你可以这样设计一张表:商品类型、现金销售金额、IC卡销售金额。
只要通过一个sp就可以使原来的表格转化到这个表格中,应用时打开这个sp即可了。
设计报表时,现金和IC卡你可以写死,其他均作为表的字段添加在报表中,就OK了
 
用FR中的交叉表是可以实现的
 
多人接受答案了。
 
顶部