2010-01-28 163 views
0

我工作的公司使用MacolaES作为ERP系统。 SQL Server数据库的结构使得当事情不再被视为活动时,它们从一组“活动”表移动到一组“历史”表。这有助于将“活动”表保持得足够小,以便查询快速返回。另一方面,历史表是巨大的。适当的列在这些表中编入索引,如果您查询特定的内容,它会很快返回。Crystal Reports参数化查询

问题在于当您制作Crystal Report时,它会提示用户输入参数。由于我不知道的原因,Crystal参数没有被转换为SQL参数,所以最终会有查询选择订单标题历史记录表内部的所有内容连接到订单行历史记录表中的所有内容,这会导致超过800万行。

有没有办法让Crystal Reports使用SQL查询中的参数,而不是在事件之后加载所有记录和过滤?我读过一个存储过程应该工作的地方,但我很好奇,如果一个普通的参数化查询可以节省我的时间。

这里是选择公式:

(
    trim({Orderheader.ord_no}) = {?Order No} 
) 
and 
(
    {Orderheader.ord_type} = 'O' 
) 
and 
(
    {orderlines.ord_type} = 'O' 
)
+0

它取决于记录选择公式的类型以及它是否可以转换为sql where子句。你是否使用任何不会像'if'或任何水晶函数那样转换为sql的特殊运算符? – dotjoe 2010-01-29 15:49:20

+0

不,只是使用布尔AND。 – Scott 2010-01-29 15:59:24

+0

您是否尝试将配方从配方中移除? – 2010-02-01 18:49:49

回答

3

在Crystal Reports顶部菜单转到报告/选择公式/记录......在那里,你可以添加类似的公式:

{table.field1} = {?Parameter1} and {table.field2} = {?Parameter2} 

那会将条件添加到报表将用于提取行的SQL查询的where语句中。

要验证报告用于提取数据的where语句中的条件,可以转到菜单数据库/显示SQL语句。这样您就可以验证报告是否使用过滤器中的参数。

水晶报表8.5用户指南提以下建议:

要下推记录选择, 必须在报告选项对话框 中选择“使用索引或服务器的 速度”(上可用文件菜单)。

在记录选择公式中,请避免在 而不是参数字段的字段上进行数据 类型转换。例如, 避免使用ToText()将 数字数据库字段转换为字符串 数据库字段。

您可以按下一些使用常量表达式的记录选择公式 。

您的公式在字段中具有TRIM功能。该字段的功能不允许Crystal将公式推送到数据库,因为它不是一个常量表达式。

如果你真的需要修整订单号字段,你应该使用SQL Expressions

参考文献: 看看这个article

+0

我确实有一个参数,但它没有显示在SQL语句中。 – Scott 2010-01-28 22:10:40

+0

我在Crystal Reports中运行测试,并将条件放在where语句中。我正在使用Crystal 9. 您使用的是什么版本的Crystal? 我去了文件/报告选项,这是在我的报告中检查: 数据库服务器是不区分大小写,用户索引或服务器速度,创建组树。你检查了哪些? – 2010-01-28 23:21:30

+0

我们正在使用8.5版本。我在报告选项屏幕中选中了以下内容:将NULL转换为默认值,转换DOS字符串,转换DOS备忘录,使用索引或服务器获得速度,更多报告引擎错误消息,不区分大小写的SQL数据,选择不同的数据进行浏览,创建组树,并在刷新时显示警报。 – Scott 2010-01-29 16:02:09