Crystal Reports - 通过文本范围选择记录

时间:2012-05-11 21:07:21

标签: sql-server string crystal-reports

我有一个查询事务表的报告,我简化了下表:

CREATE TABLE [dbo].[NL_Trans](
    [NT_PRIMARY] [int] NOT NULL,
    [NT_CODE] [varchar][20] NOT NULL,
    [NT_CAT1] [varchar](6) NOT NULL,
    [NT_CAT2] [varchar](6) NOT NULL,
)

表格中的数据如下:

NT_PRIMARY -- NT_CODE --- NT_CAT1 --- NT_CAT2
---------------------------------------------
      1       AB100         123         234
      2       AB200         124         234
      3       AB300         125         235
      4       AB400         126         235

该表包含多年数据,有8个NT_CAT字段,这些数字存储为varchar

我有一个很大的类别列表来限制查询,但我找不到将其限制为文本范围的方法。 到目前为止,我已经尝试过:

{NL_Trans.NT_CAT1} IN "124" to "125"

AND

(CDbl ({NL_Trans.NT_CAT1}) IN 124 to 125))

两者都没有返回任何结果。

我不能使用大量的OR语句,因为在某些情况下范围超过100个项目意味着我需要数千行。

任何人都可以提供一个可行的替代方案(并在可能的情况下利用Catagories索引)或者告诉我为什么上述任何一个语句都不起作用?

2 个答案:

答案 0 :(得分:1)

首先,您不能相信Crystal会评估像"5" in "1" to "10"这样的语句。我不知道这些比较的基础,但我猜它是基于前导数字的ascii值或类似的东西。

话虽如此,转换为双应该工作......你的NT_CAT字段中是否有非数字字符?你应该在你的记录选择公式中尝试这样的事情,看看你是否有更好的运气:

if not(isnull({NL_TRANS.NT_CAT1})) and isnumeric({NL_TRANS.NT_CAT1}) then cdbl({NL_TRANS.NT_CAT1}) in 124 to 125

这样做的缺点是Crystal不会将它添加到要在SQL Server上处理的WHERE子句,它将在本地计算机上进行选择。为了解决性能问题,您可以在Crystal中创建一个SQL表达式,它将为您执行字符串到数字的转换。我不使用TSQL所以我不打算尝试将我的Crystal代码片段转换为它,但是如果你创建了SQL Expression {%ConvertCAT1ToNumeric},你可以在你的选择公式中使用它:

not(isnull({%ConvertCAT1ToNumeric})) and {%ConvertCAT1ToNumeric} in 124 to 125

祝你好运。

答案 1 :(得分:0)

试试这个。

删除thoose lines **,这是标准类型之一..您可能正在寻找范围 ** {NL_Trans.NT_CAT1} IN“124”到“125” **和

并且仅将其设置为选择标准,但首先关闭,尝试为数字范围公式选择不同的字段,复制整个公式并创建新标准。将该字段重命名为approriate字段并运行报告。 (别忘了删除你做的第一个虚拟标准)

原文: (CDbl({NL_Trans.NT_CAT1})IN 124至125))

我认为这是范围数字的公式 (CDbl({NL_Trans.NT_CAT1})在124到125之间))