Report viewer что это за программа
Перейти к содержимому

Report viewer что это за программа

  • автор:

Использование элемента управления WinForms ReportViewer

Чтобы просмотреть отчеты, развернутые на сервере отчетов или отчетах, которые существуют в локальной файловой системе, используйте элемент управления WinForms ReportViewer, чтобы отобразить их в приложении Windows.

Добавление элемента управления ReportViewer в приложение Windows

Screenshot of the Toolbox, highlighting ReportViewer control.

  1. Создайте новое приложение Windows на языке Microsoft Visual C# или Microsoft Visual Basic. -или- Открыть существующий проект приложения Windows и добавить новую форму.
  2. Укажите элемент управления ReportViewer в окне Панель элементов. Если панель элементов не отображается, вы можете получить доступ к ней из меню «Вид«, выбрав панель элементов.
  3. Перетащите элемент управления ReportViewer в область конструктора Windows Form. В форму будет добавлен элемент управления ReportViewer с именем reportViewer1.

После добавления элемента управления в форму появляется смарт-тег Задачи ReportViewer и выводится приглашение выбрать отчет.

Если отчет, который вы хотите просмотреть, развертывается на сервере отчетов, выберите параметр «Отчет сервера>» в раскрывающемся списке «Выбор отчета«.< После выбора параметра "Отчет> сервера» появится еще два свойства: URL-адрес сервера отчетов и путь к отчету.< Свойство URL-адрес сервера отчетов задает адрес сервера отчетов, а свойство Путь к отчету задает полный путь к подготавливаемому к просмотру отчету.

Screenshot of the ReportViewer Tasks smart tag, highlighting the server report.

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

Screenshot of the ReportViewer Tasks smart tag, highlighting the local report.

Просмотр отчетов в режиме удаленной обработки

В следующем примере показано, как отобразить отчет, развернутый на сервере отчетов с помощью элемента управления WinForms ReportViewer. В этом примере используется отчет Sales Order Detail, который включен в проект с образцами отчетов AdventureWorks2022 .

C#

public partial class Form1 : Form < private void Form1_Load(object sender, EventArgs e) < // Set the processing mode for the ReportViewer to Remote reportViewer1.ProcessingMode = ProcessingMode.Remote; ServerReport serverReport = reportViewer1.ServerReport; // Get a reference to the default credentials System.Net.ICredentials credentials = System.Net.CredentialCache.DefaultCredentials; // Get a reference to the report server credentials ReportServerCredentials rsCredentials = serverReport.ReportServerCredentials; // Set the credentials for the server report rsCredentials.NetworkCredentials = credentials; // Set the report server URL and report path serverReport.ReportServerUrl = new Uri("https:// /reportserver"); serverReport.ReportPath = "/AdventureWorks Sample Reports/Sales Order Detail"; // Create the sales order number report parameter ReportParameter salesOrderNumber = new ReportParameter(); salesOrderNumber.Name = "SalesOrderNumber"; salesOrderNumber.Values.Add("SO43661"); // Set the report parameters for the report reportViewer1.ServerReport.SetParameters( new ReportParameter[] < salesOrderNumber >); // Refresh the report reportViewer1.RefreshReport(); > > 

VB.NET

Imports Microsoft.Reporting.WinForms Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load 'Set the processing mode for the ReportViewer to Remote reportViewer1.ProcessingMode = ProcessingMode.Remote Dim serverReport As ServerReport serverReport = reportViewer1.ServerReport 'Get a reference to the default credentials Dim credentials As System.Net.ICredentials credentials = System.Net.CredentialCache.DefaultCredentials 'Get a reference to the report server credentials Dim rsCredentials As ReportServerCredentials rsCredentials = serverReport.ReportServerCredentials 'Set the credentials for the server report rsCredentials.NetworkCredentials = credentials 'Set the report server URL and report path serverReport.ReportServerUrl = _ New Uri("https:///reportserver") serverReport.ReportPath = _ "/AdventureWorks Sample Reports/Sales Order Detail" 'Create the sales order number report parameter Dim salesOrderNumber As New ReportParameter() salesOrderNumber.Name = "SalesOrderNumber" salesOrderNumber.Values.Add("SO43661") 'Set the report parameters for the report Dim parameters() As ReportParameter = serverReport.SetParameters(parameters) 'Refresh the report reportViewer1.RefreshReport() End Sub End Class 

Просмотр отчетов в локальном режиме обработки

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

Добавление отчета «Сведения о заказе на продажу» в приложение Windows

Screenshot of the Solution Explorer, highlighting the Sales Order Detail Report.

  1. Открыть проект Windows, в который будет добавлен отчет.
  2. В меню Проект выберите пункт Добавить существующий элемент.
  3. Перейти в папку, в которой были установлены проекты образцов отчетов AdventureWorks2022 . Скачивание примеров отчета перейдите в примеры отчетов AdventureWorks
  4. Выберите файл Detail.rdl заказа на продажу и нажмите кнопку «Добавить «. Файл «Сведения о заказе на продажу.rdl» теперь станет частью проекта.
  5. Щелкните правой кнопкой мыши файл Sales Order Detail.rdl в обозревателе решений и выберите команду Переименовать. Переименуйте отчет в Сведения о заказах на продажу.rdlc и нажмите клавишу ВВОД. Если Обозреватель решений не отображается, его можно открыть в меню «Вид«, выбрав Обозреватель решений.

Примечание. Переименование расширения файла из RDL в RDLC позволит редактировать отчет с помощью конструктора отчетов для Microsoft Visual Studio 2005.

Screenshot of the Properties window, highlighting the Copy To Output setting.

  • После переименования отчета выберите файл и найдите окно свойств. Для свойства Копировать в выходной каталог задайте значение Копировать более новые. Если окно «Свойства» не отображается, его можно открыть в меню «Вид«, выбрав окно «Свойства».
  • В следующем примере кода создается набор данных для данных заказа на продажу, а затем отображается отчет «Сведения о заказах на продажу» в локальном режиме.

    C#

    public partial class Form1 : Form < private void Form1_Load(object sender, EventArgs e) < // Set the processing mode for the ReportViewer to Local reportViewer1.ProcessingMode = ProcessingMode.Local; LocalReport localReport = reportViewer1.LocalReport; localReport.ReportPath = "Sales Order Detail.rdlc"; DataSet dataset = new DataSet("Sales Order Detail"); string salesOrderNumber = "SO43661"; // Get the sales order data GetSalesOrderData(salesOrderNumber, ref dataset); // Create a report data source for the sales order data ReportDataSource dsSalesOrder = new ReportDataSource(); dsSalesOrder.Name = "SalesOrder"; dsSalesOrder.Value = dataset.Tables["SalesOrder"]; localReport.DataSources.Add(dsSalesOrder); // Get the sales order detail data GetSalesOrderDetailData(salesOrderNumber, ref dataset); // Create a report data source for the sales order detail // data ReportDataSource dsSalesOrderDetail = new ReportDataSource(); dsSalesOrderDetail.Name = "SalesOrderDetail"; dsSalesOrderDetail.Value = dataset.Tables["SalesOrderDetail"]; localReport.DataSources.Add(dsSalesOrderDetail); // Create a report parameter for the sales order number ReportParameter rpSalesOrderNumber = new ReportParameter(); rpSalesOrderNumber.Name = "SalesOrderNumber"; rpSalesOrderNumber.Values.Add("SO43661"); // Set the report parameters for the report localReport.SetParameters( new ReportParameter[] < rpSalesOrderNumber >); // Refresh the report reportViewer1.RefreshReport(); > private void GetSalesOrderData(string salesOrderNumber, ref DataSet dsSalesOrder) < string sqlSalesOrder = "SELECT SOH.SalesOrderNumber, S.Name AS Store, " + " SOH.OrderDate, C.FirstName AS SalesFirstName, " + " C.LastName AS SalesLastName, E.Title AS " + " SalesTitle, SOH.PurchaseOrderNumber, " + " SM.Name AS ShipMethod, BA.AddressLine1 " + " AS BillAddress1, BA.AddressLine2 AS " + " BillAddress2, BA.City AS BillCity, " + " BA.PostalCode AS BillPostalCode, BSP.Name " + " AS BillStateProvince, BCR.Name AS " + " BillCountryRegion, SA.AddressLine1 AS " + " ShipAddress1, SA.AddressLine2 AS " + " ShipAddress2, SA.City AS ShipCity, " + " SA.PostalCode AS ShipPostalCode, SSP.Name " + " AS ShipStateProvince, SCR.Name AS " + " ShipCountryRegion, CC.Phone AS CustPhone, " + " CC.FirstName AS CustFirstName, CC.LastName " + " AS CustLastName " + "FROM Person.Address SA INNER JOIN " + " Person.StateProvince SSP ON " + " SA.StateProvinceID = SSP.StateProvinceID " + " INNER JOIN Person.CountryRegion SCR ON " + " SSP.CountryRegionCode = SCR.CountryRegionCode " + " RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " + " LEFT OUTER JOIN Person.Contact CC ON " + " SOH.ContactID = CC.ContactID LEFT OUTER JOIN" + " Person.Address BA INNER JOIN " + " Person.StateProvince BSP ON " + " BA.StateProvinceID = BSP.StateProvinceID " + " INNER JOIN Person.CountryRegion BCR ON " + " BSP.CountryRegionCode = " + " BCR.CountryRegionCode ON SOH.BillToAddressID " + " = BA.AddressID ON SA.AddressID = " + " SOH.ShipToAddressID LEFT OUTER JOIN " + " Person.Contact C RIGHT OUTER JOIN " + " HumanResources.Employee E ON C.ContactID = " + " E.ContactID ON SOH.SalesPersonID = " + " E.EmployeeID LEFT OUTER JOIN " + " Purchasing.ShipMethod SM ON SOH.ShipMethodID " + " = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" + " S ON SOH.CustomerID = S.CustomerID " + "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)"; SqlConnection connection = new SqlConnection("Data Source=(local); " + "Initial Catalog=AdventureWorks; " + "Integrated Security=SSPI"); SqlCommand command = new SqlCommand(sqlSalesOrder, connection); command.Parameters.Add( new SqlParameter("SalesOrderNumber", salesOrderNumber)); SqlDataAdapter salesOrderAdapter = new SqlDataAdapter(command); salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder"); >private void GetSalesOrderDetailData(string salesOrderNumber, ref DataSet dsSalesOrder) < string sqlSalesOrderDetail = "SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " + " SOD.UnitPrice, CASE WHEN " + " SOD.UnitPriceDiscount IS NULL THEN 0 " + " ELSE SOD.UnitPriceDiscount END AS " + " UnitPriceDiscount, SOD.LineTotal, " + " SOD.CarrierTrackingNumber, " + " SOD.SalesOrderID, P.Name, P.ProductNumber " + "FROM Sales.SalesOrderDetail SOD INNER JOIN " + " Production.Product P ON SOD.ProductID = " + " P.ProductID INNER JOIN " + " Sales.SalesOrderHeader SOH ON " + " SOD.SalesOrderID = SOH.SalesOrderID " + "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " + "ORDER BY SOD.SalesOrderDetailID"; using (SqlConnection connection = new SqlConnection("Data Source=(local); " + "Initial Catalog=AdventureWorks; " + "Integrated Security=SSPI")) < SqlCommand command = new SqlCommand(sqlSalesOrderDetail, connection); command.Parameters.Add( new SqlParameter("SalesOrderNumber", salesOrderNumber)); SqlDataAdapter salesOrderDetailAdapter = new SqlDataAdapter(command); salesOrderDetailAdapter.Fill(dsSalesOrder, "SalesOrderDetail"); >> > 

    VB.NET

    Imports System.Data.SqlClient Imports Microsoft.Reporting.WinForms Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load 'Set the processing mode for the ReportViewer to Local reportViewer1.ProcessingMode = ProcessingMode.Local Dim localReport As LocalReport localReport = reportViewer1.LocalReport localReport.ReportEmbeddedResource = _ "ReportViewerIntro.Sales Order Detail.rdlc" Dim dataset As New DataSet("Sales Order Detail") Dim salesOrderNumber As String = "SO43661" 'Get the sales order data GetSalesOrderData(salesOrderNumber, dataset) 'Create a report data source for the sales order data Dim dsSalesOrder As New ReportDataSource() dsSalesOrder.Name = "SalesOrder" dsSalesOrder.Value = dataset.Tables("SalesOrder") localReport.DataSources.Add(dsSalesOrder) 'Get the sales order detail data GetSalesOrderDetailData(salesOrderNumber, dataset) 'Create a report data source for the sales 'order detail data Dim dsSalesOrderDetail As New ReportDataSource() dsSalesOrderDetail.Name = "SalesOrderDetail" dsSalesOrderDetail.Value = _ dataset.Tables("SalesOrderDetail") localReport.DataSources.Add(dsSalesOrderDetail) 'Create a report parameter for the sales order number Dim rpSalesOrderNumber As New ReportParameter() rpSalesOrderNumber.Name = "SalesOrderNumber" rpSalesOrderNumber.Values.Add("SO43661") 'Set the report parameters for the report Dim parameters() As ReportParameter = localReport.SetParameters(parameters) 'Refresh the report reportViewer1.RefreshReport() End Sub Private Sub GetSalesOrderData(ByVal salesOrderNumber As String, _ ByRef dsSalesOrder As DataSet) Dim sqlSalesOrder As String = _ "SELECT SOH.SalesOrderNumber, S.Name AS Store, " & _ " SOH.OrderDate, C.FirstName AS SalesFirstName, " & _ " C.LastName AS SalesLastName, E.Title AS " & _ " SalesTitle, SOH.PurchaseOrderNumber, " & _ " SM.Name AS ShipMethod, BA.AddressLine1 " & _ " AS BillAddress1, BA.AddressLine2 AS " & _ " BillAddress2, BA.City AS BillCity, " & _ " BA.PostalCode AS BillPostalCode, BSP.Name " & _ " AS BillStateProvince, BCR.Name AS " & _ " BillCountryRegion, SA.AddressLine1 AS " & _ " ShipAddress1, SA.AddressLine2 AS " & _ " ShipAddress2, SA.City AS ShipCity, " & _ " SA.PostalCode AS ShipPostalCode, SSP.Name " & _ " AS ShipStateProvince, SCR.Name AS " & _ " ShipCountryRegion, CC.Phone AS CustPhone, " & _ " CC.FirstName AS CustFirstName, CC.LastName " & _ " AS CustLastName " & _ "FROM Person.Address SA INNER JOIN " & _ " Person.StateProvince SSP ON " & _ " SA.StateProvinceID = SSP.StateProvinceID " & _ " INNER JOIN Person.CountryRegion SCR ON " & _ " SSP.CountryRegionCode = SCR.CountryRegionCode " & _ " RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " & _ " LEFT OUTER JOIN Person.Contact CC ON " & _ " SOH.ContactID = CC.ContactID LEFT OUTER JOIN" & _ " Person.Address BA INNER JOIN " & _ " Person.StateProvince BSP ON " & _ " BA.StateProvinceID = BSP.StateProvinceID " & _ " INNER JOIN Person.CountryRegion BCR ON " & _ " BSP.CountryRegionCode = " & _ " BCR.CountryRegionCode ON SOH.BillToAddressID " & _ " = BA.AddressID ON SA.AddressID = " & _ " SOH.ShipToAddressID LEFT OUTER JOIN " & _ " Person.Contact C RIGHT OUTER JOIN " & _ " HumanResources.Employee E ON C.ContactID = " & _ " E.ContactID ON SOH.SalesPersonID = " & _ " E.EmployeeID LEFT OUTER JOIN " & _ " Purchasing.ShipMethod SM ON SOH.ShipMethodID " & _ " = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" & _ " S ON SOH.CustomerID = S.CustomerID " & _ "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber)" Using connection As New SqlConnection( _ "Data Source=(local); " & _ "Initial Catalog=AdventureWorks; " & _ "Integrated Security=SSPI") Dim command As New SqlCommand(sqlSalesOrder, connection) Dim parameter As New SqlParameter("SalesOrderNumber", _ salesOrderNumber) command.Parameters.Add(parameter) Dim salesOrderAdapter As New SqlDataAdapter(command) salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder") End Using End Sub Private Sub GetSalesOrderDetailData( _ ByVal salesOrderNumber As String, _ ByRef dsSalesOrder As DataSet) Dim sqlSalesOrderDetail As String = _ "SELECT SOD.SalesOrderDetailID, SOD.OrderQty, " & _ " SOD.UnitPrice, CASE WHEN " & _ " SOD.UnitPriceDiscount IS NULL THEN 0 " & _ " ELSE SOD.UnitPriceDiscount END AS " & _ " UnitPriceDiscount, SOD.LineTotal, " & _ " SOD.CarrierTrackingNumber, " & _ " SOD.SalesOrderID, P.Name, P.ProductNumber " & _ "FROM Sales.SalesOrderDetail SOD INNER JOIN " & _ " Production.Product P ON SOD.ProductID = " & _ " P.ProductID INNER JOIN " & _ " Sales.SalesOrderHeader SOH ON " & _ " SOD.SalesOrderID = SOH.SalesOrderID " & _ "WHERE (SOH.SalesOrderNumber = @SalesOrderNumber) " & _ "ORDER BY SOD.SalesOrderDetailID" Using connection As New SqlConnection( _ "Data Source=(local); " & _ "Initial Catalog=AdventureWorks; " & _ "Integrated Security=SSPI") Dim command As New SqlCommand(sqlSalesOrderDetail, _ connection) Dim parameter As New SqlParameter("SalesOrderNumber", _ salesOrderNumber) command.Parameters.Add(parameter) Dim salesOrderDetailAdapter As New SqlDataAdapter(command) salesOrderDetailAdapter.Fill(dsSalesOrder, _ "SalesOrderDetail") End Using End Sub End Class 

    Портативная дистрибуция .Net приложений с отчетами Microsoft Report Viewer и Oracle Instant Client

    Довольно часто возникает необходимость или желание отказаться от создания инсталлятора и совершать дистрибуцию приложения, копируя папку с файлами на целевой компьютер. Если вам интересно как создать портативный дистрибутив .Net приложения с отчетами Report Viewer или как портативно скопировать клиента и драйвера для доступа к базе Oracle, прошу под кат. Я постараюсь все подробно объяснить.

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

    Одним из плюсов портативной дистрибуции клиента Oracle является то, что его стандартная установка — не самое приятное занятие. А если еще устанавливать и Report Viewer, то процесс установки на несколько машин рискует стать утомительным занятием. Конечно же, в качестве альтернативы можно использовать ClickOnce, но при дистрибуции с помощью ClickOnce также вполне можно копировать папку с библиотеками как это делается в данном примере.

    Необходимые библиотеки для десктоп приложения со портативным доступом к Oracle

    Необходимо скачать Oracle Instant Client. Если вы используете локализованное приложение, то лучше вам взять пакет basic, он хоть и занимает размер около 100Mb, но зато, в отличие от «лайтового» (light) 30 мегабайтного, гарантирует вам работу с кириллицей.

    Распаковывает архив и берем из него 2 файлика:

    oci.dll (аббревиатура от Oracle Call Interface);
    orannzsbb11.dll либо orannzsbb12.dll (если вы будете использовать 12-ю версию).

    Необходим еще и третий файлик:

    Если вы взяли версию basic, то это будет — oraociei11.dll или oraociei12.dll (опять же для версии 12).
    Если вы взяли версию light — oraociicus11.dll или oraociicus12.dll (уже не буду упоминать, что второй файл для версии 12 – это и так всем понятно).

    А еще необходим Oracle Data Provider — ODP.NET (лучше взять XCopy версию, — она меньше размером), распаковать и найти 2 файла:

    Oracle.DataAccess.dll;
    OraOps11w.dll или OraOps12w.dll (этот файл необходим Oracle.DataAccess.dll для работы с файлами Oracle Instant Client он одинаковый и для .Net 2.0 и для .Net 4.0).

    Если вы хотите использовать версию 12, можете скачать и Oracle Instant Client и ODP в одном файле ODAC (Oracle Data Access Components) по ссылке: www.oracle.com/technetwork/topics/dotnet/downloads/index.html

    Необходимые библиотеки для приложения со портативным Report Viewer

    В качестве портативной дистрибуции Report Viewer-а возьмем версию 2010.

    Версию 2013 в качестве версии для портативной дистрибуции я не брал. После того, как я обнаружил, что в ней отсутствует Microsoft.ReportViewer.ProcessingobjectModel.dll, у меня произошел «разрыв шаблона» и я решил, что вполне устроят отчеты 2010-го года. Если вы знаете, как создать портативную дистрибуцию версии 2013-го, жду ваших комментариев. Можно было бы даже конкурс объявить, да вот незадача — приза нет.

    Качаем Microsoft Report Viewer Redistributable 2010 и распаковаем exe файл как архив.
    Среди распакованных файлов находим reportviewer_redist2010core.cab.
    Продолжаем «матрешку» и распаковываем в свою очередь и этот файл.
    Находим файлы и переименовываем следующим образом:

    FL_Microsoft_ReportViewer_Common_dll_117718_117718_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8
    переименовываем в Microsoft.ReportViewer.Common.dll

    FL_Microsoft_ReportViewer_Processingobject_125592_125592_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8
    переименовываем в Microsoft.ReportViewer.ProcessingobjectModel.dll

    FL_Microsoft_ReportViewer_WebForms_dll_117720_117720_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8
    переименовываем в Microsoft.ReportViewer.WebForms.dll

    FL_Microsoft_ReportViewer_WinForms_dll_117722_117722_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8
    переименовываем в Microsoft.ReportViewer.WinForms.dll

    Если на компьютере разработчика установлен Oracle Client и Report Viewer (а он должен быть установлен обязательно), ссылки на эти файлы можно даже на задавать, а просто скопировать их в папки с exe (в папки Debug и Release проекта). А вот Oracle.DataAccess.dll необходимо обязательно поместить в папку проекта и установить свойство «Копировать локально» в какой-нибудь из двух вариантов копирования.

    Для того, чтобы страх перед портативной дистрибуцией был не таким большим, опишу вкратце алгоритм поиска библиотеки десктопным .Net приложением.

    Перед тем, как запустить поиск dll система проверяет не загружена ли dll уже в память, а также не присутствует ли dll в списке уже известных dll (попробуйте посмотреть список в реестре по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs).

    Алгоритм поиска dll зависит от некоторых факторов (например, от того, установлен ли режим SafeDllSearchMode), но приблизительно таков (в примере SafeDllSearchMode выключен):

    1. Директория, из которой запускается приложение;
    2. Текущая директория;
    3. Системная директория. Можно использовать функцию GetSystemDirectory для получения пути к этой директории;
    4. 16-ти битная системная директория;
    5. Директория Windows. Можно использовать функцию GetWindowsDirectory;
    6. Папки, которые указаны в системной переменной PATH.

    Что такое системная переменная PATH и где она находится, смотрите наглядно на следующем скриншоте:

    Теперь перейдем к практической части.

    В приложение WPF (а для меня XAML более предпочтителен, чем устаревшие Forms в качестве редактора компоновки) компонент Report Viewer добавляется с помощью элемента управления WindowsFormsHost.

    Чтобы пример не выглядел бесполезным, получим в нем данные из истории документа.
    Для хранения данных, необходимых отчету, создадим класс:

     public class ReportDataSM < public DateTime EventTime < get; set; >public string Doc < get; set; >public string UserName < get; set; >public string NewState < get; set; >> 

    Теперь мы может создать файл шаблона внешнего вида нашего отчета (Для визуального редактора на компьютере разработчика при установке Visual Studio должен быть выбран пункт Microsoft SQL Server Data Tools).

    Добавим в проект файл отчета (Reporting – Отчет). Установим значение свойства «Копировать локально» в «Копировать, если новее». После чего открываем только что созданный файл отчета и заходим на закладку «Источники данных». Кликнем «Добавить новый источник данных», выбираем типом «Объект», в списке объектов раскрываем наш проект и находим в нем наш класс ReportDataSM, который и выделяем:

    Далее для отображения строк с данными добавим в отчет таблицу. При добавлении на запрос свойства набора данных выберем наш источник данных и зададим ему какое-нибудь имя (в примере DataSet1):

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

    Устанавливаем столбцам значения из данных нашего массива (кликая на строки – это просто и интуитивно понятно, объяснять подробно не буду).

    Рассмотрим код

    Так как замораживать интерфейс — это очень плохая практика, выборку данных запустим в отдельном потоке. Для хранения данных используем конкурентную универсальную (generic) коллекцию класса ReportDataSM. Добавим в объявления переменных (в начало класса):

    ConcurrentBag list4R;

    После инициализируем ее где-нибудь в коде:

    list4R = new ConcurrentBag();

    Раз данные мы решили получать, не блокируя интерфейс, для вызова метода асинхронно нам понадобится делегат:

    delegate void MyGetDataDelegate(string s);

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

     void getDataMethod(string docid) < DataSet dataset = new DataSet(); string oradb = "Data Source=" + "DATABASENAME" + ";User typeusernamehere" + ";Password=" + "password123" + ";"; // для того, чтобы не указывать полностью строку подключения к базе, необходимо чтобы в папке клиента Oracle // находился файл TNSNAMES.ORA с данными, необходимыми для подключения к базе. using (OracleConnection conn = new OracleConnection(oradb)) < if (conn.State != ConnectionState.Open) conn.Open(); string sqltext = "select SMDocLog.EVENTTIME, SMDocLog.ID, SMDocLog.USERNAME, NVL(SSDocStates.DOCSTATENAME,'Отправка почтой') as NEWSTATE"; sqltext = sqltext + " from SMDocLog LEFT JOIN SSDocStates"; sqltext = sqltext + " ON SMDocLog.DOCTYPE=SSDocStates.DOCTYPE and SMDocLog.NEWSTATE=SSDocStates.DOCSTATE"; sqltext = sqltext + " WHERE "; sqltext = sqltext + " ORDER BY EVENTTIME DESC"; using (OracleCommand cmd = new OracleCommand()) < cmd.Connection = conn; cmd.CommandText = sqltext; cmd.CommandType = CommandType.Text; using (OracleDataAdapter adapterO = new OracleDataAdapter(cmd)) < using (DataSet ds = new DataSet()) < adapterO.Fill(ds); // извлекаем данные в датасет, а затем считываем их в нашу коллекцию foreach (DataRow dr in ds.Tables[0].Rows) < ReportDataSM rd = new ReportDataSM(); rd.EventTime = Convert.ToDateTime(dr["EVENTTIME"]); rd.UserName = dr["USERNAME"].ToString(); rd.Doc = dr["ID"].ToString(); rd.NewState = dr["NEWSTATE"].ToString(); list4R.Add(rd); >> // end using DataSet > // end using OracleDataAdapter > // end using OracleCommand > > 

    Вызываем этот метод асинхронно с помощью:

     MyGetDataDelegate dlgt = new MyGetDataDelegate(this.getDataMethod); IAsyncResult ar = dlgt.BeginInvoke(txtDocN.Text, new AsyncCallback(CompletedCallback), null); 

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

     void UpdateUserInterface() < _reportViewer.Reset(); ReportDataSource reportDataSource= new ReportDataSource("DataSet1", list4R); // указываем название источника данных отчета и нашу коллекцию в качестве данных _reportViewer.LocalReport.ReportPath = "ReportSM.rdlc"; _reportViewer.LocalReport.DataSources.Add(reportDataSource); _reportViewer.RefreshReport(); >

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

    void CompletedCallback(IAsyncResult result)

    Опять же, для вызова метода асинхронно нам понадобился делегат, который на этот раз не принимает никаких параметров. Добавим его в начало нашего кода:

    private delegate void NoArgDelegate(); 

    Должно получиться примерно такое вот приложение:

    Обновление: ссылка на GitHub проект (используется Oracle.ManagedDataAccess, установленный из менеджера пакетов NuGet)

    Использование контрола ReportViewer в Windows приложниях

    Элемент управления ReportViewer — это элемент управления среды Visual Studio, который можно добавить на веб-страницу в проекте решения ASP.NET или в форму приложения Windows. Этот элемент управления включает возможности обработки и просмотра отчетов непосредственно в приложении. ReportViewer — это элемент управления, который, начиная с Visial Studio 2005, представленный контролом. Иначе, это, в отличии от Crystal Report Viewer, бесплатный редактор отчетов, который автоматически встраивается в среду Visual Web Developer 2005 Express.

    По существу, ReportViewer является наиболее мощным добавлением к таким элементам управления как, GridView, DataList, DetailsView, FormView, Repeater. В ReportViewer отчёты можно создавать с помощью технологии «drag-and-drop» внутри Дизайнера Отчётов (Report Designer), входящего в среду разработки Visual Studio 2005.

    Параграф 2. Источник данных

    В качестве источника данных будем использовать таблицы базы данных. База данных может быть любой, но для простоты изложения выберем наиболее простую — Microsoft Access. Например, создадим простую базу с именем Animals. Последовательность создания базы, для тех, кто по какой либо причине это еще не делал, показана на рисунках 1-5. Действия выполняются после запуска Microsoft Access:

    Рис.1. Создание БД

    Создание таблицы БД:

    Рис.2. Создание таблицы БД

    Задание полей таблицы:

    Рис.3. Задание полей таблицы

    После задания полей таблицы и попытки закрыть окно Table, среда запросит имя файла базы данных. Запишем любое имя, например ThisAnimals.

    Рис.4. Открытие созданной таблицы базы данных

    Кликнем правой кнопкой мышки по имени таблицы базы данных — ThisAnimals — и в открывшейся таблице введем информацию, например такую:

    Рис.5. Заполнение таблицы информацией

    Параграф 3. Создание проекта решения

    Создадим простой Windows проект решения, как мы это делали неоднократно (Меню File/New/Project). Дадим имя проекту RepView, как показано на Рис.6:

    Рис.6. Создание проекта решения

    Поместим на форму два контрола Button и ReportViewer, как показано на Рис.7:

    Рис.7. Добавление рабочих контролов

    Проект создан, но прежде чем заполнять его кодом, отвлечемся на источник информации.

    Параграф 4. Источник данных для отображения

    Нажимаем в правом верхнем углу контрола треугольничек и выбираем пункт Design a new Report (Рис.7.). В появившемся окне редактора ReportViewer, нажимаем кнопку «Add New Source..»(Рис.8.)

    Рис.8. Добавление источника данных

    Прежде чем выбрать DateBase и нажать кнопку Next (Рис.9.), мы можем скопировать файл созданной выше базы данных (файл Animals.mdb) в директорию проекта решения (хотя это и не является обязательным, среда предложит Вам позже выполнить это еще раз, но и там у Вас останется право выбора).

    Рис.9. Добавление источника данных

    Нажимаем кнопку New и далее выбираем DataSource и DataFileName, как показано на Рис.10.

    Рис.10. Добавление DataSource и DataFileName

    В результате выбора получим результат:

    Рис.11. Результат выбора источника данных

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

    Результат мы видим на Рис.12:

    Рис.12. Результат выбора источника данных

    Нажимаем кнопку Finish. Результат выбора источника данных будет иметь вид Рис.13:

    Рис.13. Результат выбора источника данных

    Параграф 5. Отображение данных

    Кликнем мышкой в поле дизайнера Report1.rdlc и в меню View выберем ToolBox. В результате в проекте отобразится ToolBox, с контролами, которые доступны для использования в ReportViewer (Рис.14.). Здесь мы видим все доступные для отображения в ReportViever контролы. Вначале будем использовать таблицу. Перетащим таблицу на панель дизайнера:

    Рис.14. Добавление таблицы в дизайнер ReportViever

    Вновь вернемся на вкладку DtatSource и перетащим поля источника во вторую строку таблицы, как показано на Рис.15.

    Рис.15. Добавление полей отображения в ReportViever

    Мы можем перетащить поля и в третью строку. При этом, по умолчанию, ячейка таблицы будет восприниматься как сумма содержимого ячеек данного столбца:

    =Sum(Fields!Numbers.Value)

    Достаточно кликнуть правой кнопкой мышки по данной ячейке и выбрать пункт «fx Expression. » мы отобразим окно «Edit Expression», где можно подобрать любую другую функцию из множества доступных. Для нашего примера в первой ячейке третьей строки запишем просто слово «Итого».

    Если мы выполним решение на данном этапе, то получим сообщение:

    The sourse on the report difination has not been specified

    Иначе, мы определили структуру отображения, но пока не дали сами данные для отображения. Однако, учитывая, что Visual Studiо сохраняет все при выполнении решения, мы, тем самым сохранили и файл Report1.rdlc, который на данный момент содержит структуру отображения данных и структуру ее источников в виде нашего AnimalsDataSet.

    private void button1_Click(object sender, EventArgs e) < DataSet MyDataSet = new DataSet(); string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; //Там где находится файл базы данных string sBank = @"C:\Bases\Animals.mdb"; string sSql = "Select * from thisanimals"; using (OleDbConnection oleConn = new OleDbConnection(connectionString + sBank)) < try < oleConn.Open(); OleDbCommand olecmd = new OleDbCommand(sSql, oleConn); olecmd.CommandType = CommandType.Text; OleDbDataAdapter da = new OleDbDataAdapter(olecmd); da.Fill(MyDataSet); >catch (Exception/* ex*/) < return; >> reportViewer1.ProcessingMode = ProcessingMode.Local; reportViewer1.LocalReport.ReportEmbeddedResource = "RepView.Report1.rdlc"; this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource( "AnimalsDataSet_ThisAnimals", MyDataSet.Tables[0])); this.reportViewer1.RefreshReport(); >

    Следует особо обратить внимание на то, как заданы ReportEmbeddedResource (RepView.Report1.rdlc) и DataSources — («AnimalsDataSet _ ThisAnimals», MyDataSet.Tables[0]). Нарушение пунктуации приведет к ошибке. Выполним решение и увидим результат (Рис.16.):

    Рис.16. Использование ReportViever для отображения табличных данных

    Теперь добавим контрол Chart со вкладки Tools ReportViewer. И, как показано на Рис.17. перетащим поля в своеобразные ушки контрола, которые появляются при двойном клике мышкой в поле контрола.

    Рис.17. Использование ReportViever для отображения табличных данных

    Кликнем правой кнопкой мышки на контроле Chart и выберем пункт Properties — увидим панель, позволяющую выбрать практически все стандартные диаграммы Microsoft (Word, Excel) и задать множество свойств. Выберем понравившуюся нам диаграмму (Рис.18.).

    Рис.18. Выбор диаграммы

    После нажатия кнопки OK, выполним решение. Результат показан на Рис.19:

    Рис.19. Выбор диаграммы

    Параграф 6. Упрощенный способ отображения данных

    Владимир Розанов (инженер-программист, Полесский государственный университет) прислал письмо:

    Спасибо за статью. Дополнение. Загрузка информации из базы данных ReportViewer может производить без включения программных кодов, как вы предлагаете (через свойства).

    Спасибо Владимиру, именно благодаря ему, мне пришлось продолжить статью. Я вполне согласен с Владимиром, достаточно установить свойства, как показано на Рис.20., и написать код, приведенный ниже, и при загрузке решения на выполнение мы получим тот же результат, что и на Рис.19. Этого во многих случаях, вполне достаточно для выполнения цели создания приложения.

    private void Form1_Load(object sender, EventArgs e)

    Рис.20. Упрощенный способ отображения данных

    Однако, мы, при этом, теряем гибкость отображения. Для каждого использования ReportViewer потребуется создать свой файл ReportEmbeddedResource (RepView.Report1.rdlc, RepView.Report2.rdlc. ). Приведенный же метод позволяет использовать многократно один и тот же файл ReportEmbeddedResource. Простейший пример приводится ниже.

    Параграф 7. Использование одного ReportEmbeddedResource для вывода различных отчетов

    Создадим еще одну таблицу в нашей базе данных (связанную по id с ранее созданной), как показано на Рис.21.

    Рис.21. Создание дополнительной таблицы

    Добавим еще одну кнопку и контрол Label на форму, и будем использовать следующий код (приводится полностью):

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.OleDb; using Microsoft.Reporting.WinForms; namespace RepView < public partial class Form1 : Form < string sSql = string.Empty; public Form1() < InitializeComponent(); >private void Form1_Load(object sender, EventArgs e) < label1.Text = ""; this.ThisAnimalsTableAdapter.Fill(this.AnimalsDataSet.ThisAnimals); this.reportViewer1.RefreshReport(); >private void button1_Click(object sender, EventArgs e) < sSql = "Select * from thisanimals order by id"; label1.Text = "Число зверей в зверинце:"; vLoadData(); > private void button2_Click(object sender, EventArgs e) < label1.Text = "Число сотрудников ухаживающих за животными"; sSql = "Select ta.id as id,ta.name as name,ws.numbers as numbers from thisanimals ta "; sSql +="left join workers ws on ws.id=ta.id order by ta.id"; vLoadData(); > private void vLoadData() < reportViewer1.LocalReport.DataSources.Clear(); DataSet MyDataSet = new DataSet(); string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; string sBank = @"C:\Bases\Animals.mdb"; using (OleDbConnection oleConn = new OleDbConnection(connectionString + sBank)) < try < oleConn.Open(); OleDbCommand olecmd = new OleDbCommand(sSql, oleConn); olecmd.CommandType = CommandType.Text; OleDbDataAdapter da = new OleDbDataAdapter(olecmd); da.Fill(MyDataSet); >catch (Exception/* ex*/) < return; >> reportViewer1.ProcessingMode = ProcessingMode.Local; reportViewer1.LocalReport.ReportEmbeddedResource = "RepView.Report1.rdlc"; this.reportViewer1.LocalReport.DataSources.Add( new ReportDataSource("AnimalsDataSet_ThisAnimals", MyDataSet.Tables[0])); this.reportViewer1.RefreshReport(); > > >

    Цветом выделено предложение Select. Второе из них приводит названия выбираемых полей из двух таблиц к их названиям в созданном нами «AnimalsDataSet.ThisAnimals». Это приведение и позволяет использовать файл «ReportEmbeddedResource» уже созданный нами для отображения новых данных.

    Результат выполнения приложения при поочередном нажатии кнопок 1 и 2 показан на Рис.22:

    Рис.22. Использование одного ReportEmbeddedResource для вывода различных отчетов

    Скачать код примеров

    Распаковав скачанный файл вы найдете одну директорию, с решением, содержащим код последнего примера и файл Animals.mdb. Директорию с решением можно поместить в любое место любого жесткого диска, для последующего его открытия в Visual Studio 2005 и выше. Файл базы данных Animals.mdb должен быть помещен в директорию C:\Bases\, которую Вам придется создать. После этого Вы можете продолжить эксперименты с кодом.

    Молчанов Владислав 25.11.2008г.

    Еcли Вы пришли с поискового сервера — посетите мою главную страничку

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

    Кроме того — на главной странице Вы найдете бесплатные программы : программы комплекса Veles — программы для автолюбителей, программы из раздела графика — программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks — игрушку для детей и взрослых, программу записную книжку, программу TellMe — говорящий Русско-Английский разговорник — программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).

    Скачать Antiplagiat ReportViewer 3.0

    Antiplagiat ReportViewer — бесплатная программа, которая поможет определить степень оригинальности текста и статей. Собственно название программы, уже говорит само за себя, данный продукт создан для того, что бы бороться с плагиатом. Для того, что бы можно было работать с приложением, нужно иметь отчет, составленный авторским сервисом проверки на оригинальность.

    В программу встроен редактор для удобного синтаксического выделения совпадений и редактирования. Все совпадения и сайты с похожими публикациями будут отображены в специально отведенной для этого области. Программа Antiplagiat ReportViewer используя базы индекса всех наиболее популярных им крупных поисковикых систем Сети!

    Надо отметить, что программа использует программную технологию от компании Майкрософт — .NET Framework 3.5. или выше поэтому имеет сравнительно небольшой размер дистрибутива.

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *