我有一個存盤程序/SQL 函式,它對回傳 0.00 或另一個 DEC 值的特定記錄進行計算。它將記錄的主鍵作為引數。
我想通過為每個單獨的記錄傳遞主鍵資料庫欄位來在 Crystal Reports 中實作此功能/存盤程序。但是,當我嘗試這樣做時,它需要我手動輸入 id。我實作的水晶報表按 id 分組,以便每條記錄都有一個報表。
有沒有辦法可以將資料庫欄位作為存盤程序或 SQL 函式的引數傳遞?我可以使用類似的東西嗎?
uj5u.com熱心網友回復:
另一種方法是將使用 SP 作為其資料源的子報表插入到 Group Header 部分。將 ID 作為子報表鏈接傳遞,因此它被用作 SP 引數。
如果您需要在主報表計算中回傳值,請使用子報表公式將該值加載到共享變數中,以便主報表公式可以訪問它。
另一種選擇是使用 Crystal Reports UFL(用戶函式庫)。Ken Hamady在這里維護了一個 UFL 串列。其中至少有一個提供了一個函式,允許您呼叫動態 SQL 陳述句并回傳一個值。
uj5u.com熱心網友回復:
如果我對您的理解正確,您希望執行一些代碼(存盤程序或函式),該代碼使用列的值作為代碼的輸入,并且您希望一次對多行執行此操作。
如果您將代碼撰寫為用戶定義的函式(最好是行內表值函式),這有點像帶有引數的視圖,那么您可以使用交叉應用或外部應用來執行每一行的代碼。
這是一個簡單的例子。假設我有一段代碼撰寫為用戶定義的函式。它接受一個整數輸入引數,并在輸入引數上加一:
create or alter function MyFunction(@MyParam int) returns table as
return
(
select @MyParam 1 as MyResult
);
go
因為這個函式回傳一個表,所以我通過從中選擇來獲得結果,就像從常規表或視圖中選擇一樣,如下所示:
select MyResult from MyFunction(68);
-- returns a result set with a single row and column, with a value of 69
但輸入引數值也可以來自列中的值。我們通過將函式交叉應用到表來為每一行提供值,因為“交叉應用”意味著“為每一行運行這個函式”。假設我有一些包含 2 行的表:
create table MyTable(i int primary key);
go
insert MyTable(i) values (1), (2);
我想針對i表中的所有值運行我的函式。我使用 來執行此操作cross apply,并將列的名稱作為輸入引數傳遞:
select f.MyResult
from dbo.MyTable t
cross apply dbo.MyFunction(t.i) f;
上面的代碼回傳以下結果集:
| 我的結果 |
|---|
| 2 |
| 3 |
uj5u.com熱心網友回復:
我似乎無法編輯評論以包含代碼,因此我將發布作為解決您的新問題的新答案:
在子報表中,使用公式來宣告和設定共享變數的值。例如:
Shared numbervar CalcResult := {SP_Column_Providing_The_Result};
在主報告中,在子報告下方的部分中,只需宣告相同的共享變數。并使用它。它將從子報表回傳值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/492700.html
標籤:sql服务器 存储过程 水晶报告 参数传递 sql函数
