水晶报表里有一个push的模式,我想知道怎么回事,pull我知道怎么弄了,可是这个push是怎么弄,说是有一个dateset,我想知道建的过程,比如是先建dateset然后再建CrystalReport,还是怎么样,还有,是不是先让dateset连接数据库?然后在将dateset和CrystalReport绑定,具体流程希望大家帮我说一下,细节部分我自己再多研究研究...
解决方案 »
- showDialog问题。。
- 实体类实现接口,接口封装增删改查,如何处理?
- 如何使MessageBox强制在最前面不能切换?
- DataGridViewComboboxColumn 的 AutoComplete 问题
- vs2005如何打印datagridview里的内容
- 重新开贴!!!如何用DATASET来更新、添加、删除数据呢?放分!!!
- 在vs2005中添加COM组件“Shockware Flash Object”后,“工具箱”不显示怎么回事?
- 如何处理IndexOutOfRangeException?
- Newtonsoft.Json处理结果不正确,求解
- winForm的label控件怎样录入有上标或下标的文本,比如化学分子式或数字的平方,3²
- winfrom程序,datagridview新添加的记录如符合条件如何用红字表示
- GUI+重画
回头我把图片补上去。
但其实你看了视频,应该也会有感觉的,。
我在我的教程里说过
水晶报表是对个动手能力有要求的工具,没有一定的经验,光凭想是很难去理解的
所以我的主张就是不管你理解了没,照着我的视频去做一下,其实花不了多少时间。
做一下,就会有感觉。你把大量时间浪费在问问题和焦急地等待上了,
你先要解决的问题是怎么连上库,怎么显示出数据,然后再去做别的这个需求对我来说很简单,但是我做完了,你可能还是不会。
我的视频已经帮助了千余人学会了PUSH模式,希望你也很快成为他们中的一个。
http://topic.csdn.net/u/20090626/18/0e7d0af0-2555-479d-9cb5-84175787f2cd.html我在这里连了数据库
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
//
da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);我的数据库是Access,别的库也一样,只是连接串不同罢了。仔细看一下吧。当你能把你的数据显示在报表上的时候,再去考虑其他的需求。
一步一步来。
就水晶报表的代码段说,WinForm和WebForm基本没区别。请看我28楼,倒数第2行。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Web;
using System.Data.OleDb;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ConfigureCrystalReports(); } private void ConfigureCrystalReports() {
//连接字串
String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
//
da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
//创建我们的DataSet1实例
DataSet1 dt1 = new DataSet1();
//填充dt1
//注意:表名mytable必须与我们在xsd设计的表名称一致。
//本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的
//使用 PUSH模式的优点就在此,可以自由组合SQL
//前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致
da.Fill(dt1, "mytable");
ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath); //绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(dt1);
CrystalReportViewer1.ReportSource = myReport; }}
String connstr = "Data Source=wise;user=wise;password=wise";
这样没错吧,我连接的是oracle数据库,对了,那个为什么会提示我上下文不存在Server?这是一个什么?变量么?需要提前定义么?
using Oracle.DataAccess.Client;后面的那段替换成
String connstr = @"Data Source=wise;user=wise;password=wise;";
OracleDataAdapter da = new OracleDataAdapter();
OracleConnection cn = new OracleConnection(connstr);
da = new OracleDataAdapter("SELECT * From RPT_CR_TEST1", cn);
DataSet1 dt1 = new DataSet1();
da.Fill(dt1, "mytable");
//..前提是你本机是能连到oracle服务器上的
还有那个@是必写的么,对了,那代码下面的那个string reportPath = Server.MapPath("crystalreport1.rpt");这一句里的Server还是提示找不到是怎么回事?
String connstr = "Data Source=wise;user=wise;password=wise";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
//
da = new OleDbDataAdapter("SELECT ID,ALARM_TIEM From sms_alarm", cn);
2.再建一个dataset.xsd
3.在水晶报表中选择字段资源管理器,数据库字段
3.建一个form窗体,里面放入crystalReportViewer
4.接着绑定
如:
string sql ="select * from 表"
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
myDataSet myds = new myDataSet();
da.Fill(myds, "DataTable1");
CrystalReport1 cr1 = new CrystalReport1();
cr1.SetDataSource(myds);
crystalReportViewer1.ReportSource = cr1;
是web写法
你可以简单的写成
string reportPath = "c:\crystalreport1.rpt";这样的物理路径,前面的数据库地方你不用改就可以了,我看错了,呵呵
运行后出现这个问题是怎么回事,是在OleDbConnection cn = new OleDbConnection(connstr);这一句上
我的整个代码是 //连接字串
String connstr = "Data Source=wise;user=wise;password=wise";
OleDbDataAdapter da = new OleDbDataAdapter();
OleDbConnection cn = new OleDbConnection(connstr);
//
da = new OleDbDataAdapter("SELECT ID,ALARM_TIEM From sms_alarm", cn);
//创建我们的DataSet1实例
DataSet1 dt1 = new DataSet1();
//填充dt1
//注意:表名mytable必须与我们在xsd设计的表名称一致。
//本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的
//使用 PUSH模式的优点就在此,可以自由组合SQL
//前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致
da.Fill(dt1, "CrystalReport1"); ReportDocument CrystalReport1 = new ReportDocument();
string reportPath = @"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\pushing\pushing\Crystalreport1.rpt";
CrystalReport1.Load(reportPath); //绑定数据集,注意,一个报表用一个数据集。
CrystalReport1.SetDataSource(dt1);
crystalReportViewer1.ReportSource = CrystalReport1;
你还是换上我38楼的代码段吧
ORA-12154: TNS: 无法处理服务名
这是怎么回事,刚才去吃饭了,所以才回..
http://www.cnblogs.com/xh3/archive/2007/04/21/722217.html
如果你的机器已经能正确连上的话,你可以参考
http://www.connectionstrings.com/oracle
换几种链接串试试。这个地方跟水晶报表本身没有任何关系,你可以参考你的项目里的其他代码是怎么连的库。
因为你这个项目就是用oracle的
基本代码是什么,随便贴段出来看看
string ConnectionString = "Data Source=wise;user=wise;password=wise";//写连接串
OracleConnection conn = new OracleConnection(ConnectionString);//创建一个新连接
conn.Open();
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from(select * from sms_alarm where is_deal=0 and id<" + a + " order by alarm_time desc) where rownum<=1";//在这儿写sql语句
OracleDataReader odr = cmd.ExecuteReader();//创建一个OracleDateReader对象 while (odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了
{
count++;
textBox4.Text = odr.GetOracleString(1).ToString();
textBox5.Text = odr.GetOracleString(2).ToString();
textBox6.Text = odr.GetInt32(3).ToString();
textBox1.Text = odr.GetOracleString(7).ToString();
} odr.Close();
cmd.Clone();
conn.Close();
这是比如我的一段代码,就是连接数据库,然后读到一些信息然后显示在窗体的textbox上
改下sql语句,检索出数据先然后在处理报表的事。
你需要新建一个强类型的DATASET数据集,这个数据集里装的是你要显示的数据表
在水晶报表那边画好格式后
有一个字段资源管理器
那里有一个项目数据库下的ADO.NET对像,这个里面应该能刷出来那个声明的DATASET
设置好后你就能看到数据表里的字段
把要显示的托到要显示的地方(报表详细是数据显示,报表页眉是报表头)
这样就可以进行显示了
你可以试一下
我的是网页版的,楼主作的是什么的
比如正常应该是
ID 字体
1 3
2 4
5 6
但是我运行之后就是
ID 字体
然后下面什么都没有,DATESET里和代码里的查询语句我也写了也是一至的,可就是显示不了信息..
private void Form1_Load(object sender, EventArgs e)
{
//连接字串
String connstr = "Data Source=wise;user=wise;password=wise;";
OracleDataAdapter da = new OracleDataAdapter();
OracleConnection cn = new OracleConnection(connstr);
da = new OracleDataAdapter("SELECT ALARM_TIME1,IS_DEAL FROM WISEFLY.SMS_ALARM", cn);
DataSet1 dt1 = new DataSet1();
da.Fill(dt1, "sms_alarm");
string vl = dt1.Tables["sms_alarm"].Rows[0][0].ToString(); // //创建我们的DataSet1实例 //填充dt1 ReportDocument CrystalReport1 = new ReportDocument();
string reportPath = @"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Crystalreport1.rpt";
CrystalReport1.Load(reportPath); //绑定数据集,注意,一个报表用一个数据集。
CrystalReport1.SetDataSource(dt1);
crystalReportViewer1.ReportSource = CrystalReport1; }
2:报表模板里的用到的表的名称,是叫sms_alarm吗?
这一句非常重要,mytable其实就是你自己建立的dataset,美女!
a1 1
a1 2
a1 3
a2 2
a2 3
----------
报表设计里
右键 insert -->chart...
选择一个type
data里面 on change of 里面添加字段A
show values 里面添加字段B-->统计个数就是公式count of B
-->求和就是 sum of B
---------------------------------------
最后就是这样
_________________________________________
| |
| |
| | count of B
| | |
| | | |
|________|_______________|_______________|
a1 a2
A是不是这么回事
说的那样,阿泰哥说的那个我是实现了,我现在想实现的就是90楼说的,唉呀,还没享受完假期就又要开始工作了..
是在CrystalReport1.rpt里点右键么,我出现的是中文的,是选插入吧,然后呢,选什么,交叉表么?我用的是2005
就是我想选取一段时间,然后让图表显示出在数据库里读出的我选取的这段时间内的内容,比如我选了2009-9-1到2009-9-5的,那图表就显示从数据库里提取的这段时间的东西,我选取的时间控件是dateTimePicker,一共有两个,分别为1和2,
有人说是"select * from 表名 where 数据库中时间字段名>='" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' and 数据库中时间字段名<='" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "'";
可是我把这个写在后台代码里实现不了啊,这是怎么回事?