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

Для розуміння статті потрібне знання середовища Visual Studio. NET.

Анотація


Генератор звітів Crystal Reports for Visual Studio .NET пропонує комплексне рішення з організації звітності для. NET-розробників, яке повністю інтегрується з такими операційними середовищами, як Visual Studio .NET IDE і.NET Framework. Crystal Reports підтримує технології ADO.NET і XML Web Services, серверні ASP.NET елементи управління та кешування. Він "бесшовно" інтегрується з Visual Studio. NET Server Explorer, набором інструментальних засобів і середовищем розробки. Crystal Reports має багату модель програмування і має в своєму розпорядженні гнучкими можливостями налаштування і розгортання звітів. Перераховані основні можливості Crystal Reports, як і інші, що розглядаються тут, дозволяють виконувати складну рутинну роботу над поданням даних в додатках користувача.


Використовуючи технології Microsoft, розробники довго і тісно співпрацювали з Crystal Reports ще під час впровадження Visual Basic 1.0. Тепер, з появою платформи. NET та Visual Studio. NET, Crystal Reports знову встановив стандарт для інтеграції сторонніх програмних продуктів з інструментальними засобами Microsoft. Генератор звітів Crystal Reports for Visual Studio. NET був розроблений спільно з інженерами Microsoft з метою найбільш повної інтеграції Crystal Reports з операційними середовищами. NET Framework і Visual Studio. NET. Він виконує функції вбудованого розробника, що дозволяє створювати нові звіти, імпортувати будь-які існуючі звіти Crystal Reports (або звіти даних на мові Visual Basic 6.0) у форматі. rpt, а також надає ряд інших можливостей, які будуть описані нижче.


У цій статті я спочатку розгляну процедуру створення додатку Windows Forms, потім технологію ASP.NET Web Service і побудова клієнтського додатка ASP.NET. Попутно я розповім про деякі корисні прийомах програмування для вирішення таких завдань, як створення документів Acrobat (PDF) з наявних звітів, формування звітів на базі параметризованих збережених процедур SQL Server передача звітів за допомогою облікових даних поточного користувача бази даних. Завантажуваний приклад програми для цієї статті містить програми Windows Forms, ASP.NET Web Forms і ASP.NET Web Services.


Простий звіт


Почнемо з чого-небудь простого. Я створю звіт з таблиці Customers (Клієнти) бази даних SQL Server Northwind і відкрию його у додатку Windows Forms. Для цього потрібно створити новий додаток для Windows в Visual Studio. NET. (Я буду працювати з мовою Visual Basic, хоча ця концепція стерпна на будь-яку мову. NET.) Після того, як додаток буде створено, клацніть правою кнопкою миші по імені проекту у вікні Solution Explorer і виберіть у контекстному меню Add / Add New Item (Додати / Додати новий елемент). Потім в списку шаблонів Templates діалогового вікна Add New Item виберіть Crystal Report, вкажіть у рядку Name звіт CustomersBasic.rpt і клацніть по кнопці Open (див. рис. 1).

Рис. 1. Створення простого звіту


Після того, як відкриється діалогове вікно Crystal Report Gallery, ви можете прийняти установки за замовчуванням (радіокнопка Using the Report Expert і рядок Standard) і клацнути по кнопці OK. Коли відкриється діалогове вікно Report Expert, перейдіть до гілки OLE DB (ADO) деревовидного списку на вкладці Data. У діалоговому вікні OLE DB (ADO) виберіть Microsoft OLE DB Provider for SQL Server, вкажіть сервер SQL Server та інформацію для входу в цей сервер, потім виберіть базу даних Northwind і клацніть по кнопці Finish. Поверніться до діалогового вікна Standard Report Expert, відкривши вузол Northwind ієрархічного дерева, перейдіть до вузла Tables, потім двічі клацніть по вузлу Customers. На вкладці Fields клацніть по кнопці Add All, щоб додати до свого звіту поля таблиці Customers. Далі, переконайтеся в тому, що на вкладці Style для створюваного звіту зазначений відповідний заголовок у полі Title і обраний стиль в списку Style, потім клацніть по кнопці Finish.


