提问人:WattMonki 提问时间:6/18/2022 更新时间:6/19/2022 访问量:572
Crystal Reports 将数据库字段作为存储过程的参数传递
Crystal Reports Pass database fields as parameter for Stored Procedure
问:
我有一个存储过程/SQL 函数,该函数对返回 0.00 或其他 DEC 值的特定记录进行计算。它将记录的主键作为参数。
我想通过传递每个单独记录的主键数据库字段在 Crystal Reports 中实现此函数/存储过程。但是,当我尝试这样做时,它需要我手动输入 id。我实现的晶体报告按 id 分组,以便每条记录都有一个报告。
有没有办法将数据库字段作为存储过程或 SQL 函数的参数传递?有类似的东西可以使用吗?
答:
如果我理解正确的话,您希望执行一些代码(存储过程或函数),该代码使用列的值作为代码的输入,并且希望一次对多行执行此操作。
如果将代码编写为用户定义的函数(理想情况下是内联表值函数),这有点像采用参数的视图,则可以使用交叉应用或外部应用来执行每行的代码。
下面是一个简单的示例。假设我有一个代码块,写成一个用户定义的函数。它接受一个整数输入参数,只需将一个添加到输入参数中:
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 |
另一种方法是将使用 SP 作为其数据源的子报表插入到“组标题”部分。将 ID 作为子报表链接传递,以便将其用作 SP 参数。
如果需要在主报表计算中返回值,请使用子报表公式将该值加载到共享变量中,以便主报表公式可以访问该值。
另一种选择是使用 Crystal Reports UFL(用户函数库)。Ken Hamady 在此处维护了 UFL 列表。其中至少有一个提供了一个函数,允许您调用动态 SQL 语句并返回值。
评论
我似乎无法编辑评论以包含代码,因此我发布新答案以解决您的新问题:
在子报表中,使用公式声明和设置共享变量的值。例如:
Shared numbervar CalcResult := {SP_Column_Providing_The_Result};
在主报表中,在子报表下方的部分中,只需声明相同的共享变量即可。并使用它。它将返回子报表中的值。
上一个:在存储过程中未接收输入值
评论