1

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

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

该表有几年的数据,有 8NT_CAT个字段,这些是存储为 varchar 的数字

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

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

AND

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

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

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

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

4

2 回答 2

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 表达式 {%ConvertCAT1ToNumeric} 您可以在选择公式中使用它:

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

祝你好运。

于 2012-05-12T16:44:48.587 回答
0

试试这个。

删除那些是标准类型之一的行**。您可能正在寻找一个范围**{NL_Trans.NT_CAT1} IN“124”到“125”**AND

并且只将其放入选择标准,但首先,尝试为数字范围公式选择不同的字段,复制整个公式并创建一个新标准。将该字段重命名为适当的字段并运行报告。(不要忘记删除您所做的第一个虚拟标准)

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

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

于 2012-05-12T05:14:13.873 回答