Изменить параметры отчета Crystal - PullRequest
0 голосов
/ 01 июня 2009

есть приложение, написанное на 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 ]

1 голос
/ 01 июня 2009

Один из подходов, которые я использовал для решения этой проблемы в прошлом, - это создание собственного экрана «ввода параметров», чтобы пользователь мог указать свои собственные значения. После отправки процесс запускает собственный пользовательский запрос и вставляет набор результатов в отчет 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, хранящий ваши результаты.

0 голосов
/ 03 июня 2009

Спасибо за любую помощь ... Я получил ответ ... вот код

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
0 голосов
/ 02 июня 2009

Возможно, у меня неправильный заданный вопрос. У меня есть документ Crystal Report (счет-фактура) ... Этот документ имеет много параметров Т.Е. Имя, адрес, телефон, налоговая ставка и прочее ... и привязаны к 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 не является ничем, то rep.SetDataSource (STable) 'источник данных установки End If Для каждого параметра как ParameterField в rep.ParameterFields 'установить значения параметров Если SParams.ContainsKey (Param.Name.ToUpper), то rep.SetParameterValue (Param.Name, SParams (Param.Name.ToUpper)) еще rep.SetParameterValue (Param.Name, Param.DefaultValues ​​()) End If следующий RP_Viwer.Zoom (75) RP_Viwer.Refresh () End Sub

в этой форме у меня есть кнопка. когда пользователь нажимает эту кнопку, открывается диалоговая форма со всеми параметрами и значениями в отчете (без источника данных). Пользователь может изменять значения параметров (адрес e.t.c, телефон, имя), за исключением источника данных (e.t.c товары, количество, стоимость). Я не могу этого сделать. я пытаюсь написать что-то простое:

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

но этот код не работает ... Как я могу сделать ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...