Office中国论坛/Access中国论坛

标题: 征求不固定行数的报表补空行方法 [打印本页]

作者: t小宝    时间: 2010-9-18 16:41
标题: 征求不固定行数的报表补空行方法
本帖最后由 t小宝 于 2010-9-18 18:19 编辑

红尘如烟今天发了一个很好的报表补空行的例子,但是是固定每页的行数的,包括以前论坛的一些补空行例子也是固定行数的,这就有一个问题,不能调整页面大小了,因为如果调小了就装不下那么多行,出现混乱。

因此就想能否不固定每页的行数,而是只要最后一页的记录不满页,就用空行把页面补满,并且在调整页面设置后能自动增减空行数量,保持最后一页完整。

这个功能我研究过,但发现难度太大,中途而废。只有期待高人出手了。



作者: todaynew    时间: 2010-9-18 16:42
有点裸捐的味道
作者: t小宝    时间: 2010-9-18 17:10
响应老汉的号召,以钱多为耻,以后通过的提问的方式把钱捐完(也就是裸)。
但我还搞不清楚,这个赏金是从个人账户扣还是公款消费。
作者: 红尘如烟    时间: 2010-9-18 18:02
我以前发过一个例子,也是画出表格的,用的方法比较笨,但和小宝的这个要求有点像,我当时的做法是根据第一页的记录数来确定每页能显示多少条记录,但这个方法也有一个问题,数据如果不足一页时没有办法实现补空行了,感觉Access对于每页格式固定的报表(如各种单据)处理起来比较功能较弱
作者: 红尘如烟    时间: 2010-9-18 19:24
把我做的那个例子改了一下,现在可以不指定每页显示的行数了,但用的还是读取第一页的记录行数为标准,仍然没有实现“数据不足一页时也能补空行”的功能
http://www.office-cn.net/forum.php?mod=viewthread&tid=93201&page=1&extra=#pid563116

作者: t小宝    时间: 2010-9-18 19:46
本帖最后由 t小宝 于 2010-9-18 19:47 编辑

除"数据不足一页时也能补空行"外还有2个问题,
1、当有报表页眉时,第1页记录数与后页的记录数是不一样的,那么读取第一页的记录行就不行,如果还有报表页脚,会更复杂。
2、应允许预览时调整页面设置,如预览时把页面从纵向改为横向,如何动态调整空行数量,而不是关闭预览重新打开。
作者: xinbao    时间: 2010-9-18 20:39
看高手论坛, 借机捡些食碎
作者: todaynew    时间: 2010-9-19 12:29
除"数据不足一页时也能补空行"外还有2个问题,
1、当有报表页眉时,第1页记录数与后页的记录数是不一样的, ...
t小宝 发表于 2010-9-18 19:46

问题的核心只是获得不同纸型的高度吧?得到了这个高度,便能算出主节部分允许的高度,知道主节允许的高度,便也就能算出需要补的空行数。
作者: t小宝    时间: 2010-9-19 13:34
回复 todaynew 的帖子

脑子转得真快!纸张大小,还有页边距等。。。
   
作者: 红尘如烟    时间: 2010-9-19 14:06
我试过用读取报表的PrtDevMode属性代表的DEVMODE结构中的intPaperLength属性,不成功,这个看样子好像只有使用自定义纸张时才有效
剩下的办法就是:把所有预定义的纸张高度写在判断代码中,然后根据rpt.Printer.PaperSize属性及rpt.Printer.Orientation来取得纸张高度,根据rpt.Printer.TopMargin 及 rpt.Printer.BottomMargin 来得到上下页边距,不过这个就比较麻烦一些了,光是根据预定义纸张大小来得到纸张高度的代码量就不小
作者: t小宝    时间: 2010-9-19 14:29
确实比较麻烦,不知是否还有更巧妙的方法。。。
作者: todaynew    时间: 2010-9-19 16:42
本帖最后由 todaynew 于 2010-9-19 19:05 编辑
我试过用读取报表的PrtDevMode属性代表的DEVMODE结构中的intPaperLength属性,不成功,这个看样子好像只有使 ...
红尘如烟 发表于 2010-9-19 14:06


我不太明白,用Printer的一组属性难道不能返回纸的高度吗?


好像还有一个方法可以解决问题。因为报表的Pages属性可以得到不加空白行的总页数。这样可以固定补空行数总是很大的数,比如固定补100行。当补行超过Pages则立刻中断补行的循环。


作者: t小宝    时间: 2010-9-20 15:49
我发现一个简单的办法了...
给大家提示一下:不需要去研究纸张设置!
作者: todaynew    时间: 2010-9-20 15:54
我发现一个简单的办法了...
给大家提示一下:不需要去研究纸张设置!
t小宝 发表于 2010-9-20 15:49

我觉得最简单的办法就是当Page=Pages时,从1到100循环补空行,当page>P(原来的Pages)跳出循环即可。


作者: t小宝    时间: 2010-9-20 21:29
回复 todaynew 的帖子

有点似懂非懂,要不老汉再做个小品...
   
作者: ycxchen    时间: 2010-9-21 09:55
同意15楼的
作者: sgrshh29    时间: 2010-9-21 18:05
这个问题关键就是如何动态取得纸张的高度,有了这个尺寸。代码就比较简单。如果是固定的纸张,比如A4、A3等等,可以用一个表把纸张尺寸罗列出来。
作者: sgrshh29    时间: 2010-9-21 18:10
[quote]我不太明白,用Printer的一组属性难道不能返回纸的高度吗?

请问用printer的哪个属性可以动态返回纸张的高度?
作者: todaynew    时间: 2010-9-21 18:28
[quote]我不太明白,用Printer的一组属性难道不能返回纸的高度吗?

请问用printer的哪个属性可以动态返回 ...
sgrshh29 发表于 2010-9-21 18:10

放弃高度,用Page和Pages来控制应该可以吧?



作者: sgrshh29    时间: 2010-9-21 18:44
本帖最后由 sgrshh29 于 2010-9-21 18:46 编辑
放弃高度,用Page和Pages来控制应该可以吧?
todaynew 发表于 2010-9-21 18:28



难以达到楼主的要求,即动态设置纸张/边距/纵向横向.但是如果能动态取得纸张高度,代码就很简单了.而且最后一页添满空行(包含不满一页的情况)

作者: t小宝    时间: 2010-9-27 12:55
顶一下
sgrshh29作的示例非常接近了
http://www.office-cn.net/thread-93273-1-2.html

看看谁还有更好的...
作者: t小宝    时间: 2010-9-27 12:58
...好像还有一个方法可以解决问题。因为报表的Pages属性可以得到不加空白行的总页数。这样可以固定补空行数总是很大的数,比如固定补100行。当补行超过Pages则立刻中断补行的循环。
todaynew 发表于 2010-9-19 16:42

这个方法会使报表最后多出一张空白页.


作者: ycxchen    时间: 2010-9-27 14:37
期待高手出好例子!
作者: purplerose    时间: 2015-8-29 10:37
等您的作品呢
作者: purplerose    时间: 2016-3-18 16:52
红尘如烟 发表于 2010-9-19 14:06
我试过用读取报表的PrtDevMode属性代表的DEVMODE结构中的intPaperLength属性,不成功,这个看样子好像只有 ...

可不可以把预定义纸张的大小 建成一个表,从表里读取纸张的大小值呢?
作者: 飘摇王    时间: 2017-7-23 16:30
坐等高手 感谢分享




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3