急急急-创建动态水晶报表成功,但显示的记录重复 如何解决?什么回事?
一, 我建一个RPT 水晶报表, 里边就连了要连的数据库表,及字段都放到了水晶报表中,也打好了表格 排好了板。
二, 我建了一个ASPX 里边建了一个动态的数据库联接(数据库与RPT一样的表)
我就想通过ASPX调用该RPT水晶报表,这样一来我可以输入些条件 动态显示数据信息。 但是运行的结果是出现记录重复,如得到的结果应该是5条记录,水晶报表会显示 5X5=25条记录 (显示的记录是对的) 请问是什么一回事?
同时建了一个 GridView1 一起帮定数据库显示, 它的显示结果是正确的(记录条数)。
代码如下
--------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
title = myclass.setwebtitle();
Conn1 = new SqlConnection(myclass.setconn());
if (!IsPostBack)
{
bind();
}
}
protected void bind()
{
string where = " ",path_rpt=myclass.rpt_file()+ "JH_SPQKB.RPT ";
if (TextBox1.Text != " ")
{
string y1, m1;
y1 = TextBox1.Text.Substring(0, 4);
m1 = TextBox1.Text.Substring(5, 2);
where = "WHERE (YEAR(B.SPSJ)={0})AND(MONTH(B.SPSJ)={1})AND(A.XMBH_1=B.XMBH_1)AND(B.SPR=C.YHM)AND(C.JS= '计划项目负责人 ') ";
where = string.Format(where, y1, m1);
string sqlstr = " SELECT A.XMBH,A.XMMC,A.JSGM,A.PZTZGSR,A.SBSJ,B.SPSJ,B.SPJG,B.SPR FROM LXSBB A , LXSPB B ,YHGLB C ";
if (where != " ")
sqlstr += where;
CrystalDecisions.CrystalReports.Engine.ReportDocument cr = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
if (!cr.IsLoaded)
cr.Load(path_rpt);
cr.SetDatabaseLogon( "sa ", "12345678 ", "yy-program ", "tt_jhxmgl ",true );
DataSet dwcustDs = new DataSet();
dwDap = new SqlDataAdapter(sqlstr, Conn1);
dwDap.Fill(dwcustDs, "LXSBB ");
dwDap.Fill(dwcustDs, "LXSPB ");
dwDap.Fill(dwcustDs, "YHGLB ");
cr.SetDataSource(dwcustDs);
GridView1.DataSource = dwcustDs;
GridView1.DataBind();
CrystalDecisions.CrystalReports.Engine.TextObject objTitle = cr.ReportDefinition.ReportObjects[ "Title "] as CrystalDecisions.CrystalReports.Engine.TextObject;
objTitle.Text = "项目审批情况表 ( " + TextBox1.Text + ") ";
Label1.Text = objTitle.Text;
CrystalReportViewer1.ReportSource = cr;
CrystalReportViewer1.RefreshReport();
}
protected void Button1_Click(object sender, EventArgs e)
{
bind();
}
大家帮看一下呀。
[解决办法]
一个表肯定是没有重复了
重复出现是因为有交叉数据的出现
A表*B表*C表
数据会成倍的出现
[解决办法]
"WHERE (YEAR(B.SPSJ)={0})AND(MONTH(B.SPSJ)={1})AND(A.XMBH_1=B.XMBH_1)AND(B.SPR=C.YHM)AND(C.JS= '计划项目负责人 ') ";
[解决办法]
关联有问题吧,好好看一下表结构和SQL语句,问题应该就在这里。
[解决办法]
只要你报表要显示的字段与数据库字段有对应关系,你要填充的DATASET中的表的字段可以和报表显示字段不匹配;
你可以这样试试“
string mysql = "你要查询的SQL ";
SqlDataAdapter myDapter=new SqlDataAdapter(mysql,conn);
DataSet ds=new DataSet();
myDapter.Fill(ds);
cr.SetDataSource(ds.Tables[0]);
[解决办法]
1、把构造好的SQL语句在查询分析器里验证一下;
2、不设参数字段,直接把SQL语句生成的表作为报表的数据源试试;
[解决办法]
protected void Page_Load(object sender, EventArgs e)
{
title = myclass.setwebtitle();
Conn1 = new SqlConnection(myclass.setconn());
if (!IsPostBack)
{
bind();
}
}
改成
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
title = myclass.setwebtitle();
Conn1 = new SqlConnection(myclass.setconn());
bind();
}
}
试一下
[解决办法]
把三个DataSet 合并成一个dataset 就可以解决了。但要注意的是在新dataset 中的表名(nTable)一定要跟
dwDap.Fill(dataset , "nTable") 的一致.