この例には3 つの DataSets
が含まれます。3 つの DataSet があるため、3 つの Report.rdlcを1 つのReport.rdlc で使用します。シナリオは単純な生産ラインになります。スターティングマシン、組み立て中のマシン、出荷中のマシンがあります。DataSources
DataSet (.XSD) ファイルの作成方法を知っていることを前提としています。この投稿では、コードをセクションに分割し、最終的な結果を示します。
あなたの質問にとって重要なのは、3 つのデータソースを 1 つのレポートに割り当てる方法です。
宣言
、データベースから収集された情報を保持する3つclsAssemblyState
のカスタム クラスがあります。これらは、オブジェクトとして使用するカスタム クラスです。データを XML にバインドします。以下の「プログラムによる DataTableの入力」セクションで説明するように、プログラムで割り当てます。clsExpeditionState
clsStartState
Dim ds1 As New dsAssemblies 'Link to my DataSet called dsAssemblies'
Dim ds2 As New dsExpeditions 'Link to my DataSet called dsExpeditions'
Dim ds3 As New dsStarts 'Link to my DataSet called dsStarts'
Dim sReportDataSource1 As ReportDataSource 'First datasource'
Dim sReportDataSource2 As ReportDataSource 'Second datasource'
Dim sReportDataSource3 As ReportDataSource 'Third datasource'
Dim AssemblyStates As List(Of clsAssemblyState) = clsAssemblyState.GetAll() 'List that contains all my machines being assembled'
Dim ExpeditionStates As List(Of clsExpeditionState) = clsExpeditionState.GetAll() 'List that contains all my machines in shipping'
Dim StartStates As List(Of clsStartState) = clsStartState.GetAll() 'List of all my machines being started (paper work)'
レポートのリセット
新しいものを割り当てる前に、レポート データソースをクリアすることをお勧めします。
'Reset the viewer'
rv.Reset()
rv.LocalReport.ReportEmbeddedResource = "YourProjectName.YourReportName.rdlc"
rv.LocalReport.DataSources.Clear()
sReportDataSource1 = New ReportDataSource()
sReportDataSource2 = New ReportDataSource()
sReportDataSource3 = New ReportDataSource()
プログラムによる DataTable の入力
これで dsAssemblies の DataTable がいっぱいになります。他の 2 つの DataTable についても同じことが行われますが、ここにこれを書き出すのは冗長です。
'Fill datatables'
If AssemblyStates.Count > 0 Then
For Each asmState As clsAssemblyState In AssemblyStates
Dim asm As New clsAssembly(asmState.FK_Assembly)
Dim Machine As New clsMachine(asm.FK_Machine)
Dim Client As New clsClient(Machine.FK_Client)
Dim State As New clsState(asmState.FK_State)
ds1.dtAssembly.Rows.Add(Machine.MachineNo, Machine.Description, Client.Nom, State.State, asm.DateTransfer.ToString("yyyy-MM-dd"))
Next
Else
'No information was retrieved from my GetAll(), therefor no rows ... I add a row with values of "N/A" notifying the user that there is nothing in that particular DataTable'
ds1.dtAssembly.Rows.Add("N/A", "N/A", "N/A", "N/A", "N/A")
End If
DataTable を DataSource に割り当てる
sReportDataSource[i].Name
それぞれの DataSet の各 DataTable に割り当てた名前です。コードの下に DataSet の画像を表示します。
sReportDataSource1.Name = "Assembly_DataSet"
sReportDataSource2.Name = "Expedition_DataSet"
sReportDataSource3.Name = "Start_DataSet"
sReportDataSource1.Value = ds1.dtAssembly
sReportDataSource2.Value = ds2.dtExpedition
sReportDataSource3.Value = ds3.dtStart
rv.LocalReport.DataSources.Add(sReportDataSource1)
rv.LocalReport.DataSources.Add(sReportDataSource2)
rv.LocalReport.DataSources.Add(sReportDataSource3)
rv.RefreshReport()
Me.Show()
ここに、3 つの DataSet とその DataTable が表示されます
完全なレポート コード
このメソッドは、3 つのデータソースを使用してレポートを生成します。もちろん、これらの DataSet を.rdlc
3 つの異なる Tablix などの何かに割り当てる必要があります。
Private Sub GenerateStatusProduction()
Dim ds1 As New dsAssemblies
Dim ds2 As New dsExpeditions
Dim ds3 As New dsStarts
Dim sReportDataSource1 As ReportDataSource
Dim sReportDataSource2 As ReportDataSource
Dim sReportDataSource3 As ReportDataSource
Dim AssemblyStates As List(Of clsAssemblyState) = clsAssemblyState.GetAll()
Dim ExpeditionStates As List(Of clsExpeditionState) = clsExpeditionState.GetAll()
Dim StartStates As List(Of clsStartState) = clsStartState.GetAll()
'Reset the viewer'
rv.Reset()
rv.LocalReport.ReportEmbeddedResource = "YourProjectName.YourReportName.rdlc"
rv.LocalReport.DataSources.Clear()
sReportDataSource1 = New ReportDataSource()
sReportDataSource2 = New ReportDataSource()
sReportDataSource3 = New ReportDataSource()
'Fill datatables'
If AssemblyStates.Count > 0 Then
For Each asmState As clsAssemblyState In AssemblyStates
Dim asm As New clsAssembly(asmState.FK_Assembly)
Dim Machine As New clsMachine(asm.FK_Machine)
Dim Client As New clsClient(Machine.FK_Client)
Dim State As New clsState(asmState.FK_State)
ds1.dtAssembly.Rows.Add(Machine.MachineNo, Machine.Description, Client.Nom, State.State, asm.DateTransfer.ToString("yyyy-MM-dd"))
Next
Else
ds1.dtAssembly.Rows.Add("N/A", "N/A", "N/A", "N/A", "N/A")
End If
If ExpeditionStates.Count > 0 Then
For Each expdState As clsExpeditionState In ExpeditionStates
Dim Expd As New clsExpedition(expdState.FK_Expedition)
Dim Machine As New clsMachine(Expd.FK_Machine)
Dim Client As New clsClient(Machine.FK_Client)
Dim State As New clsState(expdState.FK_State)
ds2.dtExpedition.Rows.Add(Machine.MachineNo, Machine.Description, Client.Nom, State.State, Expd.DateTransfer.ToString("yyyy-MM-dd"))
Next
Else
ds2.dtExpedition.Rows.Add("N/A", "N/A", "N/A", "N/A", "N/A")
End If
If StartStates.Count > 0 Then
For Each strtState As clsStartState In StartStates
Dim Strt As New clsStart(strtState.FK_Start)
Dim Machine As New clsMachine(Strt.FK_Machine)
Dim Client As New clsClient(Machine.FK_Client)
Dim State As New clsState(strtState.FK_State)
ds3.dtStart.Rows.Add(Machine.MachineNo, Machine.Description, Client.Nom, State.State, Strt.DateTransfer.ToString("yyyy-MM-dd"))
Next
Else
ds3.dtStart.Rows.Add("N/A", "N/A", "N/A", "N/A", "N/A")
End If
sReportDataSource1.Name = "Assembly_DataSet"
sReportDataSource2.Name = "Expedition_DataSet"
sReportDataSource3.Name = "Start_DataSet"
sReportDataSource1.Value = ds1.dtAssembly
sReportDataSource2.Value = ds2.dtExpedition
sReportDataSource3.Value = ds3.dtStart
rv.LocalReport.DataSources.Add(sReportDataSource1)
rv.LocalReport.DataSources.Add(sReportDataSource2)
rv.LocalReport.DataSources.Add(sReportDataSource3)
rv.RefreshReport()
Me.Show()
End Sub
注:rv
はレポート ビューアー コントロール名ではなくReportViewer1