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

时间:2013-11-11 18:01:29

标签: c# mysql visual-studio-2010 crystal-reports

我将在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个参数: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的{​​{1}},我有另一个字段用于相同目的。

我有两行数据测试:

sumTotalPrice

字段Size name Quantity sold Total Price ------------------------------------------------------------------------------ Big 2 $6.00 XBig 7 $28.00 显示sumTotalQty9显示sumTotalPrice,这是精确的结果。我必须确切地说,第一行的$34.00值为2013-10-29,第二行orders.date的值为2013-10-30

现在,我想选择一个我希望显示结果的日期范围。例如,我从2013-10-30选择到今天,我应该只显示sumTotalQty显示7sumTotalPrice显示$28.00的第二行。我正确显示了单行,但sumTotalQty显示9sumTotalPrice显示$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也是如此。

问题

  1. 即使我在提示我提供日期范围时输入日期范围,为什么{?StartDate}{?EndDate}都未设置?
  2. 使用原始查询(没有WHERE子句),如何在给定日期范围的摘要字段中获得正确的结果?它就像数据库中的总和,而不是报告字段的总和。
  3. 修改 经过多次搜索,我脑子里还有另外两个问题:

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

    2. 有没有办法创建或使用Crystal Reports事件(OnLoadAfterLoad,...)?

    3. 感谢您提供的所有帮助。

1 个答案:

答案 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