动态水晶报表扩展:任意无关联多表,任意列,任意数据源

【原创】水晶报表动态表扩展 之 任意无关联表,任意列,任意数据源

本文是在<动态水晶报表:任意表,任意列,以及动态格线>
http://www.cnblogs.com/babyt/archive/2009/04/08/1431328.html
原理基础上的一个扩展。
如果你之前没有看过此文,请务必仔细研读。否则本文你可能不能较快地理解。

本文适用场景:

出于显示效果或者打印节约纸张等的需要,将多个不同结构(设置来源于不同数据源)的表在同一个报表中展现。
一般我们可以通过子报表来实现这个效果。
不过一般一个子报表对应一个表,这样对于多个表操作起来就比较麻烦。
每个表都要做一个子报表,对于动态取表(表数目,表名称)的要求也满足不了。
虽然也可以借助SDK,对不同的表,动态增加一个子报表,但是代码量很大。

基本思路:
既然我们延续上文的原理,那么本方案的主要问题就是,如何把这任意多的表,塞到同一个datatable 里去

1:

我们同样要构造一个datatable来容纳我们的表数据。假设我们的表的最大列数是6,
那么我们需要创建一个7个列的datatable。
为什么上文是6个,这里要7个呢?
多出来的的这个字段f0,我们用来放表的名称。这样来区分数据是来源于哪个表的。
这样我们就创建了f0,f1~f6,共7个String行的datatable.

 
2:

好了,我们来改造上一个例子,模板基本上一样。只是多了个字段f0。但是界面上这个f0是不显示的,所以我们仍然用6个格子。
需要注意的是,有点不同:就是页眉上不再显示标头了,为什么这样做,下面会讲到。

 
3:

然后,来改造我们的核心方法

每个表的数据在写入前,先写一行列标题。这个标题,也替代了我们之前的页眉标题。
并且每一行数据的第一列,也就是f0,写入表名。

 


 1  class clsDyCrystalReportCore
 2     {
 3         /// <summary>
 4         /// 将传入的datatable转换成报表模板所需要的datatable
 5         /// 数据全部转换为string
 6         /// </summary>
 7         /// <param name="dt">来源表</param>
 8         /// <param name="tblName">各单表名称</param>
 9         /// <param name="fldsName">字段名称,以半角逗号分隔。</param>
10         /// <returns>报表模板所需要的datatable</returns>
11
12         public DataTable dtx(DataTable dt,String tblName,String fldsName)
13         {
14
15             String oneRow="";
16             DataSet1.BigTatableDataTable dtx1 = new DataSet1.BigTatableDataTable();
17            
18             object[] obj = new object[dt.Columns.Count];
19            //特别注意:所选择的表的列的数目需<=Bigtable的字段数目
20             //请自行填写保护代码
21
22             //先列名称写到每个表的第一行
23             dtx1.Rows.Add(dtx1.NewRow());
24             //第一行的第一列写表的名称
25             dtx1.Rows[0][0] = tblName;
26             //切割列名称字符串,写入第一行后面的位置
27             for (int i = 0; i < fldsName.Split(new char[] { ',' }).Length; i++)
28             {
29                
30                 dtx1.Rows[0][i+1] = fldsName.Split(new char[] {','})[i];
31             }
32
33             //写入数据
34             for (int i = 0; i <dt.Rows.Count ; i++)
35             {
36
37                 dtx1.Rows.Add(dtx1.NewRow());
38                 //每一行的第一列,也就是f0,写入表名称。
39                 dtx1.Rows[i+1][0] = tblName;
40                 //写数据
41                 for (int j = 0; j < dt.Columns.Count ; j++)
42                 {
43                     oneRow = oneRow + "," + dt.Rows[i][j].ToString();
44                     if (dt.Rows[i][j].ToString()=="" )
45                         dtx1.Rows[i+1][j+1] = " ";
46                     else
47                     dtx1.Rows[i+1][j+1] = dt.Rows[i][j].ToString();  
48                 }
49               
50             }
51             return dtx1;
52         }
53     }
4:

好了,来看我们的前端代码。

 


 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Text;
 6 using System.Windows.Forms;
 7 using CrystalDecisions.Shared;
 8 using CrystalDecisions.CrystalReports.Engine;
 9 using CrystalDecisions.Windows.Forms;
10 using System.Data.OleDb;
11 namespace DyCrystalReportDemo
12 {
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19
20         private void button1_Click(object sender, EventArgs e)
21         {
22              String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Threading.Thread.GetDomain().BaseDirectory+ "bbtcrall.mdb" + ";";
23            
24             //打开数据库连接
25              OleDbConnection cn = new OleDbConnection(connstr);
26            
27             DataTable dtxAll = new DataTable(); //容纳所有数据
28             OleDbDataAdapter da = new OleDbDataAdapter();
29             clsDyCrystalReportCore xCore = new clsDyCrystalReportCore();
30            
31             //注意各表的字段数目不能大于我们设定的最大数目!
32             //请自行添加错误保护和对象释放代码
33
34             //第1个表
35             DataTable dt1 = new DataTable();
36             DataTable dtx1 = new DataTable();  
37             da = new OleDbDataAdapter("SELECT * From Test1_1", cn);
38             da.Fill(dt1);
39             dtx1 = xCore.dtx(dt1,"表1","编号,姓名,发信日期,其他");
40             dtxAll.Merge(dtx1);
41
42
43             //第2个表,注意,这个表可以从不同的数据源获取!
44             //重新初始化
45             dt1 = new DataTable();
46             dtx1 = new DataTable();
47             da = new OleDbDataAdapter("SELECT * From Test1_2", cn);
48             da.Fill(dt1);
49             dtx1 = xCore.dtx(dt1, "表2", "编号,姓名,入职日期,日期1,日期2");
50             dtxAll.Merge(dtx1);
51
52           
53             //第3个表,注意,这个表可以从不同的数据源获取!
54             //重新初始化
55             dt1 = new DataTable();
56             dtx1 = new DataTable();
57             da = new OleDbDataAdapter("SELECT * From Test_4", cn);
58             da.Fill(dt1);
59             dtx1 = xCore.dtx(dt1, "表3", "年份,地区,指标,最大值,最小值");
60             dtxAll.Merge(dtx1);
61
62            
63             ReportDocument myReport = new ReportDocument();
64             string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "crystalreport1.rpt";
65             myReport.Load(reportPath);
66
67             //绑定数据集
68
69             myReport.SetDataSource(dtxAll);
70           
71             crystalReportViewer1.ReportSource = myReport;
72             crystalReportViewer1.RefreshReport();
73         }
74
75     }
76 }
77
注意,我们用了
dtxAll.Merge(dtx1);
将所有的数据合并在一个datatable里,从而达到我们开始设定的目标。

5:

执行一下,是如下效果,有点乱,是吧?

 

6:

这个时候f0就派上用场啦,在模板上增加一个f0的组,如下图所示。

 

 

7:

运行起来,帅多了吧?

 


格子有点难看,这个就不再本文中讨论了。以后专门讲讲这个画格子的问题。

   

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/babyt/archive/2009/04/23/4610075.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值