您的位置:首页 > 其它

水晶报表的推拉模式的具体实现

2014-10-06 09:38 218 查看
水晶报表在应用时分两种方法,分别是拉模式(PULL)、推模式(PUSH)。

拉模式:在水晶报表生成时的数据源是从水晶报表文件中的SQL语句从数据库中提取的,在编程时不用重写SQL语句,但要加上登录信息.

推模式:在水晶报表生成时的数据源,是用编程时重写水晶报表中SQL语句而生成的dataset对像。也就是说,推模式是用dataset组装水晶报表。

1. 拉模式实现: DATATABLE不用在代码中实现,直接把参数和登陆信息传递给报表即可.

public ReportDocument CrystalReports(string strReportFileName, string spName, SqlParameter[] inputParameters)
{
//获取报表路径
// string strReportPath = Application.StartupPath.Substring(0, Application.StartupPath.Substring(0,Application.StartupPath.LastIndexOf("\\")).LastIndexOf("\\"));
string strReportPath = Application.StartupPath;
strReportPath += @"\RP\RPT\" + strReportFileName;
//得到dt数据源
// DataTable dt = db.GetDataTable(spName, inputParameters);
//ReportDocument对象加载rpt文件并绑定到数据源dt
ReportDocument reportDoc = new ReportDocument();
try
{
reportDoc.Load(strReportPath);
//  reportDoc.SetDataSource(dt); //DataView是接口IEnumerable的实现子类,此处使用了“接口”的多态特性
}
catch (Exception e)
{
MessageBox.Show(e.Message, "软件提示");
throw e;
}

//水晶报表动态链接数据库
TableLogOnInfo logOnInfo = new TableLogOnInfo();
logOnInfo.ConnectionInfo.ServerName = OperatorFile.GetIniFileString("DataBase", "Server", "",
Application.StartupPath +
"\\DBConfig.ini");
// logOnInfo.ConnectionInfo.DatabaseName = "RPTTOOL";
logOnInfo.ConnectionInfo.DatabaseName = OperatorFile.GetIniFileString("DataBase", "DB", "",
Application.StartupPath + "\\DBConfig.ini");
logOnInfo.ConnectionInfo.UserID = OperatorFile.GetIniFileString("DataBase", "User", "",
Application.StartupPath + "\\DBConfig.ini");
logOnInfo.ConnectionInfo.Password = OperatorFile.GetIniFileString("DataBase", "Password", "",
Application.StartupPath + "\\DBConfig.ini");

// 对报表中的每个表依次循环(把连接信息存入每一个Table中)
foreach (Table tb in reportDoc.Database.Tables)
{
tb.ApplyLogOnInfo(logOnInfo);
}

// reportDoc.Database.Tables[0].ApplyLogOnInfo(logOnInfo);

for (int i = 0; i < inputParameters.Length; i++)
{
// reportDoc.SetParameterValue(i, inputParameters[i].Value); inputParameters[i].ParameterName.ToString()
reportDoc.SetParameterValue(i, inputParameters[i].Value);

}
//返回ReportDocument对象
return reportDoc;

}


2. 推模式.

private void button1_Click(object sender, EventArgs e)
{
string spName = "P_Test ";

if (textBox1.Text != string.Empty)
{
para = textBox1.Text;
}
else
{
para = "admin";
}

SqlParameter[] param = new SqlParameter[]{ new SqlParameter("@OperatorCode",para)

};

string strReportPath = Application.StartupPath + "\\P_Test.rpt";
//得到dt数据源
this.DataBase();
DataTable dt = this.GetDataTable(spName, param);
//ReportDocument对象加载rpt文件并绑定到数据源dt
ReportDocument reportDoc = new ReportDocument();
try
{
reportDoc.Load(strReportPath);
//DataView是接口IEnumerable的实现子类,此处使用了“接口”的多态特性
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "软件提示");
}

ParameterFields paramFields = new ParameterFields();
ParameterField paramField = new ParameterField();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
// ParameterRangeValue rangeVal = new ParameterRangeValue();

paramField.Name = "kj";
discreteVal.Value = para;
paramField.CurrentValues.Add(discreteVal);
paramFields.Add(paramField);

reportDoc.SetDataSource(dt);
crystalReportViewer1.ParameterFieldInfo = paramFields; //this.GetParameterFields();
this.crystalReportViewer1.ReportSource =  reportDoc;

// ((TextObject)reportDoc.ReportDefinition.ReportObjects["txt_para"]).Text = para;

}


这里的KJ参数是自己在报表模板中手动添加的.而不是报表原来的带@的那种, 如果是带@的那种,则传递过去的报表在报表设计中始终显示空白,也就是不起作用.我不知道是何原因,网上也一直未找到原因, 如各位大侠知道,望不吝赐之.下图为设计画面.


文章中只是稍加描述,如大家有不清楚的,可以联系. 本人将尽最大努力帮助大家, 以期达到共同进步.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: