2015-10-14 14 views
8

Pracuję nad aplikacją systemu Windows i korzystam z niej w postaci Crystal Report.Jak przekazywać wartości do dwóch różnych parametrów

Jestem w stanie przekazać wartość do jednego parametru Crystal Report. Teraz dodałem jeszcze jeden parametr do Crystal Report, ale nie rozumiem, jakie modyfikacje muszę wprowadzić w poniższym kodzie.

Poniższy kod został zapisany w celu przekazania wartości do jednego parametru CR.

Private Sub btnLoadBatch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadBatch.Click 
    Try 
     Dim cr As New crMonthwiseBatch 
     Dim oBatches As New Batches 

     Dim Month As Integer = dtFrom.Value.Date.Month 
     Dim StartDateForBatch As Date = New DateTime(dtBatchStartFromMonth.Value.Year, dtBatchStartFromMonth.Value.Month, "1") 
     Dim DaysinMonths As Integer = System.DateTime.DaysInMonth(dtBatchStartFromMonth.Value.Year, dtBatchStartFromMonth.Value.Month) 
     Dim EndDateForBatch = StartDateForBatch.AddDays(DaysinMonths) 

     oBatches.LoadByQuery("CreatedDate >= #" + StartDateForBatch + "# and CreatedDate <= #" + EndDateForBatch + "#") 
     cr.SetDataSource(oBatches) 

     Dim crParameterFieldDefinitions As ParameterFieldDefinitions 
     Dim crParameterFieldDefinition As ParameterFieldDefinition 
     Dim crParameterValues As New ParameterValues 
     Dim crParameterDiscreteValue As New ParameterDiscreteValue 

     crParameterDiscreteValue.Value = "Batch List of Month - " + MonthName(dtBatchStartFromMonth.Value.Month) + " " + dtBatchStartFromMonth.Value.Year.ToString 
     crParameterFieldDefinitions = cr.DataDefinition.ParameterFields 
     crParameterFieldDefinition = crParameterFieldDefinitions.Item("MonthName") 
     crParameterValues = crParameterFieldDefinition.CurrentValues 

     crParameterValues.Clear() 
     crParameterValues.Add(crParameterDiscreteValue) 
     crParameterFieldDefinition.ApplyCurrentValues(crParameterValues) 

     CrystalReportViewerMonthwiseBatch.ReportSource = cr 
     CrystalReportViewerMonthwiseBatch.Refresh() 
    Catch ex As Exception 

    End Try 
End Sub 

Odpowiedz

5

Można to osiągnąć w ten sposób (wygląd komentarzach powyżej rachunku (-ów) dla opisu)

Podejście 1:

'... 
'collection of objects for every parameter field 
Dim crParameterFieldDefinitions As ParameterFieldDefinitions 
'represent a parameter field 
Dim crParameterFieldDefinition As ParameterFieldDefinition 
'collection of ParameterValue objects for every parameter field 
Dim crParameterValues As New ParameterValues() 
'for retrieving and setting discrete value parameters 
Dim crParameterDiscreteValue As New ParameterDiscreteValue() 

'get parameters collection in current crystal report 
crParameterFieldDefinitions = cr.DataDefinition.ParameterFields 

'adding FIRST parameter 
'get the parameter in the current report and assign a value 
crParameterFieldDefinition = crParameterFieldDefinitions("PARAM_1_NAME") 
crParameterDiscreteValue.Value = "PARAM_1_VALUE" 
crParameterValues = crParameterFieldDefinition.CurrentValues 

'clear old/default values assigned to current parameter, add and apply new value 
crParameterValues.Clear() 
crParameterValues.Add(crParameterDiscreteValue) 
crParameterFieldDefinition.ApplyCurrentValues(crParameterValues) 
'finished adding FIRST parameter 

'adding SECOND and subsequent parameters 
'reset the collections 
crParameterDiscreteValue = New ParameterDiscreteValue() 
crParameterValues = New ParameterValues() 

'get parameter, assign values, clear old values, add to collection and apply 
crParameterFieldDefinition = crParameterFieldDefinitions("PARAM_2_NAME") 
crParameterDiscreteValue.Value = "PARAM_2_VALUE" 
crParameterValues = crParameterFieldDefinition.CurrentValues 
crParameterValues.Clear() 
crParameterValues.Add(crParameterDiscreteValue) 
crParameterFieldDefinition.ApplyCurrentValues(crParameterValues) 
'finished adding SECOND parameter 
'... 
'Just display the report 

Podejście 2:
Jeśli masz wiele parametrów, można to również osiągnąć, stosując osobną procedurę, taką jak

Private Sub SetParams(crRpt As CrystalDecisions.CrystalReports.Engine.ReportDocument, strParamName As String, strParamValue As String) 
    For Each pfField As CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinition In crRpt.DataDefinition.ParameterFields 
     If pfField.Name.ToString().ToLower() = strParamName.ToLower() Then 
     Try 
      Dim crParameterValues As New CrystalDecisions.Shared.ParameterValues() 
      Dim crParameterDiscreteValue As New CrystalDecisions.Shared.ParameterDiscreteValue() 
      crParameterDiscreteValue.Value = strParamValue 
      crParameterValues = pfField.CurrentValues 
      crParameterValues.Clear() 
      crParameterValues.Add(crParameterDiscreteValue) 
      pfField.ApplyCurrentValues(crParameterValues) 
     Catch ex As Exception 
      'add your exception handling mechanism here 
      MessageBox.Show(ex.Message) 
     End Try 
     End If 
    Next 
End Sub 

Powyższy rutyna może być wywołana dla każdego obiektu raportu (jak cr w przykładzie poniżej), aby dodać dowolną liczbę parametrów do sprawozdań

SetParams(cr, "@Param_1_Name", "Param_1_Value") 
SetParams(cr, "@Param_2_Name", "Param_2_Value") 
'... 
SetParams(cr, "@Param_n_Name", "Param_n_Value") 
+0

Właśnie zauważyłem dzwonisz 'CrystalReportViewerMonthwiseBatch.Refresh() 'na końcu procedury. Wątpię, czy może zresetować wartości parametrów i usunąć nowe dodane powyżej. – haraman

+0

Bardzo dziękuję, wybieram approch 1. – bnil

Powiązane problemy