我将在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
此查询可正常运行,并显示每个尺寸名称的总销售数量和总价格。在报告的页脚中,我使用的是摘要字段,其中我得到了所有totalQty
名为sumTotalQty
的总和。对于名为totalPrice
的{{1}},我有另一个字段用于相同目的。
我有两行数据测试:
sumTotalPrice
字段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子句来指定这样的日期范围(在Database - > Database expert ...中):
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}
都未设置?修改 经过多次搜索,我脑子里还有另外两个问题:
是否可以在报告中添加DateTimePicker
,以便用户可以轻松输入开始日期和结束日期?之后报告将自动刷新。
有没有办法创建或使用Crystal Reports事件(OnLoad
,AfterLoad
,...)?
感谢您提供的所有帮助。
答案 0 :(得分:0)
问题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
然后有一些可能有用的Viewer事件
http://msdn.microsoft.com/en-us/library/ms227097(v=vs.80).aspx