Після цього активується розробник Crystal Reports for Visual Studio. NET і з'явиться створений звіт. Також з'явиться вікно Field Explorer, зістикований з вікнами Server Explorer і Toolbox. В останньому з них знаходиться палітра Crystal Reports. Крім того, у лівому верхньому куті панелі інструментів Visual Studio. NET з'явиться панель інструментів Crystal Reports.


Я скористаюся цим звітом для ілюстрації прикладів, що містяться в цій статті. В якості першого прикладу розглянемо відображення звіту у вікні. Виконати це досить легко. Просто перенесіть CrystalReportViewer з палітри Windows Forms вікна Toolbox в середу розробника для форми за замовчуванням в проекті і встановіть для атрибута Name значення cvwMain, для атрибута Dock значення Fill, для атрибута ReportSource – мій звіт (використовуючи опцію Browse) і потім запустіть програму. Після того, як я спроектують звіт, увійшовши до бази даних з порожнім паролем, цей звіт відразу з'явиться на екрані. При наявності непорожньої пароля для відображення звіту буде потрібно знову увійти до бази даних. Далі я покажу, як написати невелику програму, що автоматизує вхід до бази даних, за допомогою якої користувачі, які вже пройшли процедуру аутентифікації, не будуть повторно входити в базу даних для запуску звітів.


Строго типізовані звіти


Тепер, коли я коротко виклав основні принципи створення простих звітів, давайте перейдемо до більш складних питань. Подібно до того, як створюються суворо типізовані набори DataSets зі своїми атрибутами і методами, можна створити суворо типізовані звіти. За своєю суттю всі звіти, створені за допомогою Crystal Reports і Visual Studio. NET, складають клас строго типізованих звітів в якості побічного продукту самого процесу розробки. Щоб у цьому переконатися, клацніть по кнопці Show All Files (Показати всі файли) у Solution Explorer, перейдіть за ієрархічним дереву до CustomersBasic.rpt і переконайтеся в існуванні файлу класу, створеного Visual Studio. NET. Я можу створити екземпляр цього класу в програмі і призначити його атрибуту ReportSource об'єкта CrystalReportViewer, що міститься в моїй формі. Для цього я додам наступний рядок тексту програми до події форми Load (встановивши атрибут ReportSource форми cvwMain в None в першому вікні Properties).

cvwMain.ReportSource = New CustomersBasic()


Подібно суворо типізовані розділами DataSets, які використовують розробник компонентів DataSet, суворо типізовані звіти також мають відповідний розробник компонентів. Якщо клацнути по палітрі компонентів Components вікна Toolbox в Visual Studio. NET, з'явиться об'єкт під назвою ReportDocument. Перетягнувши його на свою форму, ви побачите ім'я класу вашого звіту в спадному списку Name діалогового вікна Choose a ReportDocument. Виберіть його і клацніть по кнопці OK. Ви отримаєте виконуваний доступний екземпляр класу вашого звіту. Перейменуйте цей об'єкт в cbsMain (cbs є префіксом CustomersBasic) і замініть наступним рядком тексту програми в подію форми Load:

cvwMain.ReportSource = cbsMain


Якщо ви зараз знову запустіть додаток, то ваш звіт запуститься, як і раніше. Цей запуск відрізняється від попереднього тим, що, не посилаючись на конкретний файл, що знаходиться в конкретному фізичному місці, ReportViewer звертається безпосередньо до об'єкта, який може виступати в якості примірника, отриманого з відповідного класу в збірці програми, зовнішньої збірці або, як ви побачите далі, в XML Web Service.


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






Dim tbCurrent As CrystalDecisions.CrystalReports.Engine.Table
Dim tliCurrent As CrystalDecisions.Shared.TableLogOnInfo

For Each tbCurrent In cbsMain.Database.Tables
tliCurrent = tbCurrent.LogOnInfo
With tliCurrent.ConnectionInfo
.ServerName = “localhost”
.UserID = “ReportUser”
.Password = “msdn”
.DatabaseName = “Northwind”
End With
tbCurrent.ApplyLogOnInfo(tliCurrent)
Next tbCurrent

Рис. 2. Запис Crystal Reports в базу даних


У програмі на малюнку 2 я довільно задав сервер, ідентифікатор користувача та пароль, тобто localhost, ReportUser і msdn відповідно. У більшості додатків вам, імовірно, доведеться використовувати глобальні змінні або атрибути класу, або навіть змінні сеансу у випадку прикладення ASP.NET, щоб у будь-який момент можна було пред'явити ім'я бази даних і облікові дані користувача вашої програми, введені при первісній реєстрації. Зверніть увагу на цикл For Each в програмі. Оскільки в моєму звіті міститься тільки одна таблиця, цей цикл за великим рахунком необов'язковий (я міг би просто зробити посилання на cbsMain.Database.Tables (0)), проте, ця програма буде працювати з будь-яким звітом Crystal Reports for Visual Studio. NET, тому я вважав за краще його залишити, зробивши програму більш функціональною.


Server Explorer


Тепер розглянемо інші способи конфігурації елементів управління об'єкта CrystalReportViewer. Одним з таких способів на етапі розробки є використання провідника Server Explorer. У зв'язку з останніми змінами в. NET Framework дана функція генератора звітів Crystal Reports for Visual Studio. NET некоректно встановлюється інсталятором Visual Studio. Щоб її налаштувати і продовжити виконання наступних кроків, описаних у статті, переконайтеся, що всі права доступу для папки Crystal Reports в каталозі Visual Studio. NET встановлені і здійснюється повне управління користувальницької середовищем ASPNET. (До речі, за умовчанням ця папка знаходиться в C: Program FilesMicrosoft Visual Studio. NETCrystal Reports). Перевірити права доступу можна за допомогою вкладки Security у вікні властивостей папки. Щоб відкрити вкладку Security, користувачі Windows XP повинні вибрати пункт меню Tools / Folder Options у вікні Explorer, клацнути по вкладці View і зняти прапорець "Use simple file sharing", який є останнім пунктом у списку Advanced settings. Після виконання цих кроків всі наступні кроки повинні виконуватися коректно.


Клацніть по вузлу Servers ієрархічного дерева, потім по вузлу з ім'ям вашого локального комп'ютера, далі по розташованому під ним Crystal Services і, нарешті, по Server Files. Під цим вузлом з'являться дві папки, у кожній з яких будуть міститися декілька файлів звітів (див. рис.3). Будь-який з цих. Rpt-файлів можна перетягнути в середу розробника форми, який завершить створення об'єкта розробника компонентів ServerFileReport, що вказує на правильний. rpt-файл. Тепер нашим наступним кроком буде встановлення зв'язку між цим об'єктом і вашим звітом.

Рис. 6. Створення збереженої процедури за допомогою Visual Studio. NET

Щоб створити звіт з збереженої процедури (присвоївши параметру @ CustPattern довільне значення "A"), я змінив текст події форми Load (див. приклад на малюнку 7).




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

Dim scmCustomersSP As New SqlClient.SqlCommand(“spCustomers”, _
scnNorthwind)
scmCustomersSP.CommandType = CommandType.StoredProcedure
scmCustomersSP.Parameters.Add(“@CustPattern”, “A”)

Dim sdaCustomersSP As New SqlClient.SqlDataAdapter (scmCustomersSP)
Dim dsReport As New DataSet()
sdaCustomersSP.Fill(dsReport, “Customers”)

cbsMain.SetDataSource(dsReport)
cvwMain.ReportSource = cbsMain

End Sub

Рис. 7. Модифікований OnLoad Event

У цій програмі не використовується жоден з тих об'єктів, які були створені на етапі розробки, за винятком об'єкта scnNorthwind. Суттєвим є і те, що в цій програмі також не використовується примірник dsNorthwind суворо типізованого набору DataSet в якості джерела даних для звіту. Замість нього я застосував об'єкт ADO.NET DataSet без контролю типів і з ім'ям dsReport. Це надзвичайно важливо не дивлячись на те, що цей звіт розроблений для строго типізованого набору DataSet. Під час запуску звіту в якості джерела даних буде задано універсальний об'єкт DataSet без контролю типів, структура якого відповідає структурі примірника dsNorthwind. Коли буде потрібно викликати метод Fill об'єкта DataAdapter, я буду використовувати переобумовлених версію, яка повинна прийняти якесь табличне ім'я. Щоб гарантувати структурний відповідність dsReport і dsNorthwind, я поставлю для цього табличного імені ім'я Customers. Якщо я цього не зроблю, то на екрані з'явиться звіт без будь-яких даних.

Звіт можна створити не тільки на основі таблиці бази даних, як це було продемонстровано в першому прикладі, але і на основі збереженої процедури. Для установки значення параметра в програмі потрібна певна команда, яка зачіпає об'єкти, атрибути і методи в різних просторах імен генератора звітів Crystal Reports for Visual Studio. NET. Розглянемо це більш детально.

Щоб збережені процедури можна було вибирати в якості джерел даних, потрібно налаштувати генератор звітів Crystal Reports for Visual Studio. NET. Для цього клацніть правою кнопкою миші по порожній області у площині розробки звіту і виберіть у контекстному меню пункт Designer / Default Settings. У діалоговому вікні Default Settings відкрийте вкладку Database, перевірте, чи встановлено прапорець Stored Procedures в розділі Show, і клацніть по кнопці OK.

Потім клацніть правою кнопкою миші по площині розробки звіту і виберіть у контекстному меню пункт Database / Set Location. Спустіться за ієрархічним дереву Replace With до вузла OLE DB (ADO), ще раз клацніть правою кнопкою миші, щоб відкрилося діалогове вікно OLE DB (ADO), і введіть всю необхідну інформацію для підключення до вашої копії бази даних SQL Server Northwind. Повернувшись до діалогового вікна Set Location, розгорніть вузол Northwind, потім вузол Stored Procedures і виберіть вузол spCustomers; 1. У комбінованому списку Current Data Source вкажіть Customers, клацніть по кнопці Replace і потім по кнопці Close.

Тепер, коли ви налаштували цей звіт – який був спочатку розроблений на основі таблиці Customers бази даних Northwind і перетворений для використання суворо типізованого набору даних як джерела даних – ви можете використовувати для отримання даних збережену процедуру spCustomers. Оскільки spCustomers є параметризованих збереженої процедурою, генератор звітів Crystal Reports for Visual Studio. NET автоматично додасть у ваш звіт поле для параметрів Crystal Reports з іменем параметра збереженої процедури. Щоб у цьому переконатися, розгорніть у вікні Field Explorer вузол Parameter Fields. Справа під ним ви побачите поле з параметром @ CustPattern (див. мал.8).

Рис. 8. Параметри

Тепер ви можете встановити cvwMain.ReportSource як на етапі розробки, так і в самій програмі, вказавши на rpt-файл або на примірник cbsMain розробника компонентів ReportDocument. При запуску програми генератор звітів Crystal Reports for Visual Studio. NET автоматично відкриє діалогове вікно, запитуюча значення параметра @ CustPattern. Введіть будь-яку вподобану вам рядок, щоб генератор звітів підключав тільки тих клієнтів, у яких значення поля CompanyName буде починатися з цього рядка.

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




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

Dim pvCustPattern As New CrystalDecisions.Shared.ParameterValues ()
Dim pdvCustPattern As New _
CrystalDecisions.Shared.ParameterDiscreteValue()

pdvCustPattern.Value = “A”
pvCustPattern.Add(pdvCustPattern)
cbsMain.DataDefinition.ParameterFields _
(“@CustPattern”).ApplyCurrentValues(pvCustPattern)

cvwMain.ReportSource = cbsMain

End Sub

Рис. 9. Призначення параметрів

Щодо цієї програми необхідно зробити ряд зауважень. Мені не зовсім зрозуміло, чому параметрами T-SQL можна привласнити тільки одне значення, в той час як полях параметрів генератора звітів Crystal Reports for Visual Studio. NET присвоюється сукупність значень. Враховуючи цей факт, я побудував таку сукупність значень, яка складається тільки з одного елемента, і надав йому значення "A". У результаті ця програма створює не тільки pvCustPattern, екземпляр об'єкту CrystalDecisions.Shared.ParameterValues, який допускає використання кількох значень, а й pdvCustPattern, примірник класу CrystalDecisions.Shared.ParameterDiscreteValue, який допускає використання тільки одного значення. Програма присвоює рядок "A" атрибуту Value для pdvCustPattern і завантажує його в pvCustPattern за допомогою методу підсумовування. Потім pvCustPattern присвоюється полю параметра @ CustPattern допомогою методу ApplyCurrentValues, а екземпляр CustomersBasic присвоюється атрибуту ReportSource в засобі відображення звітів. Хоча ця програма може здатися дещо зім'ятою, вона, тим не менш, працює.

Частина 2

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


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

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

Ваш отзыв

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

*

*