Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Разное »

Обсудить на форуме Обсудить на форуме

SQL Server 2000 Reporting Services

Введение.

Изначально я решил писать данную статью весьма основательно. С длинным предисловием и рассуждением о том, зачем нам это надо и какие открываются перед нами перспективы использования этого грандиозного продукта. Перечитав все, что я написал и поймав себя на мысли, что исписав около пяти листов, я продвинулся лишь к середине процесса инсталляции. И почему-то мне стало скучно.  А каково же будет читателю? В общем, одним махом я удалил весь написанный мною текст и решил писать поменьше текста не «по теме». Тем, кто захочет очень основательно изучить этот продукт, я бы посоветовал книгу издательства Wrox с одноименным названием.

Что мы можем получить?

Получить мы можем намного больше того, что я сумею описать в данной статье. Но лично я преследую вполне конкретную цель. Мне нужна быстрая, и не очень трудоемкая возможность создавать отчеты менеджерам БД, которые постоянно выдают отчеты клиентам. Кроме того необходимо иметь возможность тем же менеджерам через удобный интерфейс отправить клиенту какой либо отчет. Давайте попробуем поработать в этом направлении.

Кратко о возможностях RS.

На самом деле меня приятно удивил необходимый функционал. После инсталляции RS я получил следующее. Во-первых, консоль управления RS осуществляется либо через Web интерфейс IIS сервера, на который вы этот продукт установили, либо через командную строку.

Web интерфейс позволит Вам настроить различные права доступа к тем или иным группам отчетов. Поможет с тем, чтобы загрузить уже готовые отчеты в формате RDL (Report Data Language). Также Вы будете иметь возможности для создания собственных ролей. Вы сможете привязать записи из Active Directory к определенным ролям.

Немаловажная деталь - через все тот же Web интерфейс, вы сможете настроить определенные, периодически выполняемые процессы, как-то: операции отправки отчета на печать или на E-Mail в определенном формате, например: Excel, Pdf, HTML и т.д.

По календарным настройкам процессы для RS (Jobs) не уступают процессам самого MS SQL Server Agent.

Создавать и разрабатывать файлы отчетов, правда, Вы сможете только через Visual Studio .Net в которой добавился новый, соответствующий проект.  Вам будет предоставлен удобный интерфейс. Что немаловажно, по крайней мере, для меня, тем людям, кто привык работать с дизайнером построения SQL запросов, он будет предоставлен. Т.е. для построения простейших отчетов вполне применимы знания, накопленные при работе в MS Access.

Дизайнер отчетов весьма разнообразен. Не буду сравнивать возможности Crystal Reports, но я в дизайнере нашел все, что мне было нужно.

Весьма широка Web служба (Web Services) для RS. Большой набор методов позволит Вам использовать большинство (если не все) возможностей минуя Web интерфейс.

И последняя, не маловажная деталь заключается в том, что есть возможность обновлять исправленный отчет или добавлять новый отчет прямо из VS .Net (Deploy) минуя Web интерфейс.

Инсталляция.

Инсталляция проходит довольно быстро и без особых проблем. Требуется обязательное наличие SP3 для Вашего MS SQL Server. Ну а в остальном - стандартные для MS SQL Server требования. Да, чуть не забыл - требуется наличие работающего IIS.

Пробуем использовать.

Ну что же – я не думаю, что у Вас возникнут проблемы при инсталляции.

Как меня уведомили в конце инсталляции, я могу зайти по адресу http://localhost/Reports и перейти к настройкам моего RS. 

Вот отсюда начинается настройка моего RS. Здесь я могу создавать папки и назначать им различные права доступа. Здесь же я могу создать шаблоны соединений с данными, к которым я буду подключать свои отчеты. Я не буду показывать, как это делается, я лишь продемонстрирую результат, взяв примеры поставляемые вместе с RS. Закладка Properties позволит Вам настроить  права доступа для просмотра текущей папки. Здесь все просто и трудностей у Вас с этим возникнуть не должно. Я загружу пару отчетов и соединение. И вот что я буду иметь в результате:

Если просто загрузить Файлы и не настроить у отчетов DataSource – то они естественно вежливо попросят Вас это сделать, выдав вот такое сообщение: «The report server cannot process the report. The data source connection information has been deleted. (rsInvalidDataSourceReference)»
Исправить это недоразумение мы можем зайдя на закладку Properties в том же окне, в котором получили сообщение об ошибке и выбрав слева пункт Data Source увидим стандартные возможности для подключения. Напротив кнопочки Browse мы увидим вот такую красную строку: «The shared data source reference is no longer valid»  И действительно кликнув на нее, мы увидим, что у нас не существует этих самых подключений для доступа. Зайдя на титульную страницу и создав подключение вот с такими параметрами:

Хотелось бы отметить тот факт, что Вам необходимо создать подключение с Credentials параметрами. Иначе Вы просто не сможете использовать часть функционала системы (например: подписку на репорт или создать календарный план запуска отчета), и она будет Вам постоянно об этом напоминать. Итак, мы настроили подключение и в свойствах отчетов выбрали Shared Data Source, который у нас должен был появиться. Еще раз осуществив попытку просмотра отчета получаем картинку:

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

Создание и развертывание при помощи Visual Studio .Net.

Теперь хочется попробовать сделать что-нибудь свое. Для этого запускаем VS .Net. При создании нового проекта мы видим появившийся раздел под названием Business Intelligence Project, в котором есть два пункта: Report Project Wizard и обычный Report Project. Я воспользовался «мастером» и на первой странице получил всю информацию о том, что мне предстоит настроить, пройдя последовательно по всем шагам. А именно:

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

Начнем с настройки источника данных.  Интересно то, что мы можем сделать источник разделяемым и здесь же настроить строку соединения:

И что особенно любопытно, мы можем здесь же настроить и все Credentials:

Далее идет стандартный интерфейс Query Builder. В нем вы можете как самостоятельно «нарисовать» запрос, так и написать его вручную. Кроме того, на закладках данного мастера есть возможность выбрать различные представления (views) и/или функции. Возьмем стандартное представление под названием “Product Sales of 1997”.

На следующем шаге мне предоставляется возможность выбрать тип отчета  между Tabular и Matrix типами. Стандартный preview будущего отчета можно увидеть тут же. Я выбрал тип Matrix.

Далее мне предложили сконструировать отчет. Т.е. что будет в шапке отчета, что будет в качестве строк и столбцов. А так же «детали» отчета.  Когда вы находитесь в том или ином блоке, мастер любезно подскажем Вам куда вы размещаете свои данные:

После чего Вам предлагается стиль отчета. Я выбрал Bold. После этого наступил немаловажный шаг, на который стоит обратить внимание. Это так называемый deployment location (путь развертывания).

Проект, который мы конструируем, позволит нам полностью отойти от Web интерфейса настройки отчетов. Это открывает большие перспективы для создания и тестирования отчетов offline и лишь после утверждения их правильности развертывание их на сервере RS.

 

И наконец Вам предлагается ввести наименование только что созданного отчета, с возможностью просмотра всех настроенных шагов. Включаем Preview и нажимаем Finish.

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

Вы можете сходить по ссылке http://localhost/Reports и убедится, что этот отчет не виден среди отчетов, созданных нами ранее.

С закладками, отвечающими за дизайн и данные, я думаю, Вы разберетесь сами и без труда.  Последнее на что я хотел бы обратить Ваше внимание, это Deploy созданного отчета на RS. Для этого Вам необходимо нажать правую клавишу в дереве проекта на отчете, который Вы хоттели бы развернуть на сервере и выбрать пункт Deploy.

После чего, если мы зайдем на http://localhost/Reports, то мы увидим образовавшуюся папочку с названием проекта в котором есть соединение Northwind и собственно сам отчет и выглядит он следующим образом :

 

На этом этап создания отчета в VS.Net можно считать законченным. В дизайн построения отчетов drilldown я сейчас углубляться не буду. В пакете примеров идущим с RS есть примеры построения подобных отчетов.

RS Web Service и некоторые дополнительные возможности.

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

Давайте рассмотрим некоторые из них. Для этого создадим проект. Так как я больше работаю с Windows Forms то я и создам его для WF. После чего просмотрим Web Services на локальном компьютере при помощи мастера добавления References Web Service.

Даже при беглом просмотре web-методов видно, что практически весь функционал RS доступен через этот интерфейс. Вы можете управлять задачами (task) и работами (job), вы можете настраивать временные диапазоны (sheduling) и конфигурировать роли (roles).

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

#region [ Using ]
using System;
using System.ComponentModel;
using System.Windows.Forms;
using TestRSWebService.RServ;
#endregion

namespace TestRSWebService
{
	/// <summary>Форма Form1</summary>
	public class Form1 : Form
	{
		#region [ vars ]
		private ReportingService rs;
		private Button buttonGet;
		private System.Windows.Forms.Label labelGet;
		private System.Windows.Forms.ComboBox comboBoxReports;
		private System.Windows.Forms.Label labelReports;
		private Container components = null;
		#endregion

		#region [Конструктор]
		public Form1()
		{
			InitializeComponent();
			rs = new ReportingService();
			// Установим Credentials для текущего залогиненого юзера
			rs.Credentials = System.Net.CredentialCache.DefaultCredentials;  
			// Установим URL для нашего 
			this.rs.Url = this.labelGet.Text + "/ReportService.asmx";	
		}
		#endregion

		#region dispose
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}
		#endregion

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.buttonGet = new System.Windows.Forms.Button();
			this.labelGet = new System.Windows.Forms.Label();
			this.comboBoxReports = new System.Windows.Forms.ComboBox();
			this.labelReports = new System.Windows.Forms.Label();
			this.SuspendLayout();
			// 
			// buttonGet
			// 
			this.buttonGet.Anchor = ((System.Windows.Forms.AnchorStyles)(
			(System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
			this.buttonGet.Location = new System.Drawing.Point(200, 235);
			this.buttonGet.Name = "buttonGet";
			this.buttonGet.TabIndex = 0;
			this.buttonGet.Text = "Получить";
			this.buttonGet.Click += new System.EventHandler(this.buttonGet_Click);
			// 
			// labelGet
			// 
			this.labelGet.Anchor = ((System.Windows.Forms.AnchorStyles)(((
			(System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
			| System.Windows.Forms.AnchorStyles.Left) 
			| System.Windows.Forms.AnchorStyles.Right)));
			this.labelGet.Location = new System.Drawing.Point(15, 20);
			this.labelGet.Name = "labelGet";
			this.labelGet.Size = new System.Drawing.Size(265, 15);
			this.labelGet.TabIndex = 1;
			this.labelGet.Text = "http://localhost/reportserver";
			this.labelGet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
			// 
			// comboBoxReports
			// 
			this.comboBoxReports.Location = new System.Drawing.Point(5, 65);
			this.comboBoxReports.Name = "comboBoxReports";
			this.comboBoxReports.Size = new System.Drawing.Size(280, 21);
			this.comboBoxReports.TabIndex = 2;
			// 
			// labelReports
			// 
			this.labelReports.Anchor = ((System.Windows.Forms.AnchorStyles)((
			(System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
			| System.Windows.Forms.AnchorStyles.Right)));
			this.labelReports.Location = new System.Drawing.Point(5, 45);
			this.labelReports.Name = "labelReports";
			this.labelReports.Size = new System.Drawing.Size(275, 15);
			this.labelReports.TabIndex = 3;
			this.labelReports.Text = "Отчеты";
			this.labelReports.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(292, 266);
			this.Controls.Add(this.labelReports);
			this.Controls.Add(this.comboBoxReports);
			this.Controls.Add(this.labelGet);
			this.Controls.Add(this.buttonGet);
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);

		}
		#endregion

		#region The main()
		/// <summary>The main entry point for the application</summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}
		#endregion

		#region [ Обработка ]
		private void buttonGet_Click(object sender, EventArgs e)
		{
			CatalogItem[] items;
			try
			{
				items = rs.ListChildren("/", true); // получаем список объектов по данному пути
				this.comboBoxReports.Items.Clear(); // Очистка comboBox
				
				foreach(CatalogItem i in items)
					if (i.Type == ItemTypeEnum.Report) // фильтруем тип для отчетов
						this.comboBoxReports.Items.Add(new ReportItem(i.Name, i.Path));

				this.comboBoxReports.DisplayMember = "Name";
				this.comboBoxReports.ValueMember = "Path";
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
			}
		}
		#endregion
	}
	// Helper class
	public class ReportItem
	{
		private string reportName;
		private string reportPath;
		
		public ReportItem(string reportName, string reportPath)
		{
			this.reportName = reportName;
			this.reportPath = reportPath;
		}
		public string Name { get { return this.reportName;} }
		public string Path { get { return this.reportPath;} }
	}
}
  

Если Вы все сделали правильно, то в результате Вы получите следующее приложение:

Немного покопавшись с WS RS, напрашивается вывод, что весь WEB интерфейс RS построен как раз на этом самом сервисе. А это значит что все богатство данной службы доступно Вам в ваших проектах.

Вкратце Мы рассмотрели основные достоинства данного сервиса. То что на него стоит обратить внимание подсказывает уже и то, что в следующей версии MS Sql  - служба Reporting Service встроена на уровне ядра и будет являться его неотъемлемой частью.

Удачи Вам в ваших экспериментах.

С уважением Serg Vorontsov aka V©R©N. voron@aspnetmania.com


Может пригодится:


Автор: Serg Vorontsov
Прочитано: 4410
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру