无效报告文件路径错误 - Crystal 带存储过程的报告

Invalid Report File Path error - Crystal Reports w/ stored procedure

我有一个 VB.Net 应用程序,它使用来自不同数据源的数据集创建一个 crystal 报告,这些数据集进入单独的子报告。在我尝试将存储过程用作子报表的数据源之前,该报表显示正常,在这种情况下我收到错误 "Invalid Report File Path"。

此存储过程需要将数字连接到列名以避免重复代码。

我在填充数据集的地方设置了断点,检查了数据集的内容,发现所有需要的数据都在数据集中,但是当我单步执行到报告的位置时我会收到错误打开。当我在 SQL 服务器中执行存储过程时,数据 returns 没有问题。如果我删除使用存储过程的子报表,报表将生成正常。想知道是否需要对存储过程进行不同的编码...?还是别的?

这是存储过程的代码

ALTER PROCEDURE [dbo].[T_STORED_PROC]
(

@qmonth varchar(20),
@qyear varchar (4),
@qid varchar (10)
)
AS


DECLARE @i varchar(10)
DECLARE @sql varchar(1000)

SET @i = 1

WHILE (@i <=28)
BEGIN
 SET @sql ='SELECT t1.ID, t2.CatId, t2.CatName, t1.M_'+ @i +'_DATE As Mid_Date 
FROM Table1 As t1, Table2 As t2 WHERE t2.CatId = RTRIM(LEFT(t1.M_'+ @i +', 2)) 
AND t1.ID = '''+ @qid +''' AND t1.Yr = '+ @qyear +' AND t1.M_Month = '''+ @qmonth +''' 
ORDER BY t1.ID'

    EXEC (@sql)

END

相关的 VB 在这里

Dim dsQRpt = New Data.DataSet
 Dim dsMS = New Data.DataSet
 Dim QPrpt = New ReportDocument

 Dim cmd As OleDbCommand = New OleDbCommand()
        cmd.Connection = MSCON
        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandText = "dbo.T_STORED_PROC"
        cmd.Parameters.Add("@qmonth", OleDbType.VarChar, 20, ParameterDirection.Output).Value = cboMonth.SelectedValue
        cmd.Parameters.Add("@qyear", OleDbType.VarChar, 4, ParameterDirection.Output).Value = cboYear.SelectedValue
        cmd.Parameters.Add("@qid", OleDbType.VarChar, 10, ParameterDirection.Output).Value = txtPTSID.Text

        Dim DAms As New OleDbDataAdapter(cmd.CommandText, MSCON)

        DAms.SelectCommand = cmd

        DAms.Fill(dsQRpt)

        QPrpt.Load(Server.MapPath("crReport.rpt"))
        QPrpt.SetDataSource(dsQRpt)
        crQtrProgress.ReportSource = QPrpt

感谢您的帮助

我找到了解决问题的办法。 Crystal Reports 似乎无法识别存储在 SQL 变量中的数据库字段。我更改了存储过程,以便查询结果填充我创建的临时 table,然后从中获取数据库字段。这是工作存储过程:

ALTER PROCEDURE [dbo].[T_STORED_PROC]
(

@qmonth varchar(20),
@qyear varchar (4),
@qid varchar (10)
)
AS

--Temp table
DECLARE @tmp table
(
ID nvarchar(10),
CategoryId int,
CategoryName nvarchar(50),
CatDate datetime
)

DECLARE @i varchar(10)
DECLARE @sql varchar(1000)

SET @i = 1

WHILE (@i <=28)
BEGIN
 SET @sql ='SELECT t1.ID, t2.CatId, t2.CatName, t1.M_'+ @i +'_DATE As Mid_Date 
FROM Table1 As t1, Table2 As t2 WHERE t2.CatId = RTRIM(LEFT(t1.M_'+ @i +', 2)) 
AND t1.ID = '''+ @qid +''' AND t1.Yr = '+ @qyear +' AND t1.M_Month = '''+ @qmonth +''' 
ORDER BY t1.ID'

--INSERT results into temp table
INSERT INTO @tmp

    EXEC (@sql)

END

--SELECT from temp table
SELECT ID As ID,
CategoryId AS CategoryId,
CategoryName AS CategoryName,
CatDate As CatDate
FROM @tmp