2012-05-11 31 views
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 

該表格有幾年的數據,並有8​​字段,這些數字存儲爲varchar的

我有一個很大的類別列表來限制查詢,但我找不到一種方法來限制這個範圍的文本。 到目前爲止,我曾嘗試:

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

AND 

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

既不都返回任何結果。

我無法使用大量的OR語句,因爲在某些情況下,範圍超過100個項目,這意味着我需要數千行。

任何人都可以提供一個可以工作的替代方案(如果可能的話,可以使用Catagories索引),或者告訴我爲什麼上述兩種方法都不起作用?

回答

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

這樣做的缺點是,水晶不會將其添加到WHERE子句上進行處理SQL Server,它會在本地機器上做選擇。爲了解決性能問題,您可以在Crystal中創建一個SQL表達式,它將爲您執行字符串到數字的轉換。我不使用T-SQL,所以我不打算嘗試和我的水晶代碼片段轉換爲它,但如果你創建的SQL表達式{%ConvertCAT1ToNumeric}您可以只使用此選擇公式:

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

祝你好運。

+0

終於找到了問題,多虧了你的測試,這是一個帶括號的基本格式錯誤,'Cdbl IN Range'方法現在正在工作。 – bendataclear

0

試試這個。

刪除thoose線**是標準型的一個..您可能會在「124」來尋找範圍 ** {} NL_Trans.NT_CAT1爲「125」 **和

和只把它放在選擇標準上,但首先關閉,嘗試爲數字範圍公式選擇不同的字段,複製整個公式並創建一個新的標準。將該字段重命名爲適當的字段並運行報告。 (不要忘記刪除你做的第一個虛擬的標準)

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

我認爲這是公式範圍內的數字 (CDbl ({NL_Trans.NT_CAT1})在124到125之間))