2010-01-28 160 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