简体   繁体   English

使用C#中的循环将数组列表参数传递给Crystal Report

[英]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);                   
     }               
 }

Get the Delivery No from DataGridView and store to List. 从DataGridView获取交货编号并存储到列表。

The parameters are passed from frm1 to crystal report is OK 参数从frm1传递给Crystal报告就可以了

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;       
}

But the report source only keep the last data from the last query return by the last DELIVERYNO Example: DELIVERY No: 6425,6758,6927 were passed from the frm1 . 但是报表源仅保留来自最后一个DELIVERYNO的最后一个查询返回的最后一个数据的示例:交付编号:6425,6758,6927是从frm1传递的。 But the report only display last query return by DELIVERY No:6927 . 但是该报告仅显示DELIVERY No:6927返回的最后一个查询。

So my question how to Loop the parameter but it must keep all the data return by all passed parameters (DELIVERY No: 6425,6758,6927) 所以我的问题是如何循环参数,但必须保留所有传递的参数返回的所有数据(交付编号:6425,6758,6927)

And here is the SQL store procedure: 这是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 

Can we store loop result into temp table then get data out from them? 我们可以将循环结果存储到临时表中,然后从中获取数据吗?

Passed Comma Separated Values of DELIVERY NO from frm1 and Add below in SQL Server function that split Separated Values frm1传递传递的DELIVERY NO逗号分隔值,并在下面的SQL Server函数中添加“分隔分隔值”

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

Last Alter your Stored Porcedure 最后更改您的存储过程

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 

Your loop is replacing the parameter value with every iteration and leaving with the last value. 您的循环将用每次迭代替换参数值,并保留最后一个值。 Please use the following code to achieve the correct results: 请使用以下代码获得正确的结果:

Your loop: 您的循环:

foreach (var value in frm1._DELIVERYNO)
{
   rpt.SetParameterValue("@DELIVERYNO", value);
}       

Replace it with: 替换为:

var value = string.Join(",", frm1._DELIVERYNO);
rpt.SetParameterValue("@DELIVERYNO", value);

It will set the parameter with value: 6425,6758,6927 它将参数设置为值: 6425,6758,6927

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM