您哈,我想问一个水晶报表多列显示的问题,如何指定每列的行数?【T】

ghxnet 2009-04-22 11:28:28
就是在水晶报表中,分几列显示(列数固定)
然后指定每列的记录数
记录很多,每次显示时可能要求的行数不同
如上一次显示每页10行,下次可能是15或者20行(行高合计不超过一页)
因为记录数较多,有时可能上万,用记录分组加子报表虽然能够实现,但速度很慢,没有实用价值
指定每页行数的话,又是在一列显示满了再显示下一列,导致版面混乱
如何处理?
有点类似于下面的
张三 李四 王五
工资 100 工资 100 工资 100
奖金 100 奖金 100 奖金 100
津贴 100 津贴 100 津贴 100
扣款 100 扣款 100 扣款 100


记录表是这样的

张三 工资 100
张三 奖金 100
张三 津贴 100
张三 扣款 100
李四 工资 100
李四 奖金 100
李四 津贴 100
李四 扣款 100
王五 工资 100
王五 奖金 100
王五 津贴 100
王五 扣款 100
王五 工资 100

谢谢!
...全文
621 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kone123 2009-11-02
  • 打赏
  • 举报
回复
学习学习
阿泰 2009-04-29
  • 打赏
  • 举报
回复
方案接6楼。

重点在数据分组

借用2楼的建表语句

create table [T] ([name] varchar(4),[class] varchar(4),[money] int)
insert into [T]
select '张三','工资',100 union all
select '张三','奖金',100 union all
select '张三','津贴',100 union all
select '张三','扣款',100 union all
select '李四','工资',100 union all
select '李四','奖金',100 union all
select '李四','津贴',100 union all
select '李四','扣款',100 union all
select '王五','工资',100 union all
select '王五','奖金',100 union all
select '王五','津贴',100 union all
select '王五','扣款',100 union all
select '王五','工资',100

/*
创建带序号的列表,注意,需SQL2005及以上
*/
create view v_t
as
select ROW_NUMBER() over(order by a.name asc) as 'idx',a.name as name1 from
(select distinct name from t) as a

/*
报表用语句
*/
select t.*,v_t.idx from t,v_t
where t.name=v_t.name1

/*

name class money idx
李四 工资 100 1
李四 奖金 100 1
李四 津贴 100 1
李四 扣款 100 1
王五 工资 100 2
王五 奖金 100 2
王五 津贴 100 2
王五 扣款 100 2
王五 工资 100 2
张三 工资 100 3
张三 奖金 100 3
张三 津贴 100 3
张三 扣款 100 3
*/



然后按照idx分组即可。
bowlingljf 2009-04-29
  • 打赏
  • 举报
回复
看楼主的主贴好像明白楼主要实现什么效果,但接着往下面看楼主的回复又搞不懂楼主的需求了。

从楼主的主贴中,我是这样理解的:
1、楼主说要分列显示,其实楼主的要求应该是要分栏显示。

2:原如数据如下:
记录表是这样的
张三 工资 100
张三 奖金 100
张三 津贴 100

3、想实现的效果如下:
有点类似于下面的
张三 李四 王五
工资 100 工资 100 工资 100
奖金 100 奖金 100 奖金 100
津贴 100 津贴 100 津贴 100
扣款 100 扣款 100 扣款 100
------------------------------
1、从原如数据和实现效果对比看:名字横向显示了,这就应该需要用到交叉表,不管是在SQL端实现,还是直接用水晶报表实现。
2、如果是简单的用分栏去实现,格式应该是如下效果:

姓名 类别 金额 姓名 类别 金额
张三 工资 100 李四 工资 100
张三 奖金 100 李四 工资 100
张三 津贴 100 李四 工资 100
张三 工资 100 李四 扣款 100

阿泰 2009-04-22
  • 打赏
  • 举报
回复
所以说,是多个分组关系啊,呵呵。

你的要求应该是这样的


出勤 日工资 金额 这3个基础列是不变的
张三 李四 王五 人是变的,假设为n

那么出来的总列数就是3*n

现在我们假设一行可以显示4个人,就是3*4=12列
按照之前的方法,我们只要每4个人分一组就可以了。

也就是在现在的交叉表基础上,增加一个分组。

我晚些构造点数据做做看,希望你用的不是access.

ghxnet 2009-04-22
  • 打赏
  • 举报
回复
babyt ,你好
我研究过那个帖子

和我的实际应用有点差距

主要差别在要显示的记录只有一列
我的要有三列或更多

把那个帖子的最后效果图头上再加一行
像华东公司,华中公司什么的,下面再是各地自公司的
就差不多了
ghxnet 2009-04-22
  • 打赏
  • 举报
回复
主要是排版、打印的问题
想要出一个报表
阿泰 2009-04-22
  • 打赏
  • 举报
回复
你稍微花点时间看一下
http://topic.csdn.net/u/20090422/00/6ad57982-d44c-44a8-8089-e19107b0c86c.html

是不是想要类似于最后一个图的效果呢?

理论上对人名上面再加一个分组就可以了,呵呵
ghxnet 2009-04-22
  • 打赏
  • 举报
回复
我刚才回复时,没看到你第二个帖子
主要是有多列,每列里带小列
你的方本身不错,可是格式不对
可惜我没地方贴图

将就看吧
有点像工资表,一个人要有项目,出勤,日资,合计什么的,不只是一列
而其每个人的列表还要有项目
开始我是用子报表实现的,可是数据一多就速度奇慢
请继续帮我想办法,谢谢

张三 李四 王五
出勤 日工资 金额 出勤 日工资 金额 出勤 日工资 金额
工资 1 50 50 工资 1 50 50 工资 1 50 50
奖金 2 50 100 奖金 2 50 100 奖金 2 50 100
津贴 3 50 150 津贴 3 50 150 津贴 3 50 150
ghxnet 2009-04-22
  • 打赏
  • 举报
回复
wxg22526451 ,你好
你的方法本身不错,可不是我想要的
我想要的是多列显示,每列显示相应数据

在补充一下,每列可能是多小列
例如

张三 李四 王五
出勤 日工资 金额 出勤 日工资 金额 出勤 日工资 金额
工资 1 50 50 1 50 50 1 50 50
奖金 2 50 100 2 50 100 2 50 100
津贴 3 50 150 3 50 150 3 50 150

大致是这个意思
用交叉表也试过了,但多小列的弄不成
而且实际应用也很麻烦
请高人指点迷津
xiaojing7 2009-04-22
  • 打赏
  • 举报
回复
跟在后面学习
wxg22526451 2009-04-22
  • 打赏
  • 举报
回复
--> Test Data: [T]
if object_id('[T]') is not null drop table [T]
create table [T] ([name] varchar(4),[class] varchar(4),[money] int)
insert into [T]
select '张三','工资',100 union all
select '张三','奖金',100 union all
select '张三','津贴',100 union all
select '张三','扣款',100 union all
select '李四','工资',100 union all
select '李四','奖金',100 union all
select '李四','津贴',100 union all
select '李四','扣款',100 union all
select '王五','工资',100 union all
select '王五','奖金',100 union all
select '王五','津贴',100 union all
select '王五','扣款',100 union all
select '王五','工资',100

--select * from [T]
--Code
--2000静态
select
[类别]=[class],
[张三]=max(case when [name]='张三' then [money] else 0 end),
[李四]=max(case when [name]='李四' then [money] else 0 end),
[王五]=max(case when [name]='王五' then [money] else 0 end)
from
T
group by [class]

--2000动态
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([name])+'=max(case when [name]='+quotename([name],'''')+' then [money] else 0 end)'
from T group by [name]
exec('select [类别]=[class]'+@s+' from T group by [class]')

--Drop

--Result
/*
类别 张三 李四 王五
---- ----------- ----------- -----------
工资 100 100 100
奖金 100 100 100
津贴 100 100 100
扣款 100 100 100
*/
wxg22526451 2009-04-22
  • 打赏
  • 举报
回复
用SQL行列互换下
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html
ghxnet 2009-04-22
  • 打赏
  • 举报
回复
另外补充一点,记录表的行数经常变化
说白了,就是行很多且常变,列比较少且固定
打印报表时只有纸张左边的一点,很不好看且浪费纸张
现在想一页内多打印几列,但是排版出来的报表每列的行的总行高小于页面高度导致版面混乱
在只打印一列的情况下我可以指定每页行数,但多列就不行了

希望能打印的整齐一点并加上页汇总
请指点,谢谢
ghxnet 2009-04-22
  • 打赏
  • 举报
回复
好的,谢谢

最后希望达到的效果是我先把数据都汇总到一个m×n的表中(m为行)

然后在报表中出现 x行,y列(y是n的整倍数)

我在水晶报表中指定了多列显示,
而由于x行的行高小于页面高度,导致每页出现的行数>x,导致下一个列的数据追加在上一行的行尾
水晶报表中,指定每页行数不是我想要的效果,是把整页的行数改变了,导致前半截行多,后半截空白

我现在就想在水晶报表中达到这样的效果,m×n数据规整的一列列填在一个x×y的报表中,这个报表可能有上百页

用子报表是在太慢

你的方法应该是直接生成一个m/(y/n)行,y列的临时表
当然,只要解决问题,什么方法都行

现在我有个问题想请教,如果我需要出页汇总和报表汇总,如何处理?
(很可能每个记录项目都需要,包含行和列,有点像交叉表的汇总,列是本列的合计,行可能是同行同项目的合计,就是合计数也分n列)

谢谢你的帮助

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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