標籤:children 臨時檔案 ted cmd ros button 插入 情況 資料庫
http://apps.hi.baidu.com/share/detail/24298108
水晶報表是一個功能強大的報表工具,現在已經被Microsoft Visual Studio 2005(下文以VS2005簡稱)整合在一起。喜歡水晶報表的朋友可以方便使用了。我把水晶報表在vs2005的使用方法總結一下,供大家參考。
首先介紹一下我用的軟體環境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005
【資料用例】
伺服器:SQLEXPRESS
資料庫名:Test
資料庫表:T
【說明】
水晶報表在應用時分兩種方法,分別是拉模式(PULL)、推模式(PUSH)。拉模式:在水晶報表產生時的 資料來源是從水晶報表檔案中的SQL語句從資料庫中提取的,在編程時不用重寫SQL語句,但要加上登入資訊(具體方法,後面介紹)。推模式:在水晶報表產生 時的資料來源,是用編程時重寫水晶報表中SQL語句而產生的dataset對像。也就是說,推模式是用dataset組裝水晶報表。
水晶報表元件介紹。水晶報表在VS2005中有兩種組件,在WEB項目是分別是CrystalReportSource,CrystalReportViewer。在FORM項目裡是分別是crystalReport,CrystalReportViewer。
CrystalReportSource,crystalReport是水晶報表的資料提供者;CrystalReportViewer是水晶報表的瀏覽器。另外還要介紹一下水的報表的檔案是以rpt為副檔名的檔案,該檔案可以用VS2005產生。
下面分別介紹具體操作方法:
拉模式(PULL):
在拉模式中如要在水晶報表中的SQL語句加上條件參數時要用{?參數名}方式給出。例:“Select T1, T2, T3 FROM T Where T1=‘‘{?parm}‘‘” parm就是參數名
以下例子中所用到的水晶報表檔案中使用的SQL語句是“Select T1, T2, T3 FROM T Where T1=‘‘{?parm}‘‘” parm就是參數名。
【WEB方式下】
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
///<summary>
///功能:拉模式提取水晶報表
///個人首頁:http://www.dzend.com/
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void Button_pull_Click(object sender, EventArgs e)
{
// CrystalReport.rpt是水晶報表檔案的名稱;CrystalReportSource1是從工具箱加到頁面上的水晶報表資料來源對像。
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
// SetDatabaseLogon 拉模式中必須用這個方法來設定登入資訊,參數一:使用者名稱;參數二:密碼;參數三:伺服器;參數四:資料庫名
CrystalReportSource1.ReportDocument.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");
//給水晶報表傳參數,參數一:是參數名,參數二:參數值;
CrystalReportSource1.ReportDocument.SetParameterValue("Title", "這是一個測試報表");
CrystalReportSource1.ReportDocument.SetParameterValue("Parm", "1");
//綁定水晶報表資料來源。
CrystalReportSource1.DataBind();
// CrystalReportViewer1是水晶報表瀏覽器,下面是給該瀏覽器賦上對像
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();
} 【FORM方式下】
//在 FORM方式下代碼同WEB方式,用crystalReport控制項換掉了CrystalReportSource;用 crystalReportViewer換掉了CrystalReportViewer;這兩個控制項都可以在工具箱裡找到。同時在編程時去掉 DataBind()方法。
private void Form1_Load(object sender, EventArgs e)
{
crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");
crystalReport1.SetDatabaseLogon("sa", "123456", @"SYWZSWL\SQLEXPRESS", "Test");
crystalReport1.SetParameterValue("Title", "這是一個測試報表");
crystalReport1.SetParameterValue("Parm", "1");
crystalReportViewer1.ReportSource = crystalReport1;
}
推模式(PUSH):
在推模式中編程組裝的Dataset裡的SQL語句中的欄位要與水晶報表裡的SQL語句欄位一致。簡單的說,推模式中的水晶報表是個模板,把在設計器裡報表的格式設好後,再組裝DataSet就可以產生報表了。
【WEB方式下】
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using System.Data.SqlClient;
protected void Button_push_Click(object sender, EventArgs e)
{
string sql = "Select T1, T2, T3 FROM T where T1=‘‘a‘‘";
string DBConfig_sql [email protected]"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
DataSet ds = new DataSet();
SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
SqlDataAdapter sqlAd = new SqlDataAdapter();
sqlAd.SelectCommand = sqlCmd;
sqlAd.Fill(ds, "sql");
CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalReport.rpt"));
//注意此處必需指明Dataset中的表的名稱,否則會提示“您請求的報表需要更多資訊.”
CrystalReportSource1.ReportDocument.SetDataSource(ds.Tables["sql"]);
//{?}中的參數可以不用賦值,即使賦了值也不起作用。
// CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
CrystalReportSource1.ReportDocument.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表範例!");
CrystalReportSource1.DataBind();
CrystalReportViewer1.ReportSource = CrystalReportSource1;
CrystalReportViewer1.DataBind();
}
【FORM方式下】
private void Form1_Load(object sender, EventArgs e)
{
//推模式
string sql = "Select T1, T2, T3 FROM T where T1=‘‘a‘‘";
string DBConfig_sql = @"Data Source=SYWZSWL\SQLEXPRESS;Initial Catalog=Test;User ID=sa;Password=123456";
DataSet ds = new DataSet();
SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
SqlDataAdapter sqlAd = new SqlDataAdapter();
sqlAd.SelectCommand = sqlCmd;
sqlAd.Fill(ds, "sql");
crystalReport1.Load(Application.StartupPath + "CrystalReport.rpt");
crystalReport1.SetDataSource(ds.Tables["sql"]);
//{?}中的參數可以不用賦值,即使賦了值也不起作用。
// CrystalReportSource1.ReportDocument.ParameterFields["Parm"].CurrentValues.AddValue("1234567");
crystalReport1.ParameterFields["Title"].CurrentValues.AddValue("這時推模式的報表範例!");
crystalReportViewer1.ReportSource = crystalReport1;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
水晶報表編程使用方法
1.怎麼讓組頁首,在同一組中每一頁都顯示
插入組的時候,在公用選項頁面選中“在每個頁面上重複的群組頁首”
2.如何向 CrystalReportViewer 和 ReportDocument 傳遞參數……
一、CrystalReportViewer
通過 CrystalReportViewer.ParameterFieldInfo 屬性……
1、crystalreportviewer 成員
公用執行個體屬性
ParameterFieldInfo(從 CrystalReportViewerbase 繼承) ParameterFields。擷取或設定參數欄位集合。
二、reportdocument
通過 ReportDocument.DataDefinition.ParameterFields 屬性……
1、reportdocument 成員
公用執行個體屬性
DataDefinition DataDefinition。擷取 DataDefinition 對象。
2、datadefinition 成員
公用執行個體屬性
ParameterFields ParameterFieldDefinitions。擷取 ParameterFieldDefinitions 集合。
三、參數欄位運行時自訂(crystalreportviewer)
參考:
設定參數 | Windows 表單查看器的綁定選項 | Web Form查看器的綁定選項
可支援使用者在 Crystal 報表中通過參數進行輸入。這種參數有多種用途。例如:
使參數基於資料庫欄位並允許使用者指定該欄位的值,以便對報表中的資料進行篩選。
使用參數欄位將條件式格式設定應用於報表。
使用參數欄位來定義排序次序。
下列樣本說明如何在運行時通過代碼設定參數欄位值。此例解釋了如何設定兩個不同的參數:第一個是多值離散參數,第二個是地區值參數。
在運行時修改參數欄位
[c#]
// 聲明將參數傳遞給
//查看器控制項所需的變數。
ParameterFields paramFields = new ParameterFields ();
ParameterField paramField = new ParameterField ();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue rangeVal = new ParameterRangeValue ();
// 第一個參數是具有多個值的離散參數。
// 設定參數欄位的名稱,它必須
//和報表中的參數相符。
paramField.ParameterFieldName = "客戶姓名";
// 設定第一個離散值並將其傳遞給該參數。
discreteVal.Value = "AIC Childrens";
paramField.CurrentValues.Add (discreteVal);
// 設定第二個離散值並將其傳遞給該參數。
// discreteVal 變數被設定為新值,這樣,以前的設定
//就不會被覆蓋。
discreteVal = new ParameterDiscreteValue ();
discreteVal.Value = "Aruba Sport";
paramField.CurrentValues.Add (discreteVal);
// 將該參數添加到參數欄位集合。
paramFields.Add (paramField);
// 第二個參數為地區值。paramField 變數
//被設定為新值,這樣,以前的設定就不會被覆蓋。
paramField = new ParameterField ();
// 設定參數欄位的名稱,它必須
//和報表中的參數相符。
paramField.ParameterFieldName = "客戶 ID";
// 設定範圍的開始值和結束值並將該範圍傳遞給
//該參數。
rangeVal.StartValue = 42;
rangeVal.EndValue = 72;
paramField.CurrentValues.Add (rangeVal);
// 將第二個參數添加到參數欄位集合。
paramFields.Add (paramField);
// 將參數欄位集合放入查看器控制項。
crystalReportViewer1.ParameterFieldInfo = paramFields;
更多資料請查看:http://www.devedu.com/develop/2005-4-8/12305/default.aspx
3.設定Crystal Report Viewer 的外觀
設定 Crystal Report Viewer 的屬性:
BestFitPage 布爾值。擷取或設定整頁模式是大小合適還是用捲軸進行裁剪。
這個地方設為false後,設定Crystal Report Viewer 的寬度就可以去除捲軸了。
說明 :目前有兩種情況,其中在從 Web Form查看器進行列印時會出現問題:
BestFitPage屬性為預設值“真”(即,沒有垂直或水平捲軸),但PageZoomFactor大於 100。
BestFitPage 設定為“假”,Web Form查看器的高度小於報表頁的高度(即,有垂直捲軸),而查看器的寬度大於或等於報表頁的寬度(即,沒有水平捲軸)。
配合設定 Width、Height 來實現無空白和無捲軸的顯示!
DisplayGroupTree 布爾值。擷取或設定樹視圖是可見還是隱藏。
DisplayPage 布爾值。擷取或設定工具列是可見還是隱藏。
DisplayToolbar 布爾值。擷取或設定工具列上的轉到頁按鈕是可見還是隱藏。
PageZoomFactor Int32。擷取或設定報表的縮放因數。
SeparatePages 布爾值。擷取或設定報表頁是分開還是串連。
PageToTreeRatio Float64。設定組樹與報表視圖之間的大小比例。
4.控制工具列的按鈕:
設定 Crystal Report Viewer 的屬性:
HasGotoPageButton 布爾值。擷取或設定轉到頁按鈕的可見度。
HasLevelUpButton 布爾值。擷取或設定工具列上的轉到上一頁按鈕是可見還是隱藏。
HasPageNavigationButtons 布爾值。擷取或設定工具列上的頁面導覽按鈕是可見還是隱藏。
HasRefreshButton 布爾值。擷取或設定工具列上的重新整理按鈕是可見還是隱藏。
HasSearchButton 布爾值。擷取或設定工具列上的搜尋按鈕是可見還是隱藏。
HasZoomFactorList 布爾值。擷取或設定工具列上的縮放因數列表是可見還是隱藏。
5.在 Web 頁面裡的布局:
在“設計檢視”,修改 CrystalReportViewer 的 Width、Height 屬性。
切換到表單的“HTML 視圖”,修改 style 屬性。
<CR:CrystalReportViewer id="CrystalReportViewer1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" Width="350px" Height="50px" EnableDrillDown="False" DisplayGroupTree="False"></CR:CrystalReportViewer>
6.除水晶報表的的公司LOGO
將 Crystal 公司的Logo 檔案替換或刪除……
(1)如果是用 VS.NET 裡內建的水晶報表
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers\images\ToolBar\logo.gif
(2)如果是用水晶報表 9.2
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers\images\toolbar\crlogo.gif
7.替換水晶報表裡的各種表徵圖和圖片
(1)如果是用 VS.NET 裡內建的水晶報表
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers\images
(2)如果是用水晶報表 9.2
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers\images
8.關於列印的時候安裝外掛程式:
在 Crystal Reports 的更新版本中,您可以使用新的 CrystalReportViewer.PrintMode 屬性來指定列印模式。其中包含兩個選擇項:ActiveX 和 PDF。
當屬性設定為PrintMode.PDF 時,報表會在WEB伺服器上匯出為PDF,然後以資料流傳送到瀏覽器,使用者可以利用選項,直接列印到印表機。這個選項是跨平台相容的。
當屬性設定為PrintMode.ActiveX時,ActiveX 列印控制項允許使用者將報表直接列印到本機印表機
先下載 http://support.businessobjects.com/CRforVS2005/PrintControl.cab,放到自已的伺服器上。
若要在 Crystal Reports for Visual Studio 2005 網站顯示 cab 包,需將下列 xml 語句加入網站的 web.config 檔案(必須加到<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">之後,也就是最前面):
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReports">
<section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
</sectionGroup>
</sectionGroup>
</configSections>
<businessObjects>
<crystalReports>
<printControl>
<add key="url" value="http://192.168.88.91/PrintControl.cab"/> --這裡改為.CAB包所在地址
</printControl>
</crystalReports>
</businessObjects>
注意:只有 Internet Explorer 才會支援 ActiveX 模式。若從非 Internet Explorer 的瀏覽器 (FireFox、Safari、Mozilla 等) 列印,將會恢複到 PDF 彈出對話方塊。
然後在列印的頁面或直接在主表單添加一個層,並在層中添加如下代碼(可以採用其他方式)
<object id="CrystalPrintControl" classid="CLSID:BAEE131D-290A-4541-A50A-8936F159563A"
codebase="http://192.168.88.91/printcontrol.cab" height="0px" version="10,2,0,1078"
viewastext="" width="0px">
</object>
version是版本號碼,如果你是其他的版本將版本號碼修改一下即可。
9.已達到系統管理員配置的最大報表處理作業數限制的處理
解決辦法:
具體為修改下面兩個鍵的值。
HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report Application
Server;InprocServer;PrintJobLimit 修改為1000
還有一個HKEY_LOCAL_MACHINE;SOFTWARE;Crystal Decisions;10.0;Report Application
Server;Server;PrintJobLimit 也修改為1000
我發現在C:\WINDOWS\Temp這個臨時檔案裡面有大量的水晶報表檔案,每使用一次就會產生幾個檔案,在電腦沒有重新啟動的情況下它不會被刪除,而出現大量的無用檔案,在google裡面搜了一圈發現也有人碰到這樣的情況但回答的很模糊只是說要將水晶報表裝載的文檔關閉掉,從這裡可以看出出現這樣的錯誤應該是程式員人為照成的.
具體解決如下:
1.ReportDocumen執行個體必須為類成員
private ReportDocument prtp = new ReportDocument();
2.使用完水晶報表必須關閉檔案,這樣子就不會在windows的臨時檔案裡面產生.
private void Page_Unload(object sender, EventArgs e)
{
prtp.Dispose();
}
Page_Unload 事件是在頁面完全顯示的時候運行,這樣子就解決了.
本文來自(http://hi.baidu.com/%D2%AA%C4%E3%C3%FC%C8%FD%C7%A7%D6%AE%D5%D4/blog/item/ba3eaecefd192c34f8dc6189.html)
來自: http://hi.baidu.com/xzyweb/blog/item/a70f9aa59f39e59ed1435827.html
C#水晶報表教程