更改Crystal报表参数

时间:2009-06-01 17:05:43

标签: vb.net crystal-reports parameters

有一个用Visual Basic,.NET 3.5(VS2008)编写的应用程序......并且在Crystal Reports 2008中创建了报告....一切正常......我用这样的代码传递参数值...

Dim SParams as new hashtable
SParams.add(paramname1,paramvalue1)
SParams.add(paramname2,paramvalue2)
SParams.add(paramname3,paramvalue3)
....
For Each Param As ParameterField In rep.ParameterFields
            If SParams.ContainsKey(Param.Name.ToUpper) Then
                rep.SetParameterValue(Param.Name, SParams(Param.Name.ToUpper))
            Else
                rep.SetParameterValue(Param.Name, Param.DefaultValues())
            End If
Next
... and it works fine...

我想在运行时在报表查看器中显示报表时更改某些参数值...用户应该能够修改这些值。我怎样才能做到这一点? 与Crystal Reports设计器预览类似。从CR预览中可以更改值吗?

3 个答案:

答案 0 :(得分:1)

我过去为解决此问题而采取的一种方法是创建自己的“参数输入”屏幕,供用户指定其自定义值。提交后,该流程将运行自己的自定义查询,并将结果集注入Crystal Report。然后,报告只是作为数据的表示机制。

这样做的好处在于您可以将Crystal Report配置为使用XSD源作为其数据模型,该数据模型用作数据外观的空框架。然后在你的代码后面为你的表单做一些简单的事情:

Dim crResults As New ReportDocument
Dim dtReportData As New DataTable

crResults.Load("PathToReport", OpenReportMethod.OpenReportByTempCopy)
dtReportData = RunStoredProcedure(ReportInfo.ProcedureName, ReportInfo.Parameters)
crResults.SetDataSource(dtReportData)

注意:RunStoredProcedure是我设置的一个自定义函数,用于调用存储过程并传入一个HashTable参数进行绑定,但是您可以以任何方式滚动它以使DataTable存储结果。

答案 1 :(得分:0)

我可能错误分配了问题。看... 我有一个创建的水晶报告文件(发票)......这个文件有很多参数 T.E.姓名,地址,电话,税率等......并且已经绑定到Datatable,其中包括有关商品,数量,成本和其他的信息...这一切都运行正常......这就是我对此代码的处理。

Dim rptobj As New rpt_Invoice ' my invoice sceleton
Using tblInvoice As New DataTable
'DataTable to bind
tblInvoice.Columns.Add("ANAME", GetType(String))
tblInvoice.Columns.Add("CNT", GetType(Double))
tblInvoice.Columns.Add("CNTSTR", GetType(String))
tblInvoice.Columns.Add("OUT_PR", GetType(Double))
For Each row As Datagridviewrow In rowCol
    Dim Drow As Data.DataRow = tblInvoice.NewRow
    Drow.Item("ANAME") = DBNullBug(row.Cells("ANAME").Value)
    Drow.Item("CNT") = row.Cells("DECCNT").Value
    Drow.Item("CNTSTR") = row.Cells("CNT").Value
    Drow.Item("OUT_PR") = row.Cells("SOLD_PR").Value
    tblInvoice.Rows.Add(Drow)
Next
'Params to pass 
Dim RPTParams As New Hashtable
RPTParams.Add("NDS", OPT.Item.NDSValue)
RPTParams.Add("INVOICENUM", "")
RPTParams.Add("INVOICEHIMQ", "")
RPTParams.Add("KATPASHT1", "Director")
RPTParams.Add("KATPASHT2", "Accountant")
RPTParams.Add("VCHPASHT1", "Director")
RPTParams.Add("VCHPASHT2", "Accountant")
RPTParams.Add("ADATE", CDate(Now))
RPTParams.Add("INFO", "")
RPTParams.Add("ORDER_ID", Order_Id)
Dlg_RepPreview.STable = tblInvoice
Dlg_RepPreview.SParams = RPTParams
Dlg_RepPreview.rep = rptobj
Dlg_RepPreview.ShowDialog()
End Using

名为“Dlg_RepPreview”的表单有rep变量(reportdocument)和STable(DataTable),SParams为Hashtable(带参数的哈希表)。

Form_Load上的

我写了这段代码

Private Sub Dlg_Rep_Load(ByVal sender As Object,ByVal e As System.EventArgs)处理Me.Load         RP_Viwer.ReportSource = rep'RP_Viwer是我的ReportViewer         如果STable IsNot Nothing那么             rep.SetDataSource(STable)'设置数据源         万一         For Each Param As ParameterField在rep.ParameterFields中设置参数值             如果SParams.ContainsKey(Param.Name.ToUpper)那么                 rep.SetParameterValue(Param.Name,SParams(Param.Name.ToUpper))             其他                 rep.SetParameterValue(Param.Name,Param.DefaultValues())             万一         下一个         RP_Viwer.Zoom(75)         RP_Viwer.Refresh() 结束子

在这种形式我有一个按钮。当用户点击该按钮时,打开对话框表格,包含报告中的所有参数和值(无数据源)。用户可以更改参数值(e.t.c地址,电话,名称),但数据源(e.t.c货物,数量,成本)除外。 我不能这样做。我尝试编写像这样简单的代码:

rep.SetParameterValue(Param.Name, Param.value)
rep.Refresh()
RP_Viwer.Refresh()

但这段代码不起作用......我怎么办???

答案 2 :(得分:0)

感谢您的帮助......我得到了答案......这是代码

Private Sub SetParameters(ByVal Params As Hashtable)
    rep.DataDefinition.ParameterFields.Reset() ' rep is the ReportDocument
    ' rep.Refresh()
    For Each Param As ParameterField In rep.ParameterFields
        If Params.ContainsKey(Param.Name.ToUpper) Then
            rep.SetParameterValue(Param.Name, Params(Param.Name.ToUpper))
        Else
            rep.SetParameterValue(Param.Name, Param.DefaultValues())
        End If
    Next
    SetReport(rep)
End Sub

Public Sub SetReport(ByVal rpt As ReportDocument)
    RP_Viwer.Hide()
    RP_Viwer.ReportSource = rpt
    RP_Viwer.Zoom(75)
    RP_Viwer.Refresh()
    RP_Viwer.ShowLastPage()
    Lbl_TotalPageCount.Text = "/" & RP_Viwer.GetCurrentPageNumber()
    RP_Viwer.ShowFirstPage()
    RP_Viwer.Show()
End Sub