Crystal Reports (C#):信息显示不正确
Posted
技术标签:
【中文标题】Crystal Reports (C#):信息显示不正确【英文标题】:Crystal Reports (C#) : Informations not displaying correctly 【发布时间】:2013-11-23 15:17:41 【问题描述】:为了尽可能清晰,我将把这篇文章分成 3 个部分。第一个是您需要知道的信息。第二个将是我迄今为止尝试过的解决方案。第三部分将是问题。我还必须准确地说这是我第一次使用 CrystalReports。
信息
我目前正在使用带有 C# 的 Visual Studio 2010,并且正在使用 SAP Crystal 报表。我正在使用 mysql 数据库显示数据。
现在,这里是我用来显示报告的表格:
Table : orders
Fields : id(primaryKey), date(DATE), quantity(INT), fksizes(INT), fkclients(INT)
Table : sizes
Fields : id(primaryKey), name(VARCHAR(30)), price(FLOAT)
Relationship between these 2 tables : orders.fksizes with sizes.id
基本上,我将一系列日期作为参数传递给 Crystal Reports,以仅显示这些日期之间的信息。然后,我创建了 2 个参数:StartDate
和 EndDate
类型均为 Date
。
我尝试过的
这是我用来显示我想要的没有日期范围条件的原始查询:
SELECT sizes.name, SUM(orders.quantity) AS totalQty,
(SUM(sizes.price) * orders.quantity) AS totalPrice,
orders.date
FROM orders
INNER JOIN sizes ON orders.fksizes = sizes.id
GROUP BY sizes.name, orders.date
此查询正常运行,并显示每个尺寸名称的总销售数量和总价格。在报告的页脚,我使用了一个汇总字段,在该字段中我得到了名为 sumTotalQty
的所有 totalQty
的总和。对于totalPrice
,我有另一个用于相同目的的字段,名为sumTotalPrice
。
我有 2 行数据测试,分别是:
Size name Quantity sold Total Price
------------------------------------------------------------------------------
Big 2 $6.00
XBig 7 $28.00
字段sumTotalQty
显示9
,sumTotalPrice
显示$34.00
,这是精确的结果。我必须准确地说第一行有2013-10-29
作为orders.date
的值,第二行有2013-10-30
。
现在,我想选择要显示结果的日期范围。例如,我从2013-10-30
选择到今天,我应该只得到第二行sumTotalQty
显示7
和sumTotalPrice
显示$28.00
。我正确显示了单行,但 sumTotalQty
显示 9
和 sumTotalPrice
显示 $34.00
在日期范围之后不正确。
然后我尝试在我的 sql 查询中添加一个 WHERE 子句来指定这样的日期范围(在数据库 --> 数据库专家...):
SELECT sizes.name, SUM(orders.quantity) AS totalQty,
(SUM(sizes.price) * orders.quantity) AS totalPrice, orders.date
FROM orders
INNER JOIN sizes ON orders.fksizes = sizes.id
WHERE orders.date BETWEEN '?StartDate' AND '?EndDate'
GROUP BY sizes.name, orders.date
我没有显示任何结果。所以,我认为?StartDate
和?EndDate
只是没有设置,但我真的不确定。 WHERE orders.date BETWEEN @StartDate AND @EndDate
也是如此。
问题
-
为什么没有设置
?StartDate
和?EndDate
,即使我在提示我输入日期范围时输入它们?
使用原始查询(没有 WHERE 子句),如何在给定日期范围的汇总字段中获得正确的结果?这就像它来自数据库而不是来自报告字段的总和。
编辑 经过多次搜索,我脑海中出现了另外两个问题:
是否可以在报告中添加DateTimePicker
,以便用户可以轻松输入开始日期和结束日期?之后报告会自动刷新。
有没有办法创建或使用 Crystal Reports 事件(OnLoad
、AfterLoad
、...)?
感谢您为我提供的所有帮助。
【问题讨论】:
好的开始,但现在考虑提供一个相同的 sqlfiddle。另外,请注意,通常您必须对 SELECT 中引用的所有非聚合列进行 GROUP BY。 MySQL 可以原谅这个遗漏,但它可能会导致不需要或意外的结果。 非常好的问题。我希望每个人都这么彻底! @Strawberry I 按所有非聚合列分组,但没有任何改变。但我会记下这个提示,谢谢。 【参考方案1】:问题 1:您要么使用BETWEEN (? AND ?)
要么使用BETWEEN (@StartDate AND @EndDate)
问题 2:您必须对数据进行分组,然后在报告中使用总计。
编辑:发现问题出在参数声明后,我建议看看以下一些帖子:
http://www.dotnetperls.com/sqlparameter
Why do we always prefer using parameters in SQL statements?
做更多的研究,你会在网上找到很多信息。我的建议是将一些输入框(TextBox、DateTimePicker 等)添加到您的页面,用户可以在其中输入参数值,然后以编程方式将它们传递给报告。这样您就可以将参数传递给 SQL 语句,并为您的报告获取正确的数据。您也不需要报告中的参数。 就 CR 事件而言,有 Init 事件,它是公开的
http://msdn.microsoft.com/en-us/library/aa691447(v=vs.71).aspx
还有一些可能有用的查看器事件
http://msdn.microsoft.com/en-us/library/ms227097(v=vs.80).aspx
【讨论】:
1.我编辑了我的帖子:BETWEEN (? AND ?)
和 BETWEEN (@StartDate AND @EndDate)
都不工作。 2.报表的Details部分已经有分组(size_name、Quantity_sold和Total_Price)。
让我问你这个问题:SQl 查询在你的 VS 代码隐藏页面中,对吗?参数在您的水晶报表中,对吗?如果是这种情况,那么您的 SQL 不知道参数的值,因为报告尚未运行。因此,您必须在代码隐藏中声明您的参数值,以便 SQL 查询正常运行。
你对这两个问题都是正确的。我该怎么做?在什么情况下?你有例子吗?
查看我修改后的答案,希望对您有所帮助。
很高兴了解@field
反对 SQL 注入,谢谢。使用文本字段可能会导致用户输入错误和错误的日期格式。我真的很想避免这种情况。请参阅我编辑的问题帖子。再次感谢您的时间和耐心,我很感激。以上是关于Crystal Reports (C#):信息显示不正确的主要内容,如果未能解决你的问题,请参考以下文章
Crystal Reports - “您要求的报告需要更多信息”
如何在Visual Studio 2010中使用Crystal Reports创建报表