在 C# 中使用循环将数组列表参数传递给 Crystal 报告
Passing array list parameter into Crystal Report using loop in C#
public List<string> _DELIVERYNO;
private void get_INVOICE_DATA_RPT()
{
_DELIVERYNO = new List<string>();
foreach (DataGridViewRow row in grdDNList.Rows)
{
DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
if (Convert.ToBoolean(chk.Value) == true)
if (row.Cells.Count >= 2 && row.Cells[2].Value != null)
{
_DELIVERYNO.Add(row.Cells[2].Value.ToString());
}
}
foreach (var value in list)
{
get_INVOICE_DATA(value);
}
}
从 DataGridView 获取交货编号并存储到列表。
参数从frm1传递给crystal报告OK
private void frmPrinINVOICE_02_Load(object sender, EventArgs e)
{
var rpt = new ReportDocument();
rpt.Load("rptSalesInvoice_02.rpt");
rpt.SetDatabaseLogon(userName2, passWord2, @serverName2, databaseName2);
rpt.Refresh();
crystalReportViewer1.RefreshReport();
foreach (var value in frm1._DELIVERYNO)
{
rpt.SetParameterValue("@DELIVERYNO", value);
}
crystalReportViewer1.ReportSource = rpt;
}
但报表源仅保留最后一次查询 return 的最后数据 DELIVERYNO
示例:DELIVERY No:6425,6758,6927 从 frm1 传递过来。但报告只显示最后一个查询 return by DELIVERY No:6927 .
所以我的问题是如何循环参数但它必须保留所有传递参数的所有数据return(交货编号:6425,6758,6927)
这里是 SQL 存储过程:
PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
@DELIVERYNO nvarchar(50)
AS
select *
from [ENVNDIVDB].[dbo].[IVHead] a
inner join [ENVNDIVDB].[dbo].[IVRecords] b
on a.DELIVERYNO=b.DELIVERYNO
WHERE B.[DELIVERYNO] =@DELIVERYNO
ORDER BY a.DELIVERYNO
我们可以将循环结果存储到临时 table 然后从中取出数据吗?
您的循环会在每次迭代时替换参数值并保留最后一个值。请使用以下代码来获得正确的结果:
你的循环:
foreach (var value in frm1._DELIVERYNO)
{
rpt.SetParameterValue("@DELIVERYNO", value);
}
替换为:
var value = string.Join(",", frm1._DELIVERYNO);
rpt.SetParameterValue("@DELIVERYNO", value);
它将设置参数值:6425,6758,6927
从 frm1
传递 DELIVERY NO
的逗号分隔值并在下面添加 SQL 拆分分隔值
的服务器函数
CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (colA nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
INSERT INTO @Results(colA) VALUES(@SLICE)
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
上次更改您的存储程序
PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
@DELIVERYNO nvarchar(50)
AS
select *
from [ENVNDIVDB].[dbo].[IVHead] a
inner join [ENVNDIVDB].[dbo].[IVRecords] b
on a.DELIVERYNO=b.DELIVERYNO
inner join DBO.Split(@DELIVERYNO,',') c
on B.[DELIVERYNO] = c.[colA]
ORDER BY a.DELIVERYNO
public List<string> _DELIVERYNO;
private void get_INVOICE_DATA_RPT()
{
_DELIVERYNO = new List<string>();
foreach (DataGridViewRow row in grdDNList.Rows)
{
DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
if (Convert.ToBoolean(chk.Value) == true)
if (row.Cells.Count >= 2 && row.Cells[2].Value != null)
{
_DELIVERYNO.Add(row.Cells[2].Value.ToString());
}
}
foreach (var value in list)
{
get_INVOICE_DATA(value);
}
}
从 DataGridView 获取交货编号并存储到列表。
参数从frm1传递给crystal报告OK
private void frmPrinINVOICE_02_Load(object sender, EventArgs e)
{
var rpt = new ReportDocument();
rpt.Load("rptSalesInvoice_02.rpt");
rpt.SetDatabaseLogon(userName2, passWord2, @serverName2, databaseName2);
rpt.Refresh();
crystalReportViewer1.RefreshReport();
foreach (var value in frm1._DELIVERYNO)
{
rpt.SetParameterValue("@DELIVERYNO", value);
}
crystalReportViewer1.ReportSource = rpt;
}
但报表源仅保留最后一次查询 return 的最后数据 DELIVERYNO 示例:DELIVERY No:6425,6758,6927 从 frm1 传递过来。但报告只显示最后一个查询 return by DELIVERY No:6927 .
所以我的问题是如何循环参数但它必须保留所有传递参数的所有数据return(交货编号:6425,6758,6927)
这里是 SQL 存储过程:
PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
@DELIVERYNO nvarchar(50)
AS
select *
from [ENVNDIVDB].[dbo].[IVHead] a
inner join [ENVNDIVDB].[dbo].[IVRecords] b
on a.DELIVERYNO=b.DELIVERYNO
WHERE B.[DELIVERYNO] =@DELIVERYNO
ORDER BY a.DELIVERYNO
我们可以将循环结果存储到临时 table 然后从中取出数据吗?
您的循环会在每次迭代时替换参数值并保留最后一个值。请使用以下代码来获得正确的结果:
你的循环:
foreach (var value in frm1._DELIVERYNO)
{
rpt.SetParameterValue("@DELIVERYNO", value);
}
替换为:
var value = string.Join(",", frm1._DELIVERYNO);
rpt.SetParameterValue("@DELIVERYNO", value);
它将设置参数值:6425,6758,6927
从 frm1
传递 DELIVERY NO
的逗号分隔值并在下面添加 SQL 拆分分隔值
CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (colA nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
INSERT INTO @Results(colA) VALUES(@SLICE)
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
上次更改您的存储程序
PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
@DELIVERYNO nvarchar(50)
AS
select *
from [ENVNDIVDB].[dbo].[IVHead] a
inner join [ENVNDIVDB].[dbo].[IVRecords] b
on a.DELIVERYNO=b.DELIVERYNO
inner join DBO.Split(@DELIVERYNO,',') c
on B.[DELIVERYNO] = c.[colA]
ORDER BY a.DELIVERYNO