簡體   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);                   
     }               
 }

從DataGridView獲取交貨編號並存儲到列表。

參數從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;       
}

但是報表源僅保留來自最后一個DELIVERYNO的最后一個查詢返回的最后一個數據的示例:交付編號:6425,6758,6927是從frm1傳遞的。 但是該報告僅顯示DELIVERY No:6927返回的最后一個查詢。

所以我的問題是如何循環參數,但必須保留所有傳遞的參數返回的所有數據(交付編號: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 

我們可以將循環結果存儲到臨時表中,然后從中獲取數據嗎?

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

最后更改您的存儲過程

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 

您的循環將用每次迭代替換參數值,並保留最后一個值。 請使用以下代碼獲得正確的結果:

您的循環:

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

替換為:

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

它將參數設置為值: 6425,6758,6927

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM