水晶报表 CrystalReport 使用 锦集


1、指定报表的相对路径
方法一: like this:use add ..\ before the path
Code

方法二:代码动态指定.
C#:
Code
前台:
Code

2、设置报表的字段自动换行

方法1:右击想操作的字段,选择设置对象格式,选择“可以增大”

3、设置日期格式
方法1:右击想操作的字段,选择设置对象格式--可以选择已经设置好的,或者自定义格式字符串

4、动态指定数据源。摘自:http://www.cnblogs.com/VS2008/archive/2006/05/21/405488.html
在以前 VS2003 中可以采用 PUSH 模式推报表,可以用如下的代码实现:        
   

         con = new SqlConnection(Session["SQLCONNECTION"].ToString());
         strSql 
= "SELECT * FROM htOrder";
         scm 
= new SqlCommand(strSql, con);
         sda 
= new SqlDataAdapter(scm);
         ds 
= new DataSet();
         sda.Fill(ds, 
" order ");
         rptOrder.SetDataSource(ds.Tables[
"order"]);
         crOrder.ReportSource 
= rptOrder;    

VS2005 中不再支持“ embedded report ”嵌入式报表, 只能采用非嵌入式报表的方法拉数据,下面是典型的代码:
        
     // 绑定报表数据
             private   void  BindCrystalReports()
        
{
                
string path1 = Server.MapPath("~\\Report\\");
                
string path2 = path1 + "repOrder.rpt";
                ReportDocument repDoc 
= new ReportDocument();
                repDoc.Load(path2);
                SetDBLogonForReport(repDoc);          
//设置数据登录信息
                crOrder.ReportSource = repDoc; 
                
string selectionFormula = "{htOrder.htID} =" + txtHtID.Text.Trim();//设置报表数据筛选公式
                repDoc.DataDefinition.RecordSelectionFormula = selectFormula;
                crOrder. DataBind ();     
        }

        
// 设置登录信息
         private   void  SetDBLogonForReport(ReportDocument reportDocument)
    
{
        
try
        
{
                ConnectionInfo connectionInfo 
= new ConnectionInfo();
                connectionInfo.ServerName 
= ConfigurationManager.AppSettings["ServerName"];
                connectionInfo.DatabaseName 
= ConfigurationManager.AppSettings["DatabaseName"];
                connectionInfo.UserID 
= ConfigurationManager.AppSettings["UserID"];
                connectionInfo.Password 
= ConfigurationManager.AppSettings["Password"];
                Tables tables 
= reportDocument.Database.Tables;
               
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
           
{
                    TableLogOnInfo tableLogonInfo 
= table.LogOnInfo;
                    tableLogonInfo.ConnectionInfo 
= connectionInfo;
                    table.ApplyLogOnInfo(tableLogonInfo);
                }

        }

           
catch
      
{
                lblNote.Text 
= "<script>alert('数据库登录信息不正确!');</script>";
           }

}


这种方式是不是太频繁琐了,在数据结构更改或者查询条件发生变化时必须要再次更改报表设置,那么在 VS2005 中水晶报表有没有更简洁的方法呢?最好不用写代码就能搞定呢?有,那就是新的数据绑定控件 CrystalReportSource ,这个控件与 SqlDataSource 数据源绑定控件一起连用就可以用 SQL 表达式作数据源推数据了。下面是实现的步骤:

        1. 建立水晶报表,注意报表要用OLE DB ADO方式连接数据源,这样可以省去报表登录窗口的弹出。
        2. 在设计视图中拖拉报表控件CrystalReportViewer,点击右上角智能标签设置报表数据源,选择报表文件,自动生成CrystalReportSource,这时在设计视图中将显示出报表界面,水晶报表将自动用初始数据填充报表字段。注意这里有个小Bug,如果报表在子目录中,选择报表文件将自动用相对路径表示,这时报表显示会出错,应改成绝对路径才可以。
            <Report FileName="report\rptOrder.rpt">这里应改成:<Report FileName="..\report\rptOrder.rpt">
        3.拖拉一个数据源控件SqlDataSource(也可以用ObjectDataSource),按向导生成数据源,这里可以筛选数据,根据情况选择各类数据源。            
        4.
如何将CrystalReportSourceSqlDataSource两个控件连接在一起呢?可以这样:选择CrystalReportSource控件点击右侧属性中数据栏,再点击Report选择DataSource,在这个数据源集合编辑器选择数据源指定报表名称即可。(下面的Parameters是用来选择报表参数用的)

        经过这几个步骤,就可以运行程序显示报表啦,怎么样不用写一句代码吧?

具体代码可参考如下:

< CR:CrystalReportViewer  ID ="crOrder"  runat ="server"  AutoDataBind ="True"   ReportSourceID ="ReportSourceOrder"   BestFitPage ="False"  DisplayToolbar ="False"  DisplayGroupTree ="False"  Height ="1042px"  Width ="775px"  EnableParameterPrompt ="False"   />         
        
< CR:CrystalReportSource  ID ="ReportSourceOrder"  runat ="server" >
            
< Report  FileName ="..\report\rptOrder.rpt" >                            
                    
< DataSources >
                            
< CR:DataSourceRef  DataSourceID ="SqlDataSourceOrder"  TableName ="htOrder"   />
                    
</ DataSources >
              
</ Report >
        
</ CR:CrystalReportSource >
        
< asp:SqlDataSource  ID ="SqlDataSourceOrder"  runat ="server"  ConnectionString ="<%$ ConnectionStrings:cc_2005 %>"
            SelectCommand
="SELECT * FROM [htOrder] " ></ asp:SqlDataSource >

 

5、自定义报表格式 摘自:http://www.cnblogs.com/zxsoft/archive/2007/11/28/974933.html

Code


6、设置报表系统自动登录 摘自:http://blog.csdn.net/swebin/archive/2007/09/28/1805255.aspx
首先,为了登录方便,将数据库的用户名和密码先写到Web.config中:

<appSettings>
    
<add key="DBServerName" value="你的数据库服务器" />
    
<add key="DBUserID" value="sa" />
    
<add key="DBPassWord" value="UU1Tc3lzdGVt" />
</appSettings>

然后写个类来统一验证登录

Code

现在准备工作已经做好了,下面开始制作水晶报表.对于如何设计水晶报表我在这里就不讲了.
报表做好后,新建一个WEB页,先拖一个水晶报表查看器,再拖一个水晶报表数据源,这些在VS2005的工具箱中都有,然后将查看器的数据源设置成刚才拖进来的水晶报表数据源,再将水晶报表数据源的数据源设置成刚才完成好的报表,这时候切换到代码,开始编写代码:

Code


好了,现在就可以不输入登录了。

7、水晶报表自动补空行及格线(无分组版)转自:http://www.cnblogs.com/babyt/archive/2009/02/15/1391145.html

问题的提出:

一个带格线的清单类报表,假设有6行,我们设定的页面纸型能容纳5行,那么数据会分成两页。
第1页显示5行,占满1页,而第2页则只显示1行,后面是一片空白区域。
怎么能根据数据的多少,自动填满后面的空白区域呢?

如下图(第2页):

水晶报表 CrystalReport 使用 锦集_第1张图片

解决方法:

清单类的报表,要填充的是最后一页的剩余区域。我们以每页显示5行数据为例。
那么对于最后一页只有五种情况。
1:最后一页刚好有5条数据,不需要填充。
2:最后一页有4条,需要填充1个空行;有3条,需要填充2个空行;有2条,需要填充3个空行;有1条,需要填充4个空行。

以有1条数据为例子,最大加4个空行。于是,加上原来的数据行,那么详细资料节上应该有5个小节。
设计出来的模板如下:

水晶报表 CrystalReport 使用 锦集_第2张图片

将详细资料节拆分成5个节,最上面的一个放数据,设置为显示,其余的4个节全部抑制显示,我们用公式来控制它的显示与否
水晶报表 CrystalReport 使用 锦集_第3张图片


画线方法:在页眉和页脚画个框,框的下边沿紧贴在页眉的上边沿。

然后在每个详细资料节的上边沿下面都画一条横线。

字段间画竖线,注意竖线的下边的这个顶点要顶在页脚这个节的线上。 

水晶报表 CrystalReport 使用 锦集_第4张图片

下面我们来控制显示,

以下公式使用Crystal语法

1:编辑“详细资料节b” (也就是第一个空白节,我在上面放了一个字段做标记,实际使用时不需要)抑制显示后面的公式 

count({雇员.出生日期}) mod 5 表示最后一页上剩余的数目。这个值是0、1、2、3、4

0表示已经塞满,大于0表示需要填充

 

 

 


// 注意这2个and条件
//
1:count({雇员.出生日期}) mod 5>0  说明记录数不是5的倍数,也就是说需要补空行
//
对于这个节来说,只要需要补,就显示
//
2:onlastrecord 这个条件是“是否是最后一条记录”,说明这个节只出现在最后一条记录之后
//也就是会出现在最后一页上

if count({雇员.出生日期}) mod 5>0   and onlastrecord then

 

    false //外面勾选了抑制显示,那么false的意思就是不抑制显示。也就是这个节在这个条件下会显示
else
    
true

 

 

那么好,只要count({雇员.出生日期}) mod 5 >0 ,那么这个空白节就显示了。


2:现在来设置“详细资料节c”,第2个空白节。因为第一个详细资料节b之前已经显示了。

那么这个节,将只出现在需要2个2个以上空白行的情况,也就是说,count({雇员.出生日期}) mod 5 的值需要是1、2、3
于是公式就变成了。

 

 

if count({雇员.出生日期}) mod 5>0 and count({雇员.出生日期}) mod 5 <=3  and onlastrecord then
  
false

else
  
true

 

 

继续,后面的“详细资料节d”,第3个空白节,将只出现在count({雇员.出生日期}) mod 5 的值需要是1、2的时候

于是,公式为

 


if
 count({雇员.出生日期}) mod  5 > 0  and count({雇员.出生日期}) mod  5   <= 2  and onlastrecord then
  
false
else
  
true

 


继续, 后面的“详细资料节e”,第4个空白节,将只出现在count({雇员.出生日期}) mod 5 的值是1的时候

于是,公式为

 


if
 count({雇员.出生日期}) mod  5=1  and onlastrecord then
  
false
else
  
true

 


好设置完毕。

如果是5以外但是数字,假设为N。

那么详细资料节就拆成N个,第一个放数据 ,后面的公式依次类推。
第1个空行条件为 :
if count({雇员.出生日期}) mod N >0  and onlastrecord then

第2个到倒数第2个空白节的公式为:
if count({雇员.出生日期}) mod N >0  and count({雇员.出生日期}) mod N <=(N-2)  onlastrecord then

if count({雇员.出生日期}) mod N >0  and count({雇员.出生日期}) mod N <=(N-3)  onlastrecord then
...
if count({雇员.出生日期}) mod N >0  and count({雇员.出生日期}) mod N <=2  onlastrecord then

最后一个空行公式为:
if count({雇员.出生日期}) mod 5=1 and onlastrecord then
...

这样设置好就可以了。


其他:

如何保证每行的行高是一样的?
首先做好第一行,然后在在节专家中拆出其余的行。新增的行比第一行都要矮。复制数据行上的一个字段。粘贴到下面的各行,此时行高会自动调整到这个字段的高度。

此处下载示例报表,带数据(CR XI R2独立版本)


 

你可能感兴趣的:(port)