Loader: Object;
Loader: Object;
Свойство Loader возвращает параметры загрузчика данных в куб.
Свойство возвращает параметры загрузчика, описываемого интерфейсом ICubeLoaderFromSource. В полученном загрузчике необходимо произвести следующие настройки:
если измерения куба основаны на справочниках НСИ, то укажите свойство ICubeLoaderFromSource.RdsDatabase;
в свойстве ICubeLoaderFromSource.Database укажите базу данных, в которой будет создана таблица для хранения данных куба;
если загрузка осуществляется в существующий куб, то определите свойство ICubeLoaderFromSource.Cube. При создании нового куба свойство ICubeLoaderFromSource.Cube не указывается, в свойстве CreateInfo можно определить информацию о создаваемом кубе. Если свойство CreateInfo не определено, то вся информация о создаваемом кубе будет сгенерирована автоматически.
с помощью метода ICubeLoaderFromSource.Init инициализируйте привязку измерений, указав в качестве параметра источник Source. Сформированные привязки, при необходимости, можно изменить в свойствах ICubeLoaderFromSource.DimensionBindings и ICubeLoaderFromSource.FactBindings.
Для выполнения примера предполагается наличие в репозитории задачи ETL с идентификатором «ETL_Task». В задаче создан источник с идентификатором «PLAINDATAMETABASEPROVIDER1». Также в репозитории имеется папка «F_Cubes» и база данных «DB».
Sub UserProc;
Var
MB: IMetabase;
ETLTask: IEtlTask;
EtlConsumer: IEtlPlainDataConsumer;
EtlProvider: IEtlPlainDataProvider;
ConsumerIn: IEtlPlainInput;
ProviderOut: IEtlPlainOutput;
DtCube: IDtCubeConsumer;
Loader: ICubeLoaderFromSource;
Link: IEtlPlainLink;
Shapes: IWxShapes;
Begin
MB := MetabaseClass.Active;
ETLTask := MB.ItemById("ETL_Task").Edit As IEtlTask;
//Создание нового приёмника - приёмник куб
EtlConsumer := ETLTask.Create(EtlObjectType.PlainDataCubeConsumer) As IEtlPlainDataConsumer;
EtlConsumer := EtlConsumer.Edit;
EtlConsumer.ClearConsumer := True;
EtlConsumer.Id := "CUBE_Consumer";
EtlConsumer.Name := "Приёмник-Куб";
//Создаем визуальный объект приёмника
CreateWX(ETLTask, EtlConsumer, 0, 0);
//Настраиваем приёмник
DtCube := EtlConsumer.Consumer As IDtCubeConsumer;
//Информация о создаваемом кубе
Loader := DtCube.Loader As ICubeLoaderFromSource;
Loader.Type := CubeLoaderType.Cube;
Loader.Database := MB.ItemById("DB").Open(Null) As IDatabaseInstance;
Loader.Parent := MB.ItemById("F_Cubes").Bind;
//Источник, с которым будет связан приёмник
EtlProvider := ETLTask.FindById("PLAINDATAMETABASEPROVIDER1") As IEtlPlainDataProvider;
Loader.Init(EtlProvider.Provider);
//Сопоставление полей источника и приёмника
ConsumerIn := EtlConsumer.PlainInput;
ProviderOut := EtlProvider.PlainOutput;
FillFields(ConsumerIn.Fields, ProviderOut.Fields);
//Сохранение приёмника
EtlConsumer.Save;
//Создание связи
Link := CreateLink(ETLTask, ProviderOut, ConsumerIn);
//Создание визуальных связей
Shapes := ETLTask.Workspace.Shapes;
CreateWXLink(ETLTask, Shapes.FindById(EtlProvider.Id), Shapes.FindById(EtlConsumer.Id), Link);
//Сохранение задачи
(ETLTask As IMetabaseObject).Save;
End Sub UserProc;
//Создание визуального объекта
Sub CreateWX(ETLTask: IEtlTask; ETLObject: IEtlObject; XPosition: Integer; YPosition: Integer);
Var
WxRect: IWxRectangle;
WxETLObj: IWxEtlObject;
Begin
WxRect := ETLTask.Workspace.CreateRectangle;
WxRect.Id := ETLObject.Id;
WxETLObj := New WxEtlObject.Create;
WxETLObj.EtlObject := ETLObject;
WxRect.Style.TextPosition := WxTextPosition.Bottom;
WxRect.Style.PictureMarginTop := -10;
WxRect.PinPosition := New GxPointF.Create(XPosition, YPosition);
WxRect.Extension := WxETLObj As IWxShapeExtension;
End Sub CreateWX;
//Сопоставление списков полей входов/выходов
Sub FillFields(Fields, FieldsSource: IEtlPlainFields);
Begin
Fields := Fields.Edit;
Fields.Fill(FieldsSource);
Fields.Save;
End Sub FillFields;
//Создание связи между объектами
Function CreateLink(ETLTask: IEtlTask; Output: IEtlPlainOutput; Input: IEtlPlainInput): IEtlPlainLink;
Var
Link: IEtlPlainLink;
Begin
Link := ETLTask.CreatePlainLink;
Link.SourceObjectOutput := Output;
Link.DestinationObjectInput := Input;
Link.FillDefault;
Return Link;
End Function CreateLink;
//Создание визуальных связей
Sub CreateWXLink(ETLTask: IEtlTask; Shape1: IWxShape; Shape2: IWxShape; Link: IEtlPlainLink);
Var
WLink: IWxLink;
WxETLLink: IWxEtlObject;
Begin
//Создаем визуальные объекты связи
WLink := ETLTask.Workspace.AutoLinkShapes(Shape1, Shape2);
WLink.Style.LinePenBeginWxCap := WxLineCap.Flat;
WLink.Style.LinePenEndWxCap := WxLineCap.Arrow30DegreeFilled;
WxETLLink := New WxEtlObject.Create;
WxETLLink.EtlObject := Link;
WLink.Extension := WxETLLink As IWxShapeExtension;
End Sub CreateWXLink;
При выполнении примера в задаче ETL будет создан новый приёмник. Приёмник будет экспортировать данные в новый куб репозитория. Структура куба будет сформирована автоматически на основании информации о полях источника, с которым будет связан приёмник. Будут созданы все необходимые визуальные объекты в задаче ETL.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Andy;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Drawing;
Imports Prognoz.Platform.Interop.Dt;
Imports Prognoz.Platform.Interop.Etl;
Imports Prognoz.Platform.Interop.Metabase;
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
ETLTask: IEtlTask;
EtlConsumer: IEtlPlainDataConsumer;
EtlProvider: IEtlPlainDataProvider;
ConsumerIn: IEtlPlainInput;
ProviderOut: IEtlPlainOutput;
DtCube: IDtCubeConsumer;
Loader: ICubeLoaderFromSource;
Link: IEtlPlainLink;
Shapes: IWxShapes;
Begin
MB := Params.Metabase;
ETLTask := mb.ItemById["ETL_Task"].Edit() As IEtlTask;
//Создание нового приёмника - приемник куб
EtlConsumer := ETLTask.Create(EtlObjectType.eotPlainDataCubeConsumer) As IEtlPlainDataConsumer;
EtlConsumer := EtlConsumer.Edit();
EtlConsumer.ClearConsumer := True;
EtlConsumer.Id := "CUBE_Consumer";
EtlConsumer.Name := "Приёмник-Куб";
//Создаем визуальный объект приёмника
CreateWX(ETLTask, EtlConsumer, 0, 0);
//Настраиваем приёмник
DtCube := EtlConsumer.Consumer As IDtCubeConsumer;
//Информация о создаваемом кубе
Loader := DtCube.Loader As ICubeLoaderFromSource;
Loader.Type := CubeLoaderType.cltCube;
Loader.Database := MB.ItemById["DB"].Open(Null) As IDatabaseInstance;
Loader.Parent := MB.ItemById["F_Cubes"].Bind();
//Источник, с которым будет связан приёмник
EtlProvider := ETLTask.FindById("PLAINDATAMETABASEPROVIDER1") As IEtlPlainDataProvider;
Loader.Init(EtlProvider.Provider);
//Сопоставление полей источника и приёмника
ConsumerIn := EtlConsumer.PlainInput;
ProviderOut := EtlProvider.PlainOutput;
FillFields(ConsumerIn.Fields, ProviderOut.Fields);
//Сохранение приёмника
EtlConsumer.Save();
//Создание связи
Link := CreateLink(ETLTask, ProviderOut, ConsumerIn);
//Создание визуальных связей
Shapes := ETLTask.Workspace.Shapes;
CreateWXLink(ETLTask, Shapes.FindById(EtlProvider.Id), Shapes.FindById(EtlConsumer.Id), Link);
//Сохранение задачи
(ETLTask As IMetabaseObject).Save();
End Sub;
//Создание визуальных объектов
Public Shared Sub CreateWX(ETLTask: IEtlTask; ETLObject: IEtlObject; XPosition: Integer; YPosition: Integer);
Var
GxPointFCls: GxPointF = New GxPointFClass();
WxRect: IWxRectangle;
WxETLObj: IWxEtlObject = New WxEtlObject();
Begin
WxRect := ETLTask.Workspace.CreateRectangle();
WxRect.Id := ETLObject.Id;
WxETLObj.EtlObject := ETLObject;
WxRect.Style.TextPosition := WxTextPosition.wtpBottom;
WxRect.Style.PictureMarginTop := -10;
GxPointFCls.Create(XPosition, YPosition);
WxRect.PinPosition := GxPointFCls;
WxRect.Extension := WxETLObj As IWxShapeExtension;
End Sub;
//Создание визуальных связей
Public Shared Sub CreateWXLink(ETLTask: IEtlTask; Shape1: IWxShape; Shape2: IWxShape; Link: IEtlPlainLink);
Var
WLink: IWxLink;
WxETLLink: IWxEtlObject = New WxEtlObject();
Begin
//Создаем визуальные объекты связи
WLink := ETLTask.Workspace.AutoLinkShapes(Shape1, Shape2);
WLink.Style.LinePenBeginWxCap := WxLineCap.wlcFlat;
WLink.Style.LinePenEndWxCap := WxLineCap.wlcArrow30DegreeFilled;
WxETLLink.EtlObject := Link;
WLink.Extension := WxETLLink As IWxShapeExtension;
End Sub;
//Сопоставление списков полей входов/выходов
Public Shared Sub FillFields(Fields, FieldsSource: IEtlPlainFields);
Begin
Fields := Fields.Edit();
Fields.Fill(FieldsSource);
Fields.Save();
End Sub;
//Создание связи между объектами
Public Shared Function CreateLink(ETLTask: IEtlTask; Output: IEtlPlainOutput; Input: IEtlPlainInput): IEtlPlainLink;
Var
Link: IEtlPlainLink;
Begin
Link := ETLTask.CreatePlainLink();
Link.SourceObjectOutput := Output;
Link.DestinationObjectInput := Input;
Link.FillDefault();
Return Link;
End Function;
См. также: