Додавання звітів професійної якості у додаток користувача на платформі Visual Studio. NET. Частина 2

Частина 1


Web-служби для XML-звітів


Тепер можна розглянути, як використовується технологія XML Web Services в Crystal Reports for Visual Studio. NET. Значним досягненням у цій галузі є вдала розробка досить складних функцій з легко реалізованими перевагами; наприклад, звіти можуть публікуватися як Web-служби і використовуватися в якості ReportSource для елемента управління CrystalReportViewer.


Щоб створити Web-службу для XML-звітів з файлу CustomersBasic.rpt, відкрийте Visual Studio. NET і створіть новий проект ASP.NET Web Service під ім'ям MSDNCrystalWebService. Видаліть файл Service1.asmx, який додається до проекту за замовчуванням, і замість нього додайте CustomersBasic.rpt. Потім клацніть правою кнопкою миші по CustomersBasic.rpt в Solution Explorer і виберіть у контекстному меню пункт Publish as Web Service (див. Малюнок 10).


Рис. 10.

В результаті до проекту буде доданий файл Web-служби, CustomersBasicService.asmx. Тепер будемо компонувати проект. Поверніться у додаток Windows Forms і встановіть для cvwMain.ReportSource URL-адресу Report Web Service згідно наступному рядку тексту програми:


cvwMain.ReportSource = "http://localhost/MSDNCrystalWebService/" _
& “CustomersBasicService.asmx”


В якості альтернативи ви можете додати веб-посилання для цього asmx-файлу в проекті і потім вказати cvwMain.ReportSource в екземплярі класу Web Service.


cvwMain.ReportSource = New localhost.stomersBasicService()


Чи можна створити інтерфейс XML Web Services в Crystal Reports так само легко, як і Web-службу? Уважно вивчіть програму файлу класу, який розташований з невеликим відступом під файлом CustomersBasic.rpt (Щоб побачити файл, натисніть на кнопку Show All Files в Solution Explorer). У програмі цього файлу містяться два класи: CustomersBasic і CachedCustomersBasic.


CustomersBasic є первинним класом, який необхідний для реалізації суворо типізованого звіту; якщо ви подивитеся на процедури атрибутів цього звіту, то побачите його з усіма розділами, які успадковуються з ReportClass і охоплюють елементи колекції ReportDefinition.Sections. У свою чергу, CachedCustomersBasic реалізує інтерфейс IcachedReports для створення кеш звіту і в своєму методі CreateReport створює екземпляр CustomersBasic (перший клас). За допомогою інтерфейсу, подібного інтерфейсу IcachedReports і використовує WebMethods, можна вивести звіт у вигляді XML Web Service.


Тепер погляньте на програму файлу класу, який розташований під файлом CustomersBasicService.asmx. Цей файл також містить два класи, але, на відміну від попереднього файлу, у ньому один клас вкладений в інший. CustomersBasicService успадковується з класу ReportServiceBase, який, у свою чергу, відкриває веб-методи, необхідні для публікації звіту у вигляді XML Web Service. CustomersBasicService містить клас CachedWebCustomersBasic, який, по своїй суті, має точно таку ж реалізацію, що і вже розглянутий клас CachedCustomersBasic. Різницю можна знайти в конструкторі:


Public Sub New(ByVal webServiceParam As CustomersBasicService)
Me.webService = webServiceParam
End Sub


Цей конструктор викликається з конструктора CustomersBasicService, щоб вказати в ньому атрибут webService кеш звіту:


Public Sub New()
Me.ReportSource = New CachedWebCustomersBasic(Me)
End Sub


Підіб'ємо підсумки: ReportClass в Crystal Report створює можливі суворо типізовані звіти; інтерфейс IcachedReports дозволяє створювати кеш екземпляри ReportClass, і, нарешті, ReportServiceBase створює інтерфейс Web Services для строго типізованих звітів, який завдяки атрибуту webService сумісний з інтерфейсом IcachedReports.


До речі, ви не забули про компонент ServerFileReport, який я створив, перетягнувши з Server Explorer? У ньому також задіюється технологія Web Services. Якщо ви повернетеся до проекту Windows Form, то помітите, що у sfrCustomersBasic є атрибут WebServiceURL вказує на. asmx-файл загального вигляду. Адреса URL буде виглядати приблизно так: localhost / crystalreportwebformviewer / ServerFileReportService.asmx. Незважаючи на те, що цей URL-адресу стандартний, атрибут ReportPathProperty класу sfrCustomersBasic, вказуючи на MSDN CustomersBasic.rpt, задає відносний шлях та ім'я звіту, який потрібно запустити.


