2009-06-01 19 views
0

haben eine Anwendung in Visual Basic, .NET 3.5 (VS2008) geschrieben ... und haben Berichte in Crystal Reports 2008 erstellt .... alles funktioniert gut ... Ich übergebe die Parameterwerte mit Code wie diese ...Crystal Reports-Parameter ändern

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... 

ich möchte einige Parameterwerte ändern, wenn Bericht in Report Viewer zur Laufzeit angezeigt ... Der Benutzer diese Werte zu ändern, sollten in der Lage. Wie kann ich das machen? Ähnlich wie bei der Crystal Reports-Designervorschau. Aus der CR-Vorschau sind mögliche Änderungswerte?

+0

Was die Datenquelle für den Bericht ist. Gibt es eine Textdatei, von der der Bericht Daten abruft, oder stellt er eine Verbindung zu einer Datenbank her? –

Antwort

1

Ein Ansatz, den ich gemacht habe, um dieses Problem in der Vergangenheit zu lösen, besteht darin, meinen eigenen Bildschirm "Parametereingabe" zu erstellen, damit der Benutzer seine benutzerdefinierten Werte angeben kann. Nach der Übermittlung führt der Prozess seine eigene benutzerdefinierte Abfrage aus und fügt die Ergebnismenge in den Crystal Report ein. Der Bericht dient dann einfach als Präsentationsmechanismus für die Daten.

Was macht es gut, dass Sie den Crystal Report so konfigurieren können, dass er die XSD-Quelle als Datenmodell verwendet, das als leeres Skelett dessen dient, wie die Daten aussehen werden. Dann in Ihrem Code hinter für Ihre Form tun Sie etwas so einfach wie diese:

Dim crResults As New ReportDocument 
Dim dtReportData As New DataTable 

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

Hinweis: Die RunStoredProcedure ist eine benutzerdefinierte Funktion, die ich Setup eine gespeicherte Prozedur aufrufen und in einer HashTable der Parameter übergeben zu binden, aber Sie Sie können dies auf jede beliebige Weise durchführen, um die DataTable zu erhalten, die Ihre Ergebnisse speichert.

0

Ich habe wahrscheinlich falsch zugeordnet question.Look ... Ich habe eine erstellte Crystal Report Dokument (Rechnung) ... dieses Dokument haben viele Parameter t.e. Name, Adresse, Telefon, Steuersatz und andere ... und an Datatable gebunden haben, was Informationen über Waren, Menge, Kosten und anderes beinhaltet ... das alles funktioniert gut ... und das mache ich mit diesem Code.

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 

Und die Form als "Dlg_RepPreview" hat rep Variable (Report) und stabile (Datentabelle), wie SParams Hashtable (Hashtable mit Parametern).

auf dem Form_Load ich diesen Code

Private Sub Dlg_Rep_Load (ByVal Absender als Gegenstand, ByVal e As System.EventArgs) Griffe Me.Load RP_Viwer.ReportSource = rep 'RP_Viwer ist mein Report Wenn STable IsNot writen Nothing Then rep.SetDataSource (stable) 'Setup-Datenquelle End If For Each Param Wie ParameterField In rep.ParameterFields' Satz Parameterwerte Wenn SParams.ContainsKey (Param.Name.ToUpper) Dann rep.SetParameterValue (Param.Name, SParams (Param.Name.ToUpper)) Sonst rep.SetParameterValue (Param.Name, Param.DefaultValues ​​()) End If Next RP_Viwer.Zoom (75) RP_Viwer.Refresh() End Sub

in dieser Form i über eine Taste. Wenn der Benutzer auf diese Schaltfläche klickt, öffnet er das Dialogformular mit allen Parametern und Werten im Bericht (ohne Datenquelle). Benutzer können Parameterwerte (e.t.c Adresse, Telefon, Name) außer Datenquelle (e.t.c Waren, Menge, Kosten) ändern. Ich kann das nicht tun. Ich versuche Code etwas so einfach wie das:

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

aber dieser Code funktioniert nicht ... Wie kann ich ???

0

Danke für jede Hilfe ... bekam ich eine Antwort ... hier ist der Code

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