Занятие 8. Создание фильтра данных

После добавления к родительскому отчету операции детализации следующий шаг состоит в создании фильтра данных для таблицы данных, которая определена в дочернем отчете.

Для детализированного отчета можно создать фильтр на основе таблицы или фильтр запроса. На этом занятии приведены указания по обоим вариантам.

Фильтр на основе таблиц

Для реализации фильтра на основе таблицы необходимо выполнить следующие задачи.

  • Добавить критерий фильтра к табликсу в дочернем отчете.

  • Создать функцию, которая выбирает нефильтрованные данные из таблицы PurchaseOrderDetail .

  • Добавить обработчик событий, который связывает таблицу данных PurchaseOrderDetail с дочерним отчетом.

Добавление выражения фильтра в табликс в дочернем отчете

  1. Откройте дочерний отчет.

  2. Выберите заголовок столбца в табликсе, щелкните правой кнопкой мыши серую ячейку, которая отображается над заголовком столбца, а затем выберите "Свойства Табликса".

  3. Выберите страницу "Фильтры" и нажмите кнопку "Добавить".

  4. В поле Выражение выберите ProductID из раскрывающегося списка. В этом столбце применяется фильтр.

  5. В раскрывающемся списке=Оператор выберите оператор равенства ( ).

  6. Нажмите кнопку выражения рядом с полем "Значение ", выберите "Параметры " в области "Категория ", а затем дважды щелкните productid в области "Значения ". Поле Задать выражение для: Значение теперь должно содержать выражение, аналогичное =Parameters!productid.Value.

  7. В диалоговом окне Свойства табликса нажмите кнопку ОК , а затем нажмите кнопку ОК еще раз.

  8. Сохраните RDLC-файл.

Создание функции, которая выбирает нефильтрованные данные из таблицы PurchaseOrdeDetail

  1. В Обозреватель решений разверните default.aspx и дважды щелкните Default.aspx.cs.

  2. Создайте новую функцию, которая принимает параметр, называемый productid типа Integer. Он должен возвращать объект datatable и выполнять следующие действия:

    1. Создайте экземпляр набора данных DataSet2, который был создан на шаге 2 урока 4. Определение подключения к данным и таблицы данных для дочернего отчета.

    2. Создайте подключение к базе данных SqlServer для выполнения запроса, определенного в занятии 4. Определение подключения к данным и таблицы данных для дочернего отчета.

    3. Запрос возвращает нефильтрованные данные.

    4. Заполнение экземпляра набора данных нефильтрованными данными путем выполнения запроса.

    5. Возвращает таблицу данных PurchaseOrderDetail .

      Функция должна выглядеть примерно так, как показано в следующем примере (этот пример предназначен только для ссылки. Вы можете следовать любому нужному шаблону, чтобы получить необходимые данные для дочернего отчета).

      /// <summary>  
          /// Function to query PurchaseOrderDetail table, fetch the  
          /// unfiltered data and bind it with the Child report  
          /// </summary>  
          /// <returns>A dataTable of type PurchaseOrderDetail</returns>  
          private DataTable GetPurchaseOrderDetail()  
          {  
              try  
              {  
                  //Create the instance for the typed dataset, DataSet2 which will   
                  //hold the [PurchaseOrderDetail] table details.  
                  //The dataset was created as part of the tutorial in Step 4.  
                  DataSet2 ds = new DataSet2();  
      
                  //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication.  
                  using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2022;Integrated Security=SSPI"))  
                  {  
                      //Building the dynamic query with the parameter ProductID.  
                      SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail ", sqlconn);  
                      //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data.  
                      adap.Fill(ds, "PurchaseOrderDetail");  
                  }  
      
                  //Return the PurchaseOrderDetail table for the Report Data Source.  
                  return ds.PurchaseOrderDetail;  
              }  
              catch  
              {  
                  throw;  
              }  
          }  
      

Добавление обработчика событий, который привязывает Приложение PurchaseOrderDetail DataTable к дочернему отчету

  1. Откройте страницу Default.aspx в представлении конструктора.

  2. Щелкните правой кнопкой мыши элемент управления ReportViewer и выберите пункт Свойства.

  3. На странице Свойства щелкните значок События .

  4. Дважды щелкните событие Детализация .

    Это действие добавляет раздел обработчика событий в код, который должен выглядеть примерно так, как показано в следующем блоке.

    protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
    {  
    }  
    
  5. Завершите подготовку обработчика событий. Он должен выполнять следующие функции.

    1. Выборка ссылки на объект дочернего отчета из параметра DrillthroughEventArgs .

    2. Вызов функции GetPurchaseOrderDetail.

    3. Привязка таблицы данных PurchaseOrderDetail к соответствующему источнику данных отчета.

      Готовый код обработчика событий должен выглядеть примерно так, как показано в следующем примере.

      protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
          {  
              try  
              {  
                   //Get the instance of the Target report.  
                  LocalReport report = (LocalReport)e.Report;  
      
                   //Binding the DataTable to the Child report dataset.  
                  //The name DataSet1 which can be located from,   
                  //Go to Design view of Child.rdlc, Click View menu -> Report Data  
                  //You'll see this name under DataSet2.  
                  report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail()));  
              }  
              catch (Exception ex)  
              {  
                  Response.Write(ex.Message);  
              }  
          }  
      
  6. Сохраните файл.

Фильтр запроса

Для реализации фильтра с запросом необходимо выполнить следующие задачи.

  • Создание функции, которая выбирает фильтрованные данные из таблицы PurchaseOrderDetail .

  • Добавление обработчика событий, который получает значения параметров и связывает таблицу данных PurchaseOrdeDetail с дочерним отчетом.

Создание функции, которая выбирает отфильтрованные данные из таблицы PurchaseOrderDetail

  1. В Обозреватель решений разверните default.aspx и дважды щелкните Default.aspx.cs.

  2. Создайте функцию, которая принимает параметр productidтипа Integer, возвращает объект datatable и выполняет указанные ниже действия.

    1. Создает экземпляр набора данных DataSet2, который был создан на шаге 2 урока 4. Определение подключения к данным и таблицы данных для дочернего отчета.

    2. Создайте подключение к базе данных SqlServer для выполнения запроса, определенного в занятии 4. Определение подключения к данным и таблицы данных для дочернего отчета.

    3. Запрос содержит параметр, productid, чтобы убедиться, что возвращенные данные фильтруются по идентификатору ProductID, выбранному в родительском отчете.

    4. Заполнение экземпляра набора данных фильтрованными данными путем выполнения запроса.

    5. Возвращает таблицу данных PurchaseOrderDetail .

      Функция должна выглядеть примерно так, как показано в следующем примере (этот пример предназначен только для ссылки. Вы можете следовать любому нужному шаблону, чтобы получить необходимые данные для дочернего отчета).

      /// <summary>  
          /// Function to query PurchaseOrderDetail table and filter the  
          /// data for a specific ProductID selected in the Parent report.  
          /// </summary>  
          /// <param name="productid">Parameter passed from the Parent report to filter data.</param>  
          /// <returns>A dataTable of type PurchaseOrderDetail</returns>  
          private DataTable GetPurchaseOrderDetail(int productid)  
          {  
              try  
              {  
                  //Create the instance for the typed dataset, DataSet2 which will   
                  //hold the [PurchaseOrderDetail] table details.  
                  //The dataset was created as part of the tutorial in Step 4.  
                  DataSet2 ds = new DataSet2();  
      
                  //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication.  
                  using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2022;Integrated Security=SSPI"))  
                  {  
                      //Building the dynamic query with the parameter ProductID.  
                      SqlCommand cmd = new SqlCommand("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail where ProductID = @ProductID", sqlconn);  
      
                      // Sets the productid parameter.  
                      cmd.Parameters.Add((new SqlParameter("@ProductID", SqlDbType.Int)).Value = productid);  
      
                      SqlDataAdapter adap = new SqlDataAdapter(cmd);  
                      //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data.  
                      adap.Fill(ds, "PurchaseOrderDetail");  
                  }  
      
                  //Return the PurchaseOrderDetail table for the Report Data Source.  
                  return ds.PurchaseOrderDetail;  
              }  
              catch  
              {  
                  throw;  
              }  
          }  
      

Добавление обработчика событий, который извлекает значения параметров и привязывает Объект DataTable PurchaseOrdeDetail к дочернему отчету.

  1. Откройте страницу Default.aspx в представлении конструктора.

  2. Щелкните правой кнопкой мыши элемент управления ReportViewer и выберите пункт Свойства.

  3. На панели Свойства щелкните значок События .

  4. Дважды щелкните событие Детализация .

    Это действие добавляет раздел обработчика событий в код, который должен выглядеть примерно так, как показано в следующем примере.

    protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
    {  
    }  
    
  5. Завершите подготовку обработчика событий. Он должен выполнять следующие функции.

    1. Выборка ссылки на объект дочернего отчета из параметра DrillthroughEventArgs .

    2. Получение списка параметров дочернего отчета из имеющегося объекта дочернего отчета.

    3. Итерация в коллекции параметров и выборка значения для параметра ProductID, переданного из родительского отчета.

    4. Вызов функции GetPurchaseOrderDetail. и передача значения параметра ProductID.

    5. Привязка таблицы данных PurchaseOrderDetail к соответствующему источнику данных отчета.

      Готовый код обработчика событий должен выглядеть примерно так, как показано в следующем примере.

      protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
          {  
              try  
              {  
                  //Variable to store the parameter value passed from the MainReport.  
                  int productid = 0;  
      
                  //Get the instance of the Target report.  
                  LocalReport report = (LocalReport)e.Report;  
      
                  //Get all the parameters passed from the main report to the target report.  
                  //OriginalParametersToDrillthrough actually returns a Generic list of   
                  //type ReportParameter.  
                  IList<ReportParameter> list = report.OriginalParametersToDrillthrough;  
      
                  //Parse through each parameters to fetch the values passed along with them.  
                  foreach (ReportParameter param in list)  
                  {  
                      //Since we know the report has only one parameter and it is not a multivalued,   
                      //we can directly fetch the first value from the Values array.  
                      productid = Convert.ToInt32(param.Values[0].ToString());  
                  }  
      
                  //Binding the DataTable to the Child report dataset.  
                  //The name DataSet1 which can be located from,   
                  //Go to Design view of Child.rdlc, Click View menu -> Report Data  
                  //You'll see this name under DataSet2.  
                  report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail(productid)));  
              }  
              catch (Exception ex)  
              {  
                  Response.Write(ex.Message);  
              }  
          }  
      
  6. Сохраните файл.

Следующий шаг

Вы успешно создали фильтр данных для таблицы данных, определенной для дочернего отчета. Затем вы создадите и запустите приложение веб-сайта. См . занятие 9. Создание и запуск приложения.