Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом(в)-1.docx
Скачиваний:
59
Добавлен:
09.02.2015
Размер:
2.4 Mб
Скачать

9 Заключительные положения

9.1 Все изменения и дополнения к настоящему Договору действительны только в тех случаях, если они совершены в письменной форме и подписаны обеими Сторонами.

9.2 Стороны не имеют права передавать свои права и обязательства по настоящему Договору третьим лицам без письменного согласия на то другой Стороны.

9.3 Во всем остальном, что не предусмотрено условиями настоящего Договора, будут применяться нормы законодательства Российской Федерации.

10 Адреса Сторон

10.1 ЛИЦЕНЗИАР: Прошунин Иван Сергеевич, адрес: 194355, г. Санкт-Петербург, Суздальский проспект, д. 5, корп. 1, кв. 264

10.2 ЛИЦЕНЗИАТ: СПБГЭТУ, адрес: 197376, Санкт-Петербург, ул. Проф. Попова, д. 5.

Настоящий Договор составлен в двух экземплярах для каждой из Сторон и подписан “5” июня 2011 г. в г. Санкт-Петербурге.

ЛИЦЕНЗИАР: ОТ ЛИЦЕНЗИАТА:

Ректор

Прошунин и.С. Спбгэту в.М. Кутузов Заключение

В дипломном были проекте решены следующие задачи:

  1. Разработаны многомерные модели данных для построения OLAP-кубов с целью оптимизации данных, увеличения скорости обработки пользовательских запросов, повышения гибкости системы, приобретения важного для анализа данных свойства многомерности, то есть возможности представления анализируемых фактов как функций от большого числа их характеризующих параметров.

  2. Разработан пользовательский интерфейс, позволяющий формировать структуру OLAP-куба в виде, соответствующем потребностям оператора. Реализованные формы оптимизированы под запросы пользователя, интуитивно понятен их функционал, результаты работы приложения выводятся в графической форме в виде таблиц и гистограмм.

  3. Разработано программное обеспечение при поддержке технологии ADOMD.NET, позволяющее реализовать подключение и формирование запросов на языке MDX к разработанным OLAP-кубам. На основе платформы .NET, а точнее с использованием технологии ASP.NET был разработан пользовательский интерфейс в виде web-приложения.

  4. Реализована работа приложения в среде интернет для возможности многопользовательского доступа к данным из любой точки мира без необходимости дополнительной установки клиентского программного обеспечения и настройки соединения с базой.

Тестирование разработанного программного обеспечения осуществлялось в разных интернет обозревателях, среди которых Opera, Mozilla firefox, Google Chrome, Internet Explorer.

Список используемых источников

  1. Троэлсен Э. Язык программирование C# 2005 и платформа .NET 2.0. – М.: Вильямс, 2007. – 1168 c.

  2. Мак-Дональд М., Шпушта М. Microsoft ASP.NET 2.0 с примерами на C# – М.: Вильямс, 2007. – 1408 c.

  3. Малик С. Microsoft ADO.NET 2.0 – М.: Вильямс, 2007. – 560 c.

  4. Виейра Р. Программирование баз данных Microsoft SQL Server 2005 – М.:Диалектика, 2007. – 832 c.

  5. http://www.zedgraph.org

  6. http://www.sourceforge.net/projects/zedgraph/

  7. http://www.microsoft.com/downloads/details.aspx?FamilyId=7287252C-402E-4F72-97A5-E0FD290D4B76&displaylang=en

  8. http://www.lowagie.com/iText/

  9. http://www.itextsharp.sourceforge.net/

  10. Lowagie B. iText in Action. Creating and Manipulating PDF – NY.:Manning, 2007. – 686 p.

  11. http://msdn2.microsoft.com/en-us/library/aa213568(office.11).aspx

  12. http://msdn2.microsoft.com/en-us/library/aa141155(office.10).aspx

  13. Гражданский Кодекс Российской Федерации от 30.11.94 г. № 51-ФЗ. Ч. 1 // Российская газета №238-239 от 08.12.94 г.

  14. Гражданский Кодекс Российской Федерации от 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);

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]