Crystal Reports (C#): 信息未正确显示

4
我将分为三个部分来阐述本文。第一部分会提供必要的信息,第二部分会分享我尝试过的解决方案,第三部分则是问题。需要明确的是,这是我第一次使用CrystalReports。

信息

我目前使用C#语言和SAP Crystal reports工具,结合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

基本上,我将一系列日期作为参数传递给水晶报表,以仅在这些日期之间显示信息。然后,我创建了2个参数:StartDateEndDate,两者都是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

这个查询正确地显示出每个尺码名称的销售总量和总价格。在报告底部,我使用了一个汇总字段,其中我得到所有名为totalQty的总和,命名为sumTotalQty。我还有另一个字段,用于同样的目的,针对totalPrice命名为sumTotalPrice
我有两行测试数据, 分别是:
Size name                     Quantity sold                      Total Price
------------------------------------------------------------------------------
Big                           2                                  $6.00
XBig                          7                                  $28.00  

字段sumTotalQty显示9,字段sumTotalPrice显示$34.00,这是准确的结果。需要特别指出的是,第一行orders.date的值为2013-10-29,而第二行则为2013-10-30

现在,我想选择一段日期范围,以便显示结果。例如,我选择从2013-10-30到今天,那么我应该只得到第二行数据,sumTotalQty显示7sumTotalPrice显示$28.00。我成功地显示了单行数据,但是sumTotalQty显示9sumTotalPrice显示$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

问题

  1. 即使我输入了一个日期范围并提示设置它们,为什么{?StartDate}{?EndDate}没有设置?
  2. 在原始查询中(不带WHERE子句),如何使用给定的日期范围正确地得到我的汇总字段结果?就像它从数据库中汇总而非报告字段。

编辑 经过多次搜索,我想到了另外两个问题:

  1. 是否可以在报表中添加DateTimePicker以便用户能够轻松输入起始日期和结束日期?之后报表将自动刷新。

  2. 是否有一种方法来创建或使用Crystal Reports事件(OnLoadAfterLoad等)?

感谢您提供的所有帮助。


1
不错的开始,但现在考虑提供一个相同的sqlfiddle。另外,请注意,在一般情况下,您必须按照所有在SELECT中引用的非聚合列进行分组。MySQL会原谅这种省略,但它可能会导致不需要或意外的结果。 - Strawberry
1
非常好的问题,我希望每个人都能这么详细! - campagnolo_1
@Strawberry,我按照所有未聚合的列分组,但是没有任何改变。但是我会注意这个提示的,谢谢。 - Gabriel L.
1个回答

0
问题1:您可以使用BETWEEN(?和?)BETWEEN(@StartDate和@EndDate) 问题2:您需要对数据进行分组,然后在报告中使用总计。
编辑:发现问题出在参数声明上之后,建议查看以下一些帖子:

http://www.dotnetperls.com/sqlparameter

为什么我们总是喜欢在SQL语句中使用参数?

多做些研究,你会在网络上找到很多信息。我的建议是在你的页面上添加一些输入框(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. 报告的详细信息部分已经分组(尺寸名称,销售数量和总价)。
- Gabriel L.
你对两个问题的回答都是正确的。我该怎么做?在哪个事件中?你有例子吗? - Gabriel L.
请查看我的修订答案,希望这能对你有所帮助。 - campagnolo_1
了解@field对于SQL注入很有帮助,谢谢。使用文本字段可能会导致用户输入错误的类型和日期格式。我真的想避免这种情况。请查看我编辑过的问题帖子。再次感谢您的时间和耐心,我非常感激。 - Gabriel L.
正如我在答案中所说的,您可以在页面上使用任何控件(TextBox、DateTimePicker等)供用户输入参数,然后以编程方式将这些参数传递给报表。关于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)。 - campagnolo_1
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接