Crystal Reports 将数据库字段作为存储过程的参数传递

Crystal Reports Pass database fields as parameter for Stored Procedure

提问人:WattMonki 提问时间:6/18/2022 更新时间:6/19/2022 访问量:572

问:

我有一个存储过程/SQL 函数,该函数对返回 0.00 或其他 DEC 值的特定记录进行计算。它将记录的主键作为参数。

我想通过传递每个单独记录的主键数据库字段在 Crystal Reports 中实现此函数/存储过程。但是,当我尝试这样做时,它需要我手动输入 id。我实现的晶体报告按 id 分组,以便每条记录都有一个报告。

有没有办法将数据库字段作为存储过程或 SQL 函数的参数传递?有类似的东西可以使用吗?

sql-server 存储过程 crystal-reports 参数传递 sql-function

评论


答:

0赞 allmhuran 6/18/2022 #1

如果我理解正确的话,您希望执行一些代码(存储过程或函数),该代码使用列的值作为代码的输入,并且希望一次对多行执行此操作。

如果将代码编写为用户定义的函数(理想情况下是内联表值函数),这有点像采用参数的视图,则可以使用交叉应用或外部应用来执行每行的代码。

下面是一个简单的示例。假设我有一个代码块,写成一个用户定义的函数。它接受一个整数输入参数,只需将一个添加到输入参数中:

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);

我想针对表中的所有值运行我的函数。我使用 ,并将列的名称作为输入参数传递:icross apply

select      f.MyResult
from        dbo.MyTable         t
cross apply dbo.MyFunction(t.i) f;

上面的代码返回以下结果集:

我的结果
2
3
1赞 MilletSoftware 6/18/2022 #2

另一种方法是将使用 SP 作为其数据源的子报表插入到“组标题”部分。将 ID 作为子报表链接传递,以便将其用作 SP 参数。
如果需要在主报表计算中返回值,请使用子报表公式将该值加载到共享变量中,以便主报表公式可以访问该值。

另一种选择是使用 Crystal Reports UFL(用户函数库)。Ken Hamady 在此处维护了 UFL 列表。其中至少有一个提供了一个函数,允许您调用动态 SQL 语句并返回值。

评论

0赞 WattMonki 6/18/2022
在第一种方法中,我创建了按 ID 分组的主报表,每个页面都有关于每条记录的信息。如何将 ID 传递给子报表?我是 Crystal Reports 的新手,我真的不知道该怎么做。
0赞 MilletSoftware 6/18/2022
首先创建一个使用存储过程作为数据源的独立报表。存储过程参数将自动成为 Crystal Reports 参数。测试它是否有效。然后,进入主报表并插入该子报表。然后,右键单击子报表并选择“更改子报表链接”。将 ID 作为链接从主报表传递到子报表。使用对话框底部的下拉列表将传递的值映射到子报表参数。
0赞 WattMonki 6/19/2022
知道了!多谢!如果需要返回第二部分中提到的主报表计算的值,该怎么办?您说要使用子报表值并为主变量创建一个共享变量。我该怎么做?
1赞 MilletSoftware 6/19/2022 #3

我似乎无法编辑评论以包含代码,因此我发布新答案以解决您的新问题:

在子报表中,使用公式声明和设置共享变量的值。例如:

Shared numbervar CalcResult := {SP_Column_Providing_The_Result}; 

在主报表中,在子报表下方的部分中,只需声明相同的共享变量即可。并使用它。它将返回子报表中的值。