999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于C#的動態水晶報表交叉表實現成績單

2007-12-31 00:00:00
考試周刊 2007年49期

摘 要:水晶報表是一個功能強大的報表工具,現在已經被Microsoft Visual Studio 2005集成在一起,如何能動態地將多表以交叉表的方式實現是一種相當關鍵的技術難點,本文從完成“陽易教學分析系統V1.0-成績交叉分析”模塊來向讀者做一個詳細的介紹。

關鍵詞:水晶報表 動態 交叉表

一、引言

幾乎在所有的應用程序中報表都是程序員頭疼的問題。在.Net環境下包含了功能強大的報表工具:水晶報表(Crystal Report)。

Crystal Reports通過數據庫驅動程序與數據庫連接。每個驅動程序都被編寫為可處理特定數據庫類型或數據庫訪問技術。為了向開發人員提供最靈活的數據訪問方法,Crystal Reports 數據庫驅動程序被設計為可同時提供數據訪問的拉模型和推模型。

●拉模型

在拉模型中,驅動程序將連接到數據庫并根據需要將數據“拉”進來(見圖1)。使用這種模型時,與數據庫的連接和為了獲取數據而執行的SQL命令都同時由Crystal Reports本身處理,不需要開發人員編寫代碼。如果在運行時無須編寫任何特殊代碼,則使用拉模型。

●推模型

相反,推模型需要開發人員編寫代碼以連接到數據庫,執行SQL命令以創建與報表中的字段匹配的記錄集或數據集,并且將該對象傳遞給報表(見圖2)。該方法使您可以將連接共享置入應用程序中,并在Crystal Reports收到數據之前先將數據篩選出來。

本文為了實現動態按條件生成報表的,因此主要采用推模型。

交叉表是一種非常常見的報表形式。一般的二維表只有列頭,行就是數據,而交叉表(Cross Table)是行和列都有相應的行頭和列頭,中間的格子是交叉匯總項。原來的數據標題(字段)在兩列上,但是現在想給其中一個列放到水平方向,形成行列交叉,交叉點求出統計結果,得出直接在表中不能看出的分析數據。交叉表查詢顯示來源于表中某個字段的總結值(合計、計算以及平均值等),并將它們分組放置在查詢表中,一組列在數據表的左側,一組列在數據表的上部。

本文將從完成“陽易教學分析系統V1.0-成績交叉分析”模塊來向讀者做一個詳細地介紹。

二、系統模塊的設計

1. 數據庫表的建立

系統已經有一個數據庫:YangYiDB,包括三張表:課程、成績、學生。各表之間的關系圖見圖3。

2.系統模塊的實現

第一步、啟動VS2005,新建一個架構文件。

a.在解決方案資源管理器中,右擊項目名,指向“添加”,然后單擊“添加新項”。

b.在“添加新項”對話框的“類別”區域,展開文件夾,然后選擇“數據”。

c.在“模板”區域選擇“數據集”。

d.修改默認名稱 DataSetCross.xsd。

這就創建了一個新的架構文件(DataSetCross.xsd),以后將用它來生成強類型數據集。該架構文件將顯示在ADO.NET數據集設計器中。

e.從“工具箱”中拖放一個DataTable,放入DataSetCross.xsd中,創建幾個字段:名字、課程名、成績(見圖4)。

第二步、新建一個創建新報表。

a.指向“添加”,單擊“添加新項”。

b.在“添加新項”對話框中,從“模板”區域選擇Crystal Report,將報表命名為CrystalReport006,同時根據前面的數據集DataSetCross.xsd設計交叉表(如圖5)。

第三步、新建窗體文件,命名為“Form012”。

a.拖放控件tableLayoutPanel1、groupBox2、checkBox3、checkBox2、checkBox1、button1、crystalReportViewer1、statusStrip1,布局和設置如圖6所示。

第四步、代碼實現。

a.在Form012類前面添加語句

using System.Data.OleDb;

using CrystalDecisions.CrystalReports.Engine;

using CrystalDecisions.Shared。

b.給Form012類添加類字段

tempDataView:

private DataView tempDataView; //

c.自定義私有方法myDataView(),實現連接數據庫,讀取前面所提的三張表的名字、課程名、成績字段,返回一個內存中的數據視圖,代碼如下:

private DataView myDataView( )

{

DataSet tempDataSet = new DataSet( );

string connString = ″Provider=SQLOLEDB;Data Source=.;User ID=sa;Initial Catalog=Test″;

OleDbConnection myOleDbConnection = new OleDbConnection(connString);

string sqlString = ″select 名字,課程名,成績 from 學生,課程,成績 where 學生.學號=成績.學號and課程.課程號=成績.課程號″;

OleDbDataAdapter myOleDbDataAdapter = new OleDbDataAdapter(sqlString, myOleDbConnection);

myOleDbDataAdapter.Fill(tempDataSet, ″學生課程成績″);

return tempDataSet.Tables[″學生課程成績″].DefaultView;

}

d.在Form012_Load事件中添加tempDataView=myDataView();來調用上述方法。

e.雙擊“輸出報表”按鈕,在button1_Click事件中加入如下代碼:

