- •Минобрнауки россии
- •2011 Г. Минобрнауки россии
- •Им. В.И.Ульянова (Ленина)” (сПбГэту) ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- •Реферат
- •Введение
- •1 Обзор и анализ программных технологий разработки web-приложений для аналитической обработки данных
- •1.1 Технологии оперативной аналитической обработки данных
- •1.2 Технологии аналитической обработки данных Microsoft sql Server
- •Sql dso
- •PivotTable Service, ole db for olap и ado md
- •Клиенты аналитических служб.
- •Analysis Manager
- •Приложения Microsoft Office
- •1.3 Технологии аналитической обработки данных в среде .Net
- •2 Постановка задачи дипломного проекта
- •3 Разработка многомерных моделей данных для построения olap-кубов по международному научно-техническому и образовательному сотрудничеству вузов России
- •3.1 Анализ инфологической модели базы данных
- •3.3 Многомерная модель данных для построения olap-куба по международному научно-техническому сотрудничеству вузов и научных организаций России
- •4 Разработка интерфейса web-приложения для аналитической обработки данных
- •5 Разработка программного обеспечения web-приложения для аналитической обработки данных
- •5.1 Реализация подключения к источнику данных
- •5.2 Реализация получения данных из источника аналитических данных
- •5.3 Пространство имен System.Web
- •5.4 Пространство имен System.Data
- •6. Экономическое обоснование дипломного проекта.
- •6.1 Концепция
- •6.2 Трудоемкость выполнения работ
- •6.3 Определение себестоимости проведения нир
- •6.4 Экономическая эффективность проекта
- •6.5 Рентабельность
- •6.6 Качественная оценка
- •6.7 Выводы
- •8 Охрана интеллектуальной собственности
- •8.1 Интеллектуальная собственность
- •8.2 Программа для эвм
- •8.3 Правообладатель
- •Лицензионный договор на использование программы для эвм
- •1 Термины и их определение
- •2 Предмет Договора
- •3 Обеспечение Договора
- •4 Усовершенствования
- •5 Платежи
- •6 Защита передаваемых прав
- •7 Ответственность Сторон и разрешение споров
- •8 Срок действия Договора и условия его расторжения
- •9 Заключительные положения
- •10 Адреса Сторон
- •Прошунин и.С. Спбгэту в.М. Кутузов Заключение
- •Список используемых источников
9 Заключительные положения
9.1 Все изменения и дополнения к настоящему Договору действительны только в тех случаях, если они совершены в письменной форме и подписаны обеими Сторонами.
9.2 Стороны не имеют права передавать свои права и обязательства по настоящему Договору третьим лицам без письменного согласия на то другой Стороны.
9.3 Во всем остальном, что не предусмотрено условиями настоящего Договора, будут применяться нормы законодательства Российской Федерации.
10 Адреса Сторон
10.1 ЛИЦЕНЗИАР: Прошунин Иван Сергеевич, адрес: 194355, г. Санкт-Петербург, Суздальский проспект, д. 5, корп. 1, кв. 264
10.2 ЛИЦЕНЗИАТ: СПБГЭТУ, адрес: 197376, Санкт-Петербург, ул. Проф. Попова, д. 5.
Настоящий Договор составлен в двух экземплярах для каждой из Сторон и подписан “5” июня 2011 г. в г. Санкт-Петербурге.
ЛИЦЕНЗИАР: ОТ ЛИЦЕНЗИАТА:
Ректор
Прошунин и.С. Спбгэту в.М. Кутузов Заключение
В дипломном были проекте решены следующие задачи:
Разработаны многомерные модели данных для построения OLAP-кубов с целью оптимизации данных, увеличения скорости обработки пользовательских запросов, повышения гибкости системы, приобретения важного для анализа данных свойства многомерности, то есть возможности представления анализируемых фактов как функций от большого числа их характеризующих параметров.
Разработан пользовательский интерфейс, позволяющий формировать структуру OLAP-куба в виде, соответствующем потребностям оператора. Реализованные формы оптимизированы под запросы пользователя, интуитивно понятен их функционал, результаты работы приложения выводятся в графической форме в виде таблиц и гистограмм.
Разработано программное обеспечение при поддержке технологии ADOMD.NET, позволяющее реализовать подключение и формирование запросов на языке MDX к разработанным OLAP-кубам. На основе платформы .NET, а точнее с использованием технологии ASP.NET был разработан пользовательский интерфейс в виде web-приложения.
Реализована работа приложения в среде интернет для возможности многопользовательского доступа к данным из любой точки мира без необходимости дополнительной установки клиентского программного обеспечения и настройки соединения с базой.
Тестирование разработанного программного обеспечения осуществлялось в разных интернет обозревателях, среди которых Opera, Mozilla firefox, Google Chrome, Internet Explorer.
Список используемых источников
Троэлсен Э. Язык программирование C# 2005 и платформа .NET 2.0. – М.: Вильямс, 2007. – 1168 c.
Мак-Дональд М., Шпушта М. Microsoft ASP.NET 2.0 с примерами на C# – М.: Вильямс, 2007. – 1408 c.
Малик С. Microsoft ADO.NET 2.0 – М.: Вильямс, 2007. – 560 c.
Виейра Р. Программирование баз данных Microsoft SQL Server 2005 – М.:Диалектика, 2007. – 832 c.
http://www.zedgraph.org
http://www.sourceforge.net/projects/zedgraph/
http://www.microsoft.com/downloads/details.aspx?FamilyId=7287252C-402E-4F72-97A5-E0FD290D4B76&displaylang=en
http://www.lowagie.com/iText/
http://www.itextsharp.sourceforge.net/
Lowagie B. iText in Action. Creating and Manipulating PDF – NY.:Manning, 2007. – 686 p.
http://msdn2.microsoft.com/en-us/library/aa213568(office.11).aspx
http://msdn2.microsoft.com/en-us/library/aa141155(office.10).aspx
Гражданский Кодекс Российской Федерации от 30.11.94 г. № 51-ФЗ. Ч. 1 // Российская газета №238-239 от 08.12.94 г.
Гражданский Кодекс Российской Федерации от 18.12.2006 г. № 230-ФЗ. Ч. 4 // Российская газета №289 от 22.12.2006 г.
ПРИЛОЖЕНИЕ А. Листинг кода приложения на примере реализации обработчика «сводные данные по исполнителям»
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.AnalysisServices.AdomdClient;
using System.Text;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Collections;
using WebOLAP.Utils.Collection;
using Microsoft.Office.Interop.Owc11;
using System.Drawing;
using System.Security.Cryptography;
namespace WebOLAP
{
public partial class SymmeryByExecutive : System.Web.UI.Page
{
#region Members
/// <summary>
/// Список содержащий значения измерений
/// </summary>
List<DimentionItem> dimentionTable = new List<DimentionItem>();
#endregion
protected void Page_Load(object sender, EventArgs e)
{
// загружаем измерения куба
using (AdomdConnection conn = new AdomdConnection(@"Data Source=SOHATIK;Initial Catalog=FoodMart 2000;ConnectTo=8.0"))
{
// открываем соединение
conn.Open();
// выбираем куб
CubeDef mcube = conn.Cubes["SummeryByExecutive"];
// перебираем все измерения куба
foreach (Dimension dim in mcube.Dimensions)
{
if (!this.IsPostBack)
{
if (dim.Name != "Measures")
{
this.ddlAxisX.Items.Add(dim.Name);
this.ddlAxisY.Items.Add(dim.Name);
}
}
// перебираем значения измерений
foreach (Hierarchy h in dim.Hierarchies)
{
// просматриваем уровни иерархии
foreach (Level lv in h.Levels)
{
if (lv.LevelNumber == 0 && dim.Name != "Measures")
{
continue;
}
// заносим в хештайбл, для того чтобы можно было вывести во второй список
dimentionTable.Add(new DimentionItem(dim.Name, lv.Name, lv.UniqueName, false));
int counter = 10;
foreach (Member mem in lv.GetMembers())
{
counter--;
if (counter < 0)
{
break;
}
if (dim.Name == "Measures")
{
if (!this.IsPostBack)
{
this.ddlMeasures.Items.Add(mem.Name);
}
}
dimentionTable.Add(new DimentionItem(dim.Name, mem.Name, mem.UniqueName, true));
}
}
}
}
}
}
// Метод события при выборе измерения по оси Х
protected void ddlAxisX_SelectedIndexChanged(object sender, EventArgs e)
{
this.ddlAxisXHaracteries.Items.Clear();
foreach (DimentionItem dim in this.dimentionTable)
{
if (this.ddlAxisX.Text == dim.DimentionName)
{
this.ddlAxisXHaracteries.Items.Add(dim.MemberName);
}
}
}
/// Метод события при выборе измерения по оси Y
protected void ddlAxisY_SelectedIndexChanged(object sender, EventArgs e)
{
this.ddlAxisYHaracteries.Items.Clear();
foreach (DimentionItem dim in this.dimentionTable)
{
if (this.ddlAxisY.Text == dim.DimentionName)
{
this.ddlAxisYHaracteries.Items.Add(dim.MemberName);
}
}
}
/// Событие при нажатии на кнопку "Сформировать"
protected void btnGo_Click(object sender, EventArgs e)
{
#region Результат в виде таблицы
// ПРИМЕР ЗАПРОСА
//select [Год].[Год].Members on 0,
//[Вид вуза].[Название].Members on 1
//from SymmeryByRegionCube2
//where [Measures].[Финансирование]
// Найдем объекты описывающие измерения
DimentionItem dimAxisX = null;
DimentionItem dimAxisY = null;
DimentionItem dimMeasures = null;
foreach (DimentionItem dim in this.dimentionTable)
{
if (dim.DimentionName == this.ddlAxisX.Text && dim.MemberName == this.ddlAxisXHaracteries.Text)
{
dimAxisX = dim;
}
else if (dim.DimentionName == this.ddlAxisY.Text && dim.MemberName == this.ddlAxisYHaracteries.Text)
{
dimAxisY = dim;
}
else if (dim.DimentionName == "Measures" && dim.MemberName == this.ddlMeasures.Text)
{
dimMeasures = dim;
}
}
// Должны быть инициализирвоаны всегда, если нет- то ошибка
if (dimAxisX == null || dimAxisY == null || dimMeasures == null)
{
//Ошибка
}
// Формируем запрос к данным куба.
// Синтаксис MDX
string queryText = string.Empty;
// Опередеяем в выбранных параметрах, имеется ли срез по измерениям.
// Если есть, то строим запрос по варианту с о срезом, иначе строим запрос для всех значений
if (dimAxisX.IsLastSheet || dimAxisY.IsLastSheet)
{
queryText = string.Format("SELECT @{0}# ON COLUMNS ,@{1}# ON ROWS FROM SummeryByExecutive WHERE {2}",
dimMeasures.MemberScheme,
!dimAxisX.IsLastSheet ? dimAxisX.MemberScheme + ".Members" : dimAxisX.MemberScheme,
dimAxisY.MemberScheme);
queryText = queryText.Replace("@","{").Replace("#","}");
}
else
{
queryText = string.Format("SELECT {0}.Members ON 0,{1}.Members ON 1 FROM SummeryByExecutive WHERE {2}",
dimAxisX.MemberScheme,
dimAxisY.MemberScheme,
dimMeasures.MemberScheme);
}
DataTable resultsInTable = null;
using (AdomdConnection conn = new AdomdConnection(@"Data Source=SOHATIK;Initial Catalog=FoodMart 2000;ConnectTo=8.0"))
{
// открываем соединение
conn.Open();
AdomdCommand command = new AdomdCommand();
command.CommandType = CommandType.Text;
command.Connection = conn;
command.CommandText = queryText;
resultsInTable = new DataTable();
AdomdDataAdapter dataAdapter = new AdomdDataAdapter(command);
dataAdapter.Fill(resultsInTable);
//преобразование колонок
for(int i=0; i<resultsInTable.Columns.Count;i++)
{
DataColumn dtColumn = resultsInTable.Columns[i];
string colName = string.Empty;
string baseName = "current_";
if(!BaseDataList.IsBindableType(dtColumn.DataType))
{
colName = dtColumn.ColumnName;
dtColumn.ColumnName = baseName + i.ToString();
DataColumn col = new DataColumn(colName, System.Type.GetType("System.String"), "Convert(" + dtColumn.ColumnName + ", 'System.String')");
resultsInTable.Columns.Add(col);
}
}
// если данные идут с нулями, то есть в валюте, то надо убрать последние 4ре нудя
for (int j = 0; j < resultsInTable.Rows.Count; j++)
{
DataRow row = resultsInTable.Rows[j];
string str = null;
for(int k=0; k<resultsInTable.Columns.Count;k++)
{
str = row[k].ToString();
if (string.IsNullOrEmpty(str))
{
continue;
}
if (str.EndsWith("0000"))
{
row[k] = str.Substring(0, str.Length - 4);
}
}
}
this.gvDataView.DataSource = resultsInTable;
this.gvDataView.DataBind();
#endregion
#region Результат в виде гистограммы
ChartSpace barChartspace = new ChartSpaceClass();
ChChart barChart = barChartspace.Charts.Add(0);
barChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered;
barChart.HasLegend = true;
barChart.HasTitle = true;
barChart.Title.Caption = "Аналитическая гистограмма";
barChart.Axes[0].HasMajorGridlines = true;
barChart.Axes[0].HasTitle = true;
barChart.Axes[0].Title.Caption = this.ddlAxisY.Text;
barChart.Axes[1].HasTitle = true;
barChart.Axes[1].Title.Caption = this.ddlMeasures.Text;
barChart.PlotArea.Interior.Color = "White";
barChart.PlotArea.Interior.SetPatterned(ChartPatternTypeEnum.chPattern80Percent, "White", "Black");
barChart.Legend.Position = ChartLegendPositionEnum.chLegendPositionTop;
// формируем значения измерений по оси Х
string stdCategory = string.Empty;
Dictionary<string, string> stdTypesValues = new Dictionary<string, string>(); ;
// сбор категории
for (int i = 0; i < resultsInTable.Rows.Count; i++)
{
DataRow row = resultsInTable.Rows[i];
stdCategory = string.Concat(stdCategory, row[0].ToString(), ",");
}
// сбор типов
for (int i = 1; i < resultsInTable.Columns.Count; i++)
{
DataColumn col = resultsInTable.Columns[i];
if (!col.Caption.StartsWith("current"))
{
//сбор значений
string stdValues = string.Empty;
for (int k = 1; k < resultsInTable.Rows.Count; k++)
{
DataRow row = resultsInTable.Rows[k];
stdValues = string.Concat(stdValues, string.IsNullOrEmpty(row[i].ToString()) ? "0" : row[i].ToString(), ",");
}
if (stdValues.Length > 0)
{
stdValues = stdValues.Substring(0, stdValues.Length - 1); // убираем последную запятую
}
stdTypesValues.Add(col.Caption, stdValues);
}
}
stdCategory = stdCategory.Substring(0, stdCategory.Length - 1); // убираем последную запятую
int idx = 0;
foreach (KeyValuePair<string,string> item in stdTypesValues)
{
barChart.SeriesCollection.Add(idx);
barChart.SeriesCollection[idx].SetData(ChartDimensionsEnum.chDimCategories, (int)ChartSpecialDataSourcesEnum.chDataLiteral, stdCategory);
barChart.SeriesCollection[idx].SetData(ChartDimensionsEnum.chDimValues, (int)ChartSpecialDataSourcesEnum.chDataLiteral, item.Value);
try
{
barChart.SeriesCollection[idx].Interior.Color = this.GetRandomColor().ToKnownColor().ToString();
}
catch
{
barChart.SeriesCollection[idx].Interior.Color = "red";
}
barChart.SeriesCollection[idx].Caption = item.Key;
ChDataLabels chLblMaths = barChart.SeriesCollection[idx].DataLabelsCollection.Add();
chLblMaths.HasValue = true;
idx++;
}
String sFileName = DateTime.Now.Ticks.ToString() + ".gif";
String sPath = "C:\\OLAPProject\\WebOLAP\\WebOLAP\\" + sFileName;
String sUrl = "http://localhost:81/olap/" + sFileName;
barChartspace.ExportPicture(sPath, "gif", 900, 600);
//ну и нацеливаем картинку на Url
imChart.ImageUrl = sUrl;
#endregion
}
}
public Color GetRandomColor()
{
KnownColor[] colors = (KnownColor[])Enum.GetValues(typeof(KnownColor));
return Color.FromKnownColor(colors[GetRandomNo(colors.Length)]);
}
private int GetRandomNo(int MaxValue)
{
RandomNumberGenerator rng = RNGCryptoServiceProvider.Create();
byte[] bytes = new byte[4];
rng.GetBytes(bytes);
int rndNum = BitConverter.ToInt32(bytes, 0);
return Math.Abs(rndNum % MaxValue);
}
}
}