我正在使用RDLC和Visual Basic创建报告。我使用了2个数据表来显示报告中的信息,其中一个用于主报告(DTT),另一个用于子报告(TTT)。我在RDLC中有2个数据集,分别是TFDataset和TSDataset。我的报告包含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
您需要将主报告PO ID作为参数传递给子报告。这样,子报表的每个实例都将为其父PO ID进行过滤。看看这个https://social.msdn.microsoft.com/Forums/sqlserver/en-US/45c500d9-6de1-473e-b118-d023fc5ba988/ssrs-subreport-parameter-passing-issue