CrystalReport006 myCrystalReport006 = new CrystalReport006( );

DataSetCross myDataSetCross = new DataSetCross( );

//產生動態條件,存入字符ChooseStr中

string ChooseStr = ″″;

if (checkBox1.Checked) ChooseStr = ChooseStr + ″課程名=’″ + checkBox1.Text + ″’″;

if (checkBox2.Checked) ChooseStr = ChooseStr + ″ or ″ + ″課程名=’″ + checkBox2.Text + ″’″;

if (checkBox3.Checked) ChooseStr = ChooseStr + ″ or ″ + ″課程名=’″ + checkBox3.Text + ″’″;

if (ChooseStr == ″″)

{ MessageBox.Show(″請選擇要顯示的字段″); return; }

if (ChooseStr.Substring(0, 4) == ″ or ″)

ChooseStr = ChooseStr.Substring (4, ChooseStr.Length - 4);

//產生視圖tempDataView,對應存入架構文件myDataSetCross中

tempDataView.RowFilter = ChooseStr;

foreach (DataRowView drw in tempDataView)

{

DataRow dr = myDataSetCross.Tables[″DataTableCross″].NewRow();

dr = drw[″名字″]; dr = drw[″課程名″]; dr = drw[″成績″];

myDataSetCross.Tables[″DataTableCross″].Rows.Add(dr);

}

//刷新crystalReportViewer1,并將crystalReportViewer1顯示出新的數據集結果

crystalReportViewer1.Refresh();

myCrystalReport006.SetDataSource(myDataSetCross.Tables[″DataTableCross″]);

crystalReportViewer1.ReportSource = myCrystalReport006;

第五步、程序運行,查看結果。

a.任意選擇各種課程;

b.點擊“輸出報表”按鈕;

c.重復a和b,可以看到有不同的交叉表輸出。

結束語

用C#實現動態地水晶報表交叉表的實現方式,在許多項目中都將會用到,掌握其中的細節將會對軟件開發者帶來很大的幫助。

參考文獻:

[1].NET環境下水晶報表使用總結

http://blog.csdn.net/vwfkyy/archive/2007/08/30/1765960.aspx

[2]Microsoft Visual Studio 2005中使用水晶報表

http://blog.csdn.net/zhaobinheng/archive/2007/08/14/1742200.aspx

[3]VS2005下水晶報表如何實現動態數據源綁定

http://www.cnblogs.com/newwind521/archive/2007/08/31/876884.html

主站蜘蛛池模板: 国产乱人视频免费观看| 国产视频只有无码精品| 久久国语对白| 91精品久久久久久无码人妻| 久久精品嫩草研究院| 国产福利小视频在线播放观看| 亚洲中文在线看视频一区| 九九热精品免费视频| 精品无码国产自产野外拍在线| 白浆视频在线观看| 爱做久久久久久| 成人无码一区二区三区视频在线观看| 免费无遮挡AV| 无码AV日韩一二三区| 色噜噜狠狠狠综合曰曰曰| 一级香蕉视频在线观看| 国产男人天堂| 亚洲视频免| 中文字幕在线一区二区在线| 成人久久精品一区二区三区| 亚洲天堂网2014| 亚洲区第一页| 久久久久久尹人网香蕉 | 国产精品亚洲一区二区三区z| 国产精品对白刺激| 日韩色图在线观看| 日韩久草视频| 国产免费人成视频网| 亚洲天堂精品在线观看| 丰满人妻一区二区三区视频| 女人爽到高潮免费视频大全| 国产午夜一级淫片| 乱系列中文字幕在线视频| 97国产成人无码精品久久久| 国产一级特黄aa级特黄裸毛片| 欧洲精品视频在线观看| 性喷潮久久久久久久久| 国产精品嫩草影院av| 狠狠色综合网| 人人91人人澡人人妻人人爽 | 久久亚洲黄色视频| 精品無碼一區在線觀看 | 国产真实二区一区在线亚洲| 亚洲国产中文在线二区三区免| 国产91精品调教在线播放| 亚洲综合网在线观看| 日韩在线播放欧美字幕| 国产精品女熟高潮视频| 久久综合一个色综合网| 在线观看精品自拍视频| 国产黄网永久免费| 欧美日韩一区二区三区四区在线观看| 91精品国产综合久久不国产大片| 伊人久久精品亚洲午夜| 国产综合在线观看视频| 99青青青精品视频在线| 看你懂的巨臀中文字幕一区二区| 8090成人午夜精品| 国产区91| 国产高清在线精品一区二区三区| 国产精品理论片| 手机在线看片不卡中文字幕| 日韩黄色大片免费看| 在线观看的黄网| 一级毛片免费的| 久久 午夜福利 张柏芝| 青青久视频| аⅴ资源中文在线天堂| 国产一区二区三区夜色| 久久无码av三级| 国产精品亚洲天堂| 国产乱人伦偷精品视频AAA| 成人毛片在线播放| 97亚洲色综久久精品| 国产精品va免费视频| 激情午夜婷婷| a级毛片免费看| 亚洲天堂视频在线播放| av天堂最新版在线| 国产成人艳妇AA视频在线| 欧美成一级| 国产日韩欧美精品区性色|