Add: IMDCalculationSlice;
Метод Add осуществляет создание нового разреза источника/приемника данных.
Для выполнения примера предполагается наличие в репозитории базы данных с идентификатором "MDBD" В данной БД хранятся таблицы, содержащие следующую структуру:
Таблица TABLE_INPUT:
| Наименование поля | Назначение |
| Data | Дата занесения значения. |
| CityId | Идентификаторы городов, по которым содержится значения. |
| Value | Значение показателя по указанному городу. |
Таблица TABLE_OUTPUT:
| Наименование поля | Назначение |
| Data | Дата занесения значения. |
| CountryId | Идентификаторы стран, по которым будут расчитываться значения. |
| Value | Значение показателя по стране, рассчитанное с учетом значений по городам. |
Так же в БД содержится таблица, на которой основано измерение "Dim_1". Данное измерение используется для составления иерархической зависимости между городами и странами. В дальнейшем используется для составления формул по выбранным координатам.
Sub Main;
Var
MB: IMetabase;
CrInfo: IMetabaseObjectCreateInfo;
MObj: IMetabaseObject;
MDCalc: IMDCalculation;
Destination: IMDCalculationDestination;
Source: IMDCalculationSource;
Slice: IMDCalculationSlice;
DimModel: IDimensionModel;
Fact: IMDCalculationfact;
FreeSlice: IMDCalculationSliceFree;
FixedSlice: IMDCalculationSliceFixed;
FormulasTable: IMDCalculationFormulasTable;
TableForFormulas: ITable;
Begin
MB := MetabaseClass.Active;
CrInfo := MB.CreateCreateInfo;
CrInfo.ClassID := MetabaseObjectClass.KE_CLASS_MDCALCULATION;
CrInfo.Id := "MDCALC_1";
CrInfo.Name := "Многомерный расчет на сервере";
CrInfo.Parent := Null;
MObj := MB.CreateObject(CrInfo).Edit;
MDCalc := MObj As IMDCalculation;
//Добавляем БД
MDCalc.Database := MB.ItemById("MDBD").Bind As IDatabase;
//Добавляем входную таблицу
Source := MDcalc.Sources.Add(Mb.ItemById("TABLE_INPUT").Bind As IDatasetModel);
//Добавляем разрез для поля "CityId" таблицы
Slice := Source.Slices.Add;
Slice.Fields := "CITYID";
Slice.Name := "Города";
Slice.FixType := MDCalculationSliceFixType.Free;
FreeSlice := Slice.Free;
//Связываем данный разрез со справочником Стран/городов
DimModel := MB.ItemById("Dim_1").Bind As IDimensionModel;
FreeSlice.Dimension := DimModel;
FreeSlice.Index := DimModel.Blocks.Item(0).Indexes.Item(0);
//Добавляем разрез для календаря
Slice := Source.Slices.Add;
Slice.Name := "Календарь";
Slice.Fields := "DATA";
Slice.FixType := MDCalculationSliceFixType.Fixed;
Slice.IsCalendar := True;
FixedSlice := Slice.Fixed;
//Добавляем разрез для показателя
Fact := Source.Facts.Add;
Fact.FieldName := "VALUE";
Fact.Name := "Показатель";
//Добавляем выходную таблицу
Destination := MDCalc.Destination;
Destination.Data := MB.ItemById("TABLE_OUTPUT").Bind As IDatasetModel;
//Добавляем разрез для поля "CountryId" таблицы
Slice := Destination.Slices.Add;
Slice.Fields := "COUNTRYID";
Slice.Name := "Страны/Города";
Slice.FixType := MDCalculationSliceFixType.Free;
FreeSlice := Slice.Free;
//Связываем данный разрез со справочником Стран/городов
DimModel := Mb.ItemById("Dim_1").Bind As IDimensionModel;
FreeSlice.Dimension := DimModel;
FreeSlice.Index := DimModel.Blocks.Item(0).Indexes.Item(0);
//Добавляем разрез для календаря
Slice := Destination.Slices.Add;
Slice.Name := "Календарь";
Slice.Id := "CALEN";
Slice.Fields := "DATA";
Slice.FixType := MDCalculationSliceFixType.Fixed;
Slice.IsCalendar := True;
//Добавляем разрез для показателя
Fact := Destination.Facts.Add;
Fact.FieldName := "VALUE";
Fact.Name := "Показатель";
//Указываю связь между фиксированными календарными разрезами
FixedSlice.Mapping := Destination.Slices.FindById("CALEN");
//Создаем новую таблицу формул
FormulasTable := MDcalc.FormulasTable;
TableForFormulas := FormulasTable.Create;
FormulasTable.Attach(TableForFormulas);
MObj.Save;
End Sub Main;
После выполнения примера в корневом каталоге репозитория будет создан объект - Многомерный расчет на сервере БД. Расчет будет осуществляться на основе значений, содержащихся в таблице "TABLE_INPUT". В качестве назначения будет установлена таблица "TABLE_OUTPUT". Для полей таблиц будут созданы необходимые разрезы, также будут созданы показатели, привязанные к полям "VALUE". Календарные разрезы будут зафиксированы.
См. также: