【问题标题】:Change Crystal report Parameters更改 Crystal 报表参数
【发布时间】:2009-06-01 17:05:43
【问题描述】:

有一个用 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 预览中是否可以更改值?

【问题讨论】:

  • 报告的数据源是什么。是否有报告从中提取数据的文本文件,或者它是否连接到数据库?

标签: vb.net crystal-reports parameters


【解决方案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。

【讨论】:

    【解决方案2】:

    我可能有错误分配的问题。看... 我有一个创建水晶报表文件(发票)...这个文件有很多参数 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 as Hashtable(带参数的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 不是什么都没有,那么 rep.SetDataSource(STable) ' 设置数据源 万一 For Each Param As ParameterField In rep.ParameterFields ' set parametervalues 如果 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()
    

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多