З першого погляду здається дивним, що компонент ServerFileReport вимагає запуску звіту через з'єднання HTTP / SOAP з локальним комп'ютером. Проте, завдяки цьому ви можете легко запустити звіти Crystal Reports for Visual Studio. NET, що існують на віддаленому комп'ютері: просто клацніть правою кнопкою миші по вузлу Servers у вікні Server Explorer і виберіть Add Server, потім підключіться до будь-якого сервера у ваших мережах LAN / WAN і запустіть на віддаленому комп'ютері необхідні звіти Crystal Reports for Visual Studio. NET. Дана можливість дозволяє легко розгортати звіти по всьому підприємству: для цього встановіть середовище Visual Studio. NET на сервері і скопіюйте rpt-файли у відповідну папку, після чого ці rpt-файли без будь-якої спеціальної програми стануть доступні для всієї організації (за протоколом SOAP). У цьому випадку вам навіть не потрібно такий відносно простий процес, як вибір пункту "Publish as Web Service", який виконується після клацання правої кнопки миші по звіту в проекті ASP.NET, оскільки все, що вам буде потрібно зробити, так це скопіювати файл у відповідну папку.


Недолік використання операції перетягування об'єктів у Server Explorer полягає в тому, що в ньому можна переглядати тільки ті об'єкти сервера, які постійно перебувають у мережах LAN / WAN розробника, а не за брандмауером. Але тут є одна хитрість: поки відомі адресу URL і значення атрибуту ReportPath при підключеному до мережі Internet сервері (з брандмауером чи ні), ви зможете створити новий екземпляр CrystalDecisions.ReportSource.ServerFileReport і задати у ньому значення цих атрибутів, вказавши їх у програмі.


Інтерфейс SOAP такий зручний і простий, що Crystal Reports for Visual Studio. NET застосовує його в якості оболонки програм сортування для свого більш раннього продукту, сервера Crystal Enterprise. Вузол Crystal Enterprise під Crystal Services в Server Explorer можна використовувати для перегляду звітів, що утримуються на будь-якому сервері Crystal Enterprise в мережі LAN / WAN, а також для використання цих звітів в якості допустимих значень ReportSources для елемента управління CrystalReportViewer при повторному застосуванні SOAP. У цьому випадку звіти Crystal Enterprise будуть доступні для будь-яких підключених до мережі Internet генераторів звітів Crystal Reports for Visual Studio. NET з правильною адресою URL і ідентифікатором об'єкта.


Побудова звітності в клієнтських додатках ASP.NET


До цих пір все, що я зробив на клієнтському комп'ютері, було виконано в додатку Windows Forms, проте звіти можна також представляти і у веб-додатках ASP.NET. На щастя, Crystal Reports for Visual Studio. NET підтримує технологію ASP.NET. Тепер я покажу, як подавати звіти у вигляді документів HTML або документів Acrobat (PDF), використовуючи елемент керування ASP.NET Web Forms CrystalReportViewer. Крім того, я розгляну кешування і використання кеш даних.


Оскільки Web Forms CrystalReportViewer працює аналогічно Windows Forms, виклад основних операцій займе не надто багато часу. Для початку створіть у середовищі Visual Studio. NET нове веб-додаток ASP.NET Web Application і, використовуючи функцію Add Existing Item, додайте в проект CustomersBasic.rpt. Потім задайте розташування даних для звітів, повернувшись до таблиці Customers, і з метою тестування використовуйте вхід з порожнім паролем. Перейменуйте WebForm за умовчанням в ViewReport.aspx і додайте до нього елемент управління Web Forms CrystalReportViewer, задавши для його атрибуту ID значення cvwMain. Оскільки на етапі розробки елемент управління Web Forms CrystalReportViewer не має атрибута ReportSource, слід поставити це атрибут у події Page_Load в ViewReport.aspx наступним чином:


cvwMain.ReportSource = Server.MapPath(“CustomersBasic.rpt”)


Запустивши додаток, переконайтеся в ефективності даної процедури. Цей звіт є чистим HTML-документом незважаючи на те, що в ньому підтримуються функції пошуку, навігації, масштабування і інших елементів управління переглядом (крім печатки – про це мова піде пізніше), хоча і з допомогою переадресації (postback). Можна спробувати і інші способи завантаження звіту, які я вже розглядав: створення звіту з суворо типізованого набору DataSet або з набору DataSet без контролю типів, з збереженої процедури за допомогою ReportDocument або розробника компонентів ServerFileReport і т.п. Можна скопіювати на подію Page_Load в ViewReport.aspx програму, яку я вже використав для налаштування облікової інформації звіту і значень параметрів, а також для маніпулювання об'єктами ADO.NET. Це аналогічно тому, що я вже робив, і я не буду повторюватися, хоча опція ReportDocument вимагає деякого пояснення.


