2014-02-10 4 views
1

Я предоставил radcombobox, чтобы пользователь мог выбрать один или несколько отделов для создания отчета (разработанного asp.net report (RDLC)).Как передать массив в отчет rdlc?

я developeded следующий набор данных:

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) 

enter image description here

enter image description here

Это работает, если пользователь выбирает только один отдел.

, но если пользователь выбирает более одного отдела, кажется, что набор данных не может получить параметр. , например. 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 массива (параметр) в отчет?

спасибо.

ответ

0

Я предлагаю вам решить эту проблему в реализации 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 
0

Лучший способ решить этот вопрос - передать массив значений в виде строки, разделенной запятой (или, если хотите, другого разделителя), а затем разделить ее в отчете. Насколько мне известно, нет более простого способа передать несколько значений в качестве одного параметра в отчет.

0

я создать tmp table.

удалить существующий 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 [email protected]) 
Смежные вопросы