如何根据数据表的主键分隔值?

问题描述 投票:0回答:1

我正在使用RDLC和Visual Basic创建报告。我使用了2个数据表来显示报告中的信息,其中一个用于主报告(DTT),另一个用于子报告(TTT)。我在RDLC中有2个数据集,分别是TFDatasetTSDataset。我的报告包含1个生产订单(PO)作为主键,并且数据库中有多个任务。在一个表单中,我创建了一个Datagridview(DGW),用于显示带有复选框的数据库中的数据,以及一个ReportViewer,以显示报告。流程系统是DGW显示PO列表,因此用户可以从DGW选中多个复选框,然后将选择的PO打印到报告中。所选的PO用于使用SQL检索任务并填写到数据表中。 PO存储在DTT中,任务存储在TTT中。我使用FOR EACH循环为每个复选框值运行SQL。用于主报表的DTT可以正确显示多个PO,并具有适当的分页符,但是TTT似乎显示了来自其他PO的堆叠任务列表,因为该循环只是将任务添加到每个循环的同一数据表中。因此,问题在于如何根据其自己的PO分离任务?

Private Sub GenerateReport()

        For Each row As DataGridViewRow In DataGridView1.Rows

            Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkbox").Value)

            If isSelected Then

                Dim opt As QrCodeEncodingOptions = New QrCodeEncodingOptions
                opt.DisableECI = True
                opt.CharacterSet = "UTF-8"
                opt.Width = 250
                opt.Height = 250

                Dim writer As New BarcodeWriter()
                writer.Format = BarcodeFormat.QR_CODE
                writer.Options = opt

                Dim qr = New BarcodeWriter()
                qr.Options = opt
                qr.Format = BarcodeFormat.QR_CODE
                Dim Result = New Bitmap(qr.Write(imdata.Rows(row.Index)(1).ToString))

                Dim stream As New IO.MemoryStream
                Result.Save(stream, Imaging.ImageFormat.Bmp)

                connect.Open()
                Dim insert As New SqlCommand("update POTB set t_qrcd = @t_qrcd, t_pfno = @t_pfno, t_dtpr = @t_dtpr where t_pdno = '" + imdata.Rows(row.Index)(0).ToString + "'", connect)
                insert.Parameters.Clear()
                insert.Parameters.Add("@t_pfno", SqlDbType.NVarChar).Value = Upf
                insert.Parameters.Add("@t_qrcd", SqlDbType.Image).Value = stream.ToArray()
                insert.Parameters.Add("@t_dtpr", SqlDbType.DateTime).Value = Date.Now
                insert.ExecuteNonQuery()

                Dim command As New SqlCommand("select t_pdno, t_item , t_dsca, t_qrdr, FORMAT(t_rdld,'dd/MM/yyyy') as t_rdld, t_opro, t_mark, t_qrcd, t_repr, t_pfno, FORMAT(t_dtpr,'dd/MM/yyyy hh:mm:ss tt') as t_dtpr FROM POTB                                           
                                               where t_pdno = '" + imdata.Rows(row.Index)(1).ToString + "'", connect)
                Dim adapter As New SqlDataAdapter(command)
                adapter.Fill(DTT)
                Dim rds As New ReportDataSource("TFDataSet", DTT)

                Dim task As New SqlCommand("  select ttirou1022201.t_tano, ttirou0032201.t_dsca, ttirou1022201.t_opno from ttisfc0012201
                                              join ttcibd0012201 on ttcibd0012201.t_item = ttisfc0012201.t_mitm
                                              join ttirou1022201 on ttirou1022201.t_mitm = ttisfc0012201.t_mitm and ttirou1022201.t_opro = ttisfc0012201.t_opro
                                              join ttirou0032201 on ttirou0032201.t_tano = ttirou1022201.t_tano
                                              where ttisfc0012201.t_pdno = '" + imdata.Rows(row.Index)(1).ToString + "' and ttisfc0012201.t_mitm = '" + imdata.Rows(row.Index)(2).ToString + "'
                                              order by ttirou1022201.t_opno asc", connect)
                Dim taskap As New SqlDataAdapter(task)
                taskap.Fill(TTT)

                ReportViewer1.LocalReport.DataSources.Add(rds)
                connect.Close()

            End If

        Next

        list.Add(TTT)
        AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf SetSubDataSource

        ReportViewer1.RefreshReport()

    End Sub

enter image description here

sql vb.net rdlc
1个回答
0
投票

您需要将主报告PO ID作为参数传递给子报告。这样,子报表的每个实例都将为其父PO ID进行过滤。看看这个https://social.msdn.microsoft.com/Forums/sqlserver/en-US/45c500d9-6de1-473e-b118-d023fc5ba988/ssrs-subreport-parameter-passing-issue

© www.soinside.com 2019 - 2024. All rights reserved.