Кеш ReportDocuments


Тепер давайте розглянемо функції Crystal Reports for Visual Studio. NET для кеш-звітів. Перетягніть розробник компонентів ReportDocument на площину розробки ViewReport.aspx і виберіть ProjectName.CustomersBasic з Name: комбінованого списку в діалоговому вікні Choose a ReportDocument, не натискаючи кнопку OK. Зверніть увагу на прапорець "Generate cached strongly typed report" ("Створити кеш суворо типізований звіт ") (див. рис.11).

Рис. 11 Функція кеш звітів

Встановіть цей прапорець. Клацніть по кнопці OK і назвіть створений компонент як ccbMain. Потім, зв'яжіть елемент управління перегляду з цим об'єктом у події Page_Load за допомогою наступного рядка програми:


cvwMain.ReportSource = ccbMain


Перетягніть елементи управління Data Time і Print Time в розділ заголовка сторінки звіту. Ці елементи управління можна знайти у вікні Field Explorer під вузлом Special Fields. Потім запустіть програму і перегляньте звіт. Коли ви його запустіть в перший раз, елементи управління Data Time і Print Time повинні бути однаковими (або ж дуже схожими). Але якщо ви відновите сторінку, то побачите, що Print Time продовжує оновлюватися, а Data Time залишається одним і тим же. Тепер скопіювати поточну адресу URL оглядача в буфер обміну і закрийте оглядач. Відкрийте вікно нового браузера і вставте в нього вказану адресу URL для перегляду звіту в новому сеансі (без перебудови збірки з Visual Studio. NET). Ви побачите, що вихідна тимчасова мітка буде відображатися в Data Time.


Тепер закрийте браузер і поверніться в Visual Studio. NET. Знову перетягніть дизайнер компонентів ReportDocument на площину розробки ViewReport.aspx і виберіть ProjectName.CustomersBasic, знявши прапорець "Generate cached strongly typed report". Клацніть по кнопці OK і назвіть створений компонент як "cbsMain". Після завершення даної операції зв'яжіть елемент управління перегляду зі створеним об'єктом у подію Page_Load, внісши в програму ім'я нового компонента:


cvwMain.ReportSource = cbsMain


Запустивши додаток, перегляньте звіт і обновіть кілька разів сторінку. При цьому ви побачите, як буде змінюватися елемент управління Data Time при кожному оновленні. Ця операція наочно продемонструє вам основна відмінність між кеш і некешірованнимі звітами: кешування дозволяє уникнути зайвих звернень до бази даних, коли вже є необхідні дані.


Коли ви використовуєте атрибути DataDefinition або Database об'єкта cbsMain (екземпляр мого некешірованного ReportDocument) для завдання значень параметрів або атрибутів входу в таблиці, зверніть увагу, що ccbMain (екземпляр кеш ReportDocument) не має таких атрибутів. Як використовувати кеш звіти по відношенню до захищених таблиць і параметризованих збереженим процедур? Ключ лежить в програмі, розташованої за строго типізованого звіту. Знову клацніть по кнопці Show All Files (Показати всі файли) у Solution Explorer, перейдіть до CustomersBasic.rpt і відкрийте позаду нього файл програми. Ви вже були тут, але зараз вам слід відкрити програму для класу CachedCustomersBasic, що міститься в цьому файлі.


Зверніть увагу, що програма створює новий екземпляр некешірованного класу CustomersBasic для свого методу CreateReport, оскільки CachedCustomersBasic насправді містить CustomersBasic. Таким чином, я можу написати настроювану програму у цьому загальнодоступному методі, щоб мати доступ до атрибутів Database і DataDefinition як створеного екземпляра класу CustomersBasic, так і інтерфейсу з захищеними об'єктами бази даних і параметризованих збереженими процедурами. Якщо я застосовую цей метод, то при створенні нового екземпляра кеш звіту буде створюватися відповідний конфігурований примірник некешірованного суворо типізованого звіту.


Тепер перейдіть трохи вниз, щоб побачити забезпечену коментарями програму для іншого важливого методу, GetCustomizedCacheKey. Цей метод генерує унікальний ключ, який визначає, чи буде використовуватися копія кеш звіту для виконання запиту. Якщо ключ збігається з ключем кеш звіту, то буде використовуватися кеш-копія. Якщо не збігається, то дані будуть вибиратися заново.


Якщо ви прибрали з програми коментарі, то спеціальна функція BuildCompleteCacheKey згенерує унікальний ключ для конкретного звіту. Розкоментованим програма, яка у всьому іншому залишена без змін, виконується так само як програма з коментарями. Якщо цей ключ не модифікується, то Crystal Reports неявно використовує алгоритм BuildCompleteCacheKey для створення вашого ключа. Це підходить для багатьох випадків. Але що робити, якщо вам потрібно модифікувати ключ? Припустимо, ви дізналися, що в якийсь момент часу ваші дані значно змінилися. Тоді ви могли б приписати до ключа кеша свій рядок, щоб забезпечити його зміна в цей момент часу або після нього. Наведемо тривіальний приклад: розкоментуйте програму в GetCustomizedCacheKey і вставте перед оператором Return наступний рядок:


key &= DatePart(DateInterval.Minute, Now())


Цей рядок прозволяет генерувати новий ключ кешу в той момент, коли поточний час змінюється на одну хвилину. У події Page_Load класу ViewReport.aspx вкажіть ccbMain для cvwMain.ReportSource, потім запустіть програму і обновіть кілька разів сторінку. При цьому ви побачите зміна в Data Time, які відбуваються, коли хвилинний відлік фактичного часу збільшується на одиницю. Подібним чином можна приписати до ключа кеша значення різних параметрів та інші деталі, пов'язані з даними, щоб уникнути обробки одних і тих же кеш даних при прогонах звіту. Можна створити власний ключ, не просто додаючи деякі рядки до ключа кеша за замовчуванням, але написавши його цілком з самого початку, але цей метод я не буду рекомендувати хоча б тому, що це все одно, що винаходити колесо.


Звичайно, ці зміни в класі суворо типізованих звітів досить корисні, але вони пов'язані з деяким ризиком, оскільки при оновленні звіту Visual Studio. NET намагатиметься переписати файл класу цього звіту і, якщо не вжити відповідних заходів, то ви втратите внесені зміни. Щоб цього уникнути, вам слід створити власний клас, який реалізує IcachedReport з програмою з класу CachedCustomersBasic. Після цього ви зможете створити в ViewReport.aspx, а саме у події Page_Load, екземпляр цього класу і вказати на нього в cvwMain.ReportSource. На Figure 12 показано програму для даного класу (включаючи програму, яка використовує об'єкт ASP.NET Request для завдання значення поля параметра звіту і для додавання цього значення в ключ кеша), а також програма (див. нижче), що демонструє код події Page_Load, який потрібен для її використання.


Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load


Dim mcrMain As New cMSDNCachedReport()
McrMain.ASPRequest = Request
CvwMain.ReportSource = mcrMain
End Sub


Перетворення в формат PDF


Сильна сторона елемента управління Web Forms CrystalReportViewer полягає в тому, що він представляє звіти у вигляді документів HTML, але в цьому і його слабкість. З одного боку, таке подання звітів сприяє максимальної сумісності Crystal Reports for Visual Studio. NET і клієнтських оглядачів, з іншого, мова HTML не передбачає точне постраничное розбиття при виведенні на друк.


Щоб обійти проблеми, пов'язані з друком, слід перетворити звіт у формат Adobe Acrobat (PDF). Ви можете написати досить просту програму ASP.NET, яка дозволила б програмним способом перетворити звіт у формат PDF і потім перенаправила б ваш оглядач на цей файл. Таким чином, користувач може запросити звіт через подію Postback і отримати адресу PDF-версії звіту, яку він буде друкувати. На Figure 13 показана програма, що дозволяє виконати цю операцію. Для простоти я використовую некешірованний об'єкт cbsMain компонента ReportDocument для генерування звіту.


Якщо ви для подання звітів збираєтеся використовувати PDF-файли, вам слід дізнатися про недоліки цього методу. По-перше, щоб задовольнити численним користувачам, ви повинні дати унікальні імена створеним PDF-файлів, а програма на Figure 13 використовує постійну текстовий рядок, тому вона годиться лише для демонстрації запропонованого методу. По-друге, в якийсь момент часу PDF-файли повинні бути остаточно відредаговані, і, залежно від кількості готових звітів на вашому додатку, весь файловий ввід-висновок, пов'язаний зі створенням і доведенням PDF-файлів, може при неправильному управлінні і настройці значно сповільнити функцію масштабованості. При створенні додатків ASP.NET за допомогою Crystal Reports for Visual Studio. NET рекомендується вивчити програму перегляду з боку клієнта і скласти стратегію друку, оскільки у кожної опції є свій набір значущих аргументів "за" і "проти".


Висновок


У цій статті я детально розглянув можливості генератора звітів Crystal Reports for Visual Studio. NET, хоча за її рамками залишилося багато цікавого матеріалу, що вимагає окремого дослідження. Нічого більше не бажаючи, я розраховую на те, що ви після її прочитання усвідомлюєте багатство наданих можливостей і прекрасну інтеграцію цього інструменту с. NET Framework і Visual Studio. NET.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*