Crystal Reports 10:是否可以从命令调用自定义函数

时间:2013-05-31 16:23:18

标签: crystal-reports

我在Crystal Reports 10中创建了4个自定义函数。这些函数将DB记录中的日期时间值作为输入,并确定该日期时间是否属于当前会计年度或上一个会计年度。

这些计算以前是作为SQL Server上的存储过程执行的,但我们正在转移到另一个票证应用程序(托管在供应商站点上),并且当前没有DB来执行这些计算。

以下是其中一个功能的示例:

// Function name: isCloseDateWithinCurrentFY
Function (DateTimeVar closeTime)
// This replaces dbo.fn_FiscalYear
// Determine if the incident close date falls inside the current Fiscal Year
DateTimeVar startCurrentFiscalYear;
NumberVar currentMonth;
StringVar returnVal;

currentMonth := Month(CurrentDate);

If currentMonth >= 2 Then
    startCurrentFiscalYear := Date(Year(CurrentDate), 2, 1)
Else
    startCurrentFiscalYear := Date(Year(CurrentDate)-1, 2, 1);

If (closeTime >= startCurrentFiscalYear) Then
    "T"
Else
    "F";

当这些计算在SQL Server上时,它们是从Crystal Report SQL命令

中使用的
SELECT
category,
subcategory,
close_time,
tyCount
FROM (
    SELECT 
        category=ISNULL(UPPER(category),'*Unspecified'),
        subcategory=ISNULL(UPPER(subcategory),'*Unspecified'),
        tyCount=SUM(CASE WHEN dbo.fn_FiscalYear(close_time)='T' THEN 1 ELSE 0 END)
    FROM 
        incident_tickets
    GROUP BY
        UPPER(category),
        UPPER(subcategory)
) tickets
WHERE
    tycmCount>0
ORDER BY
    category,
    subcategory

在我的情况下,我想通过调用自定义函数dbo.fn_FiscalYear来取代对isCloseDateWithinCurrentFY的调用。

但是可以从SQL命令调用自定义函数吗?

或者是否有其他方法可以根据在Crystal Report端进行的计算来限制返回的记录?

TIA

1 个答案:

答案 0 :(得分:0)

不,你不能在SQL命令中使用任何类型的Crystal代码,因为它们是两个完全不同的野兽。 SQL命令基本上只是Crystal将直接发送到数据库以便获取要处理的记录的查询,之后这些记录将可用于Crystal代码。 SQL服务器无法解释Crystal函数,Crystal无法将其转换为SQL。

最简单的方法可能是将dbo.fn_FiscalYear替换为更多直接硬编码到查询中的SQL。更具体地说,将isCloseDateWithinCurrentFY转换为等效的SQL。