Как разделить значение в datatable по его первичному ключу? - PullRequest
0 голосов
/ 30 января 2020

Я создаю отчет, используя RDL C и Visual Basi c. Я использовал 2 таблицы данных для отображения информации в отчете, один для основного отчета ( DTT ) и еще один для подотчета ( TTT ). У меня есть 2 набора данных в RDL C, которые TFDataset и TSDataset . Мой отчет состоит из 1 производственного заказа ( PO ) в качестве первичного ключа с несколькими задачами в базе данных. В форме я создал Datagridview ( DGW ) для отображения данных из базы данных с флажками и ReportViewer для отображения отчета. Система потоков, DGW показывает список PO, поэтому пользователь может установить несколько флажков в DGW и распечатать выбранные PO в отчете. Выбранное ПО используется для извлечения задачи с помощью SQL и заполнения таблиц данных. PO хранятся в DTT, а задача хранится в TTT. Я использовал FOR EACH l oop для запуска SQL для каждого значения флажка. DTT, используемый для основного отчета, отображает несколько PO правильно с правильным разрывом страницы, но TTT, кажется, отображает список суммированных задач из другого PO, потому что l oop только что добавил задачу в одну и ту же таблицу данных для каждого l oop. Следовательно, проблема заключается в том, как разделить задачу по собственному заказу?

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

введите описание изображения здесь

1 Ответ

0 голосов
/ 03 февраля 2020

Вам необходимо передать идентификатор PO основного отчета в качестве параметра в подотчет. Таким образом, каждый экземпляр подотчета фильтруется по его родительскому идентификатору PO. Взгляните на это https://social.msdn.microsoft.com/Forums/sqlserver/en-US/45c500d9-6de1-473e-b118-d023fc5ba988/ssrs-subreport-parameter-passing-issue

...