1
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.

The parameters are passed from frm1 to crystal report is 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;       
}

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 . But the report only display last query return by 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)

And here is the SQL store procedure:

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?

0

2 Answers 2

1

Passed Comma Separated Values of DELIVERY NO from frm1 and Add below in SQL Server function that split Separated Values

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 
Sign up to request clarification or add additional context in comments.

2 Comments

where is [colA]?
return Column Name in Split function, it depend upon you RETURNS @Results TABLE (colA nvarchar(4000))
1

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

2 Comments

Maybe I will edit : WHERE B.[DELIVERYNO] =@DELIVERYNO to WHERE B.[DELIVERYNO] =IN(@DELIVERYNO)
Thank you for your help. This is a part of my code. It also works

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.