找回密码
 立即注册

QQ登录

只需一步,快速开始

soulxj2009

注册会员

3

主题

21

帖子

92

积分

注册会员

积分
92

活字格认证

最新发帖
soulxj2009
注册会员   /  发表于:2016-9-2 10:38  /   查看:11446  /  回复:18
本帖最后由 Lenka.Guo 于 2016-9-2 14:07 编辑

环境:WIn7+VS2008+ActiveReport3
现状:
1,在基础的三个分组上,还自定义了有一个分组groupHeaderST,分组里包含了报表的标题等头部信息,它的DataField为st-id;
            this.Sections.Add(this.pageHeader);
            this.Sections.Add(this.groupHeaderST);
            this.Sections.Add(this.detail);
            this.Sections.Add(this.groupFooterQtyTotal);
            this.Sections.Add(this.pageFooter);
2(问题),双面打印时,前一个st-id的明细会和后一个st-id的明细印在一页的正反面。
需求:当一个新的st-id印刷在奇数页时,此页留白(什么都不打印),再换一页打印这个新的st-id及其明细。
**题主也对activereports也不是很专业,周围同事也差不多,两三天了也没有进展,比较着急,拜托了。

18 个回复

倒序浏览
soulxj2009
注册会员   /  发表于:2016-9-2 16:35:09
沙发
本帖最后由 soulxj2009 于 2016-9-2 16:55 编辑

通过报表合并,已经实现了一大步!

//rptStidList是原来每个分组单独打出的报表List
rptStidList[0].Run(false);

//现有页面数为奇数时,加入空白页
if (blankRpt.Document.Pages.Count > 0 &&
    rptStidList[0].Document.Pages.Count % 2 == 1)
{
    rptStidList[0].Document.Pages.Add((Page)blankRpt.Document.Pages[0].Clone());
}

for (int i = 1; i < rptStidList.Count; i ++)
{
    rptStidList.Run(false);


    //从第二个分组开始,把打印出的页面添加到第一个页面后面
    rptStidList[0].Document.Pages.AddRange(rptStidList.Document.Pages);


    //现有页面数为奇数时,加入空白页
    if (blankRpt.Document.Pages.Count > 0 &&
        rptStidList[0].Document.Pages.Count % 2 == 1)
    {
         rptStidList[0].Document.Pages.Add((Page)blankRpt.Document.Pages[0].Clone());
    }
}


回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-2 16:45:41
板凳
本帖最后由 soulxj2009 于 2016-9-5 08:58 编辑

现在的问题是,
为了合并页面,用Run()已经把每个分组的页面跑出来了,
在预览时,预览的控件又一次调用Run(),就出错了。
出错的原因是,在报表的_ReportStart事件里,
有给一个全局的table初始化,
    dtOutPut.Columns.Add("NO", typeof(string));
    dtOutPut.Columns.Add("image1", typeof(byte[]));
结果第一个分组的报表预览出来后,
第二个分组开始预览并初始化这个Table时,
就出现了[DataTable里已经有一个叫做“NO”的列了]异常。
所以预览报表时,一定得这种写法吗?
view.Document = RptObj.Document;
RptObj.Run(false);

回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2016-9-2 18:29:00
地板
问题已经收到了,下周给您答复~~~还有啊~为什么不升级AR10呢?
回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-3 08:43:03
5#
本帖最后由 soulxj2009 于 2016-9-5 08:59 编辑

额,可能公司舍不得。。哈哈

板凳楼的问题,一部分是我们自己业务系统的框架造成的。

一是,我们自己做了一个预览的画面,把报表传进去,
document赋值给viewer,然后再run一下,结果就重复run了。

二是,报表里那个出问题的datatable全局初始化了,
所以改成每次_ReportStart时再初始化,就没有问题了。
接着,又出了个问题:预览画面只打出了第一个分组的数据。

回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-3 08:43:09
6#
本帖最后由 soulxj2009 于 2016-9-6 09:00 编辑

预览画面只打出了第一个分组的数据的问题,经过调查是沙发楼的写法的问题。

在沙发楼,报表合并时,把所有的分组单独打印出来的报表合并到第一个分组了,
也就是rptStidList[0],所以传给预览画面时,
过去的报表对象是rptStidList[0],但是报表document是所有分组run出来的pages。
所以在预览画面只打印出了rptStidList[0]的数据。

调查的时候,在报表打印的画面放了一个Viewer控件,
直接设置Document 就能全部预览出来了。
vwrMain.Document = rptStidList[0].Document;

所以预览报表时,一定得这种写法吗?
view.Document = RptObj.Document;
RptObj.Run(false);


回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2016-9-5 10:52:41
7#
您能上传下您的示例吗?我在这边验证下~
回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-5 15:05:37
8#
例子已贴,请参考。
现在为止的修改,都在里面了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-5 15:55:30
9#
系统框架里的共通预览画面

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
soulxj2009
注册会员   /  发表于:2016-9-6 09:05:46
10#
现在自己把那个预览画面重写了,其示也就是改了load方法。
//this.vwrMain.Document = mRptObj.Document;
//mRptObj.Run(false);
vwrMain.Document = mRptDoc;
出来的预览画面里什么都没有。

所以现在的终极问题是,如何在一个新的预览画面里,打出经过合并的报表?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部