如何根据主键分隔数据表中的值?
How to separate value in datatable according to its primary key?
我正在使用 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来分离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
我正在使用 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来分离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