繁体   English   中英

如何将数组传递给rdlc报告?

[英]How to pass array to rdlc report?

我提供了一个radcombobox,可让用户选择一个或多个部门来生成报告(由asp.net报告(RDLC)开发)。

我开发了以下数据集:

SELECT     c.DeptID, c.Department, b.Course_Name, b.Course_ID, b.Type, b.Ref_Code, b.Exam
FROM         dbo.db_Competency_List AS a INNER JOIN
                      dbo.db_Course AS b ON a.Course_ID = b.Course_ID INNER JOIN
                      dbo.db_Department AS c ON a.Dept_ID = c.DeptID
where a.Dept_ID in (@Para_DID)

在此处输入图片说明

在此处输入图片说明

如果用户仅选择一个部门,则它起作用。

但是如果用户选择多个部门,则似乎数据集无法获取参数。 例如12,33,65,78 ...

码:

    <telerik:RadComboBox ID="rcb_select_dept" runat="server"  DataSourceID="LDS_ddl_dept" DataTextField="Department" AutoPostBack="True" 
           DefaultMessage="Please Select" DataValueField="DeptID" Width="300" CheckBoxes="true" 
           AllowCustomText="true" >
    </telerik:RadComboBox>
       <asp:LinqDataSource ID="LDS_ddl_dept" runat="server" 
           ContextTypeName="dcLRDBDataContext" EntityTypeName="" TableName="db_Departments" OrderBy="Department">
       </asp:LinqDataSource>
       </td>
   </tr>
   </table>

   <br />

   <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="1200px" 
                       Height="800px" Font-Names="Verdana" Font-Size="8pt" 
                       InteractiveDeviceInfos="(Collection)" WaitMessageFont-Names="Verdana" 
                       WaitMessageFont-Size="14pt">
                       <LocalReport ReportPath="Reports\template\RequiredByDepartment.rdlc">
                         <DataSources>
                              <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" 
                                    Name="DS_Content" />           
                              </DataSources>
                       </LocalReport>
                   </rsweb:ReportViewer>
<br />

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" 
    TypeName="LRDBDataSetTableAdapters.vReqByDeptTableAdapter">
    <SelectParameters>
                <asp:Parameter DefaultValue="0" Name="Para_DID" Type="String" />                        
    </SelectParameters>
</asp:ObjectDataSource>

后面的代码:

Protected Sub rtbMenu_ButtonClick(ByVal sender As Object, ByVal e As Telerik.Web.UI.RadToolBarEventArgs) Handles rtbMenu.ButtonClick
    If e.Item.Value = "Generate" Then

        'Get DID
        Dim strCOM_cmb As String = ""

        For i = 0 To rcb_select_dept.CheckedItems.Count - 1
            If rcb_select_dept.CheckedItems(i).Checked = True Then
                strCOM_cmb += rcb_select_dept.CheckedItems(i).Value.ToString & ","
            End If
        Next
        If Left(strCOM_cmb, 1) = "," Then
            strCOM_cmb = Right(strCOM_cmb, Len(strCOM_cmb) - 1)
        End If
        If Right(strCOM_cmb, 1) = "," Then
            strCOM_cmb = Left(strCOM_cmb, Len(strCOM_cmb) - 1)
        End If
        strCOM_cmb = TrimList(strCOM_cmb)

        Dim params(0) As Microsoft.Reporting.WebForms.ReportParameter
        params(0) = New Microsoft.Reporting.WebForms.ReportParameter("Para_DID", strCOM_cmb)
        ReportViewer1.LocalReport.SetParameters(params)

        ObjectDataSource1.SelectParameters("Para_DID").DefaultValue = strCOM_cmb
        ObjectDataSource1.DataBind()

        Preview()
    End If
End Sub

Sub Preview()

    ReportViewer1.Visible = True
    ReportViewer1.LocalReport.Refresh()

End Sub

如何将部门ID数组(参数)传递给报告?

谢谢。

解决此问题的最佳方法是将值的数组作为逗号分隔的字符串(如果需要,也可以使用另一个定界符)传递,然后在报表中将其拆分。 据我所知,没有简单的方法将多个值作为单个参数传递给报表。

我建议您在SQL实现中处理此问题。 只是可选的。

要传递文本参数并希望它可以作为列表使用,应在表中表示它们,然后将查询结果加入表中的该列表。 参见下面的代码:

创建新的表变量并将列表中的每个成员插入表中:

DECLARE @SelectedDeptIds table
(
    DeptID int
)

DECLARE @deptIdTemp varchar(10), @Pos int

SET @Para_DID = LTRIM(RTRIM(@Para_DID))+ ','
SET @Pos = CHARINDEX(',', @Para_DID, 1)

IF REPLACE(@Para_DID, ',', '') <> ''
BEGIN
        WHILE @Pos > 0
    BEGIN
        SET @deptIdTemp = LTRIM(RTRIM(LEFT(@Para_DID, @Pos - 1)))
        IF @deptIdTemp <> ''
        BEGIN
            INSERT INTO @SelectedDeptIds (DeptID) VALUES (CAST(@deptIdTemp AS int))
        END
        SET @Para_DID = RIGHT(@Para_DID, LEN(@Para_DID) - @Pos)
        SET @Pos = CHARINDEX(',', @Para_DID, 1)
    END
END 

下一个代码是将表连接到列表:

SELECT     c.DeptID, c.Department, b.Course_Name, b.Course_ID, b.Type, b.Ref_Code, b.Exam
FROM       dbo.db_Competency_List AS a INNER JOIN
           dbo.db_Course AS b ON a.Course_ID = b.Course_ID INNER JOIN
           dbo.db_Department AS c ON a.Dept_ID = c.DeptID
INNER JOIN @SelectedDeptIds d ON a.Dept_ID = d.DeptID 

我创建一个tmp表。

它首先删除现有的DeptID(其中UserID =谁生成报告),然后在后面的代码中将所选的DeptID和UserID插入到tmp表中。

然后修改数据集:

SELECT     c.DeptID, c.Department, b.Course_Name, b.Course_ID, b.Type, b.Ref_Code, b.Exam, a.RoleType_ID
FROM         dbo.db_Competency_List AS a INNER JOIN
                      dbo.db_Course AS b ON a.Course_ID = b.Course_ID INNER JOIN
                      dbo.db_Department AS c ON a.Dept_ID = c.DeptID
where a.Dept_ID in (SELECT id from dbo.db_tmp_rpt where UserID=@UserID)

暂无
暂无

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

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