[求教:水晶报表中插入多个子报表效率问题。]

雷肿么了 2010-11-22 03:10:51
问题描述:
水晶报表我直接连的数据库中的储存过程,把储存过程的字段拖到了报表中。
运行储存过程速度很快,因为查询的是张静态表,查询所有的数据都不要一秒钟,就几千条数据。

我在水晶报表中根据 Code 分组,然后分别在组页脚、报表页脚插入了子报表。
其中组页脚中的子报表根据 Code 关联,是每个Code不同币别汇总数据。
报表页脚中的子报表就是查询出来的所有数据的 不同币别的汇总

三份报表使用的都是同一个储存过程,执行储存过程不要一秒。
现在页面中要几分钟才能显示出来,有什么办法可以优化没?

页面后台数据绑定代码:

string rptpath = Server.MapPath("../rptsources/AP_Creditor_Aging_sumRe.rpt");
RptDoc.Load(rptpath);
Report report = new Report();
DataTable RptDataTable = report.Get_AP_Creditor_AgingRe(conn, supplier, documentno, curr, type, period, ispost);
RptDoc.SetDataSource(RptDataTable);


ReportDocument RptDocSub = RptDoc.Subreports["AP_Creditor_Aging_Sum_subRe.rpt"];
RptDoc.SetDataSource(RptDataTable);
ReportDocument RptDocTotal = RptDoc.Subreports["AP_Creditor_Aging_Sum_totalRe.rpt"];
RptDoc.SetDataSource(RptDataTable);

CrystalReportViewer1.ReportSource = RptDoc;
CrystalReportViewer1.EnableDrillDown = false;


水晶报表布局如下:




...全文
269 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
雷肿么了 2011-04-12
  • 打赏
  • 举报
回复
额,好久没上了,
最后总结下:
这个最后还是公式代替了之前子代表的写法。。
使用公式效率要高。。
阿泰 2010-11-26
  • 打赏
  • 举报
回复
节专家中,设置组页脚节2,勾选“延伸到后续节”试试
雷肿么了 2010-11-26
  • 打赏
  • 举报
回复
 根据阿泰的提示,我已经再加了个分组,效率比子报表高了N倍,可显示出来报表格式就不杂怎么好看了。
图1是分组之后,显示出来的效果。
图3是以前用子报表,显示出来的效果。
图2是设计模板。

现在就是想让报表显示出来跟图3一样的效果,有什么办法实现,
如果用公式的话,币别一共有5种类型,而对应供应商CODE的币别可能是其中几种,要怎么实现?


雷肿么了 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 babyt 的回复:]
节专家中,设置组页脚节2,勾选“延伸到后续节”试试
[/Quote]

刚试过了,没效。
雷肿么了 2010-11-24
  • 打赏
  • 举报
回复
PUSH 模式用多了,

查询按钮里都忘记 塞方法了。 :)
雷肿么了 2010-11-24
  • 打赏
  • 举报
回复
以前一直都是直接数据库(PULL),然后再取数据推给报表(PUSH)。
这个已被阿泰指出,再次谢谢。

以前没用过PULL 模式,昨天试了之后发现一问题。
第一次查询结果出来之后,输入其他查询条件返回都是跟第一次的结果一样, 不知代码哪里有不妥。


//后台代码。
private ReportDocument myReport = new ReportDocument();

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
ConfigureCrystalReports();
}
}

private void ConfigureCrystalReports()
{
string period = DateTime.Now.ToString("yyyy-MM");
string custcode = txt_custcode.Text.Trim();
int flag = ckb_show.Checked == true ? 0 : 1;

string reportPath = Server.MapPath("../rptsources/Customer_Financial_StatusNew.rpt");


myReport.Load(reportPath);

//定义水晶报表的数据库连接信息
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.DatabaseName = "***";
connectionInfo.UserID = "***";
connectionInfo.Password = "***";
connectionInfo.ServerName = "***";

//将数据库信息传递给报表
SetDBLogonForReport(connectionInfo, myReport);

//把模板对象赋给报表前端呈现控件CrystalReportViewer1
myReport.SetParameterValue("@PERIOD", period);
myReport.SetParameterValue("@CUST_CODE", custcode);
myReport.SetParameterValue("@TTYPE", flag);
CrystalReportViewer1.ReportSource = myReport;


}

private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument)
{
Tables tables = reportDocument.Database.Tables;

foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);

}
}

雷肿么了 2010-11-24
  • 打赏
  • 举报
回复
报表已经改成,PULL 模式。

问题就出在,组页脚处的子报表。 根据每个code去处理数据。导致显示很慢。
雷肿么了 2010-11-23
  • 打赏
  • 举报
回复

谢谢阿泰的指点。 回复晚了,抱歉。

另外,我想请问下,使用公式怎么实现子报表那个效果, 显示的相应的币别汇总信息,标记的是子报表显示数据:
阿双2009 2010-11-23
  • 打赏
  • 举报
回复
子报表参数赋值格式
myReport.SetParameterValue("参数名", "参数值", "子报表名");

myReport.SetParameterValue("aaa", "", "aaaaaa");
其中参数名前面不用@符;子报表名对应下图的“子报表名称”

雷肿么了 2010-11-23
  • 打赏
  • 举报
回复

myReport.Subreports["Subreport4"].SetParameterValue("@SUPPLIER_CODE", supplier);
myReport.Subreports["Subreport4"].SetParameterValue("@DOCU_NO", documentno);
myReport.Subreports["Subreport4"].SetParameterValue("@CURRENCY", curr);
myReport.Subreports["Subreport4"].SetParameterValue("@TTYPE", type);
myReport.Subreports["Subreport4"].SetParameterValue("@ISPOSTED", ispost);
myReport.Subreports["Subreport4"].SetParameterValue("@PERIOD", period);


我为子报表设置参数的时候,报 未将对象的引用,设置到对象的实例。。
为子报表设置参数,不是这样?
阿泰 2010-11-23
  • 打赏
  • 举报
回复
可以用公式
感觉这个也可以再嵌入一层分组
mac1106 2010-11-23
  • 打赏
  • 举报
回复
看看,学习!
东莞寻香苑 2010-11-23
  • 打赏
  • 举报
回复
如果只有几种,可以在报表头为每种币别给定义一个共享变量;
在详细资料 如果是相应币别,相应的变量变累加

最后显示前面的变量就可以了
阿泰 2010-11-22
  • 打赏
  • 举报
回复
子报表在每次分组时都会重新执行,数据越多,效率越低。
但是我觉得这个报表没必要用子报表,貌似子报表的位置直接用公式就可以实现的。

另外既然直接连数据库开发报表,为什么又用了数据集来填充数据呢?可能这才是主要的原因。

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