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

How to separate value in datatable according to its primary key?

我正在使用 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来分离task呢?

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

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