logo search
Диплом(в)-1

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

  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);

}

}

}