3

ざっと検索したところ、探していた答えが見つかりませんでした。そのため、RDLC を使用して請求書、納品書、価格表、およびその他のドキュメントを生成する vb.net Windows アプリケーションがあります。サーバーの負荷を可能な限り軽減するために、情報はサーバーから一度だけ取得され、注文アイテム、価格、およびその他の必要なデータが含まれます。

データが (xml で) 取得されると、さまざまなレポートの生成に使用されるデータセットに入力されます。この同じデータセットが複数の RDLC レポートで使用され、異なる情報が表示されることに注意してください。

したがって、私の場合の問題は、同じデータセットが請求書の生成にも使用されるため、SQL レベルから SELECT DISTINCT を実行できないことですが、同じデータセットから個別の注文のみを含む価格表を表示する必要もあります。アイテム。

だから私が持っているオプション:

  1. 個別の行を表示する RDLC がありますが、それを実現する方法がわかりません。

  2. それができない場合は、既存のデータセットを使用して xsd ファイルに別のデータテーブルを作成し、データセットを 2 つに分割する必要があるかもしれません。繰り返しますが、実行の詳細についてはほとんどわかりません。

どんな入力でも大歓迎です。ありがとう!

4

2 に答える 2

1

この例には3 つの DataSetsが含まれます。3 つの DataSet があるため、3 つの Report.rdlcを1 つのReport.rdlc 使用します。シナリオは単純な生産ラインになります。スターティングマシン、組み立て中のマシン、出荷中のマシンがあります。DataSources

DataSet (.XSD) ファイルの作成方法を知っていることを前提としています。この投稿では、コードをセクションに分割し、最終的な結果を示します。

あなたの質問にとって重要なのは、3 つのデータソースを 1 つのレポートに割り当てる方法です。


宣言

、データベースから収集された情報を保持する3つclsAssemblyStateのカスタム クラスがあります。これらは、オブジェクトとして使用するカスタム クラスです。データを XML にバインドします。以下の「プログラムによる DataTableの入力」セクションで説明するように、プログラムで割り当てます。clsExpeditionStateclsStartState

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 を.rdlc3 つの異なる 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

于 2013-06-03T13:40:57.183 に答える