我有一个查询事务表的报告,我简化了下表:
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索引)或者告诉我为什么上述任何一个语句都不起作用?
答案 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之间))