KeyFieldNames: String;
KeyFieldNames: string;
Свойство KeyFieldNames определяет поля для идентификации одинаковых записей в источнике и приемнике.
Свойству следует передавать строку, содержащую идентификаторы полей через точку с запятой. Данное свойство актуально, только если приемник данных настроен на таблицу репозитория. Ниже рассмотрен пример использования идентификации записей. Источник и приемник настроены на две одинаковые по структуре таблицы репозитория соответственно. Каждая таблица имеет три поля: «Код», «Наименование» и «Порядок». Для приемника обновление записей установлено по полям «Код» и «Наименование». При таких настройках, если в таблице-источнике у существующей записи изменится значение поля «Порядок», при этом неизменными останутся значения в полях «Код» и «Наименование», то после загрузки данных в таблице приемнике у соответствующей записи (значения «Код» и «Наименование» совпадают со значениями в источнике) изменится только значение «Порядок». Если же для приемника не установить обновление записей по полям «Код» и «Наименование», то после загрузки данных в таблице приемнике появится новая запись.
Для выполнения примера в репозитории предполагается наличие задачи ETL с идентификатором «ETL» и таблицы с идентификатором «Тable», которая будет приемником данных.
Добавьте ссылки на системные сборки «Andy», «Dal», «Db», «Drawing», «Dt», «Etl», «Metabase».
Sub
UserProc;
Var
Metabase: IMetabase;
MObj: IMetabaseObject;
EtlTask: IEtlTask;
EtlConsumer: IEtlPlainDataConsumer;
Fields: IEtlPlainFields;
Field: IEtlPlainField;
MBConsumer: IDtMetabaseConsumer;
Tab: IDatasetModel;
Begin
Metabase := MetabaseClass.Active;
MObj := Metabase.ItemById(
"ETL"
).Edit;
EtlTask := MObj
As
IEtlTask;
Tab := Metabase.ItemById(
"TABLE").Bind As
IDatasetModel;
EtlConsumer := EtlTask.Create(EtlObjectType.PlainDataMetabaseConsumer)
As
IEtlPlainDataConsumer;
EtlConsumer := EtlConsumer.Edit;
EtlConsumer.ClearConsumer :=
False
;
EtlConsumer.Id :=
"MB_Consumer"
;
EtlConsumer.Name :=
"Приемник данных репозитория"
;
MBConsumer := EtlConsumer.Consumer
As
IDtMetabaseConsumer;
MBConsumer.Dataset := Tab;
Fields := EtlConsumer.PlainInput.Fields;
Fields := Fields.Edit;
Field := Fields.Add;
Field.Id :=
"Name"
;
Field.Name :=
"Name"
;
Field.DataType := DbDataType.String;
Field := Fields.Add;
Field.Id :=
"Id"
;
Field.Name :=
"Id"
;
Field.DataType := DbDataType.Integer;
Field := Fields.Add;
Field.Id :=
"Order"
;
Field.Name :=
"Order"
;
Field.DataType := DbDataType.Integer;
Fields.Save;
EtlConsumer.KeyFieldNames :=
"ID;NAME"
;
EtlConsumer.Save;
CreateWX(EtlConsumer, EtlTask);
MObj.Save;
End Sub
UserProc;
Sub
CreateWX(CopyObj: IEtlPlainDataConsumer; etltask: IEtltask);
Var
WxDataTrans: IWxRectangle;
WxETLDataTrans: IWxEtlObject;
Begin
WxDataTrans := EtlTask.Workspace.CreateRectangle;
WxDataTrans.Id := CopyObj.Id;
WxETLDataTrans :=
New
WxEtlObject.Create;
WxETLDataTrans.EtlObject := CopyObj;
WxDataTrans.Style.TextPosition := WxTextPosition.Bottom;
WxDataTrans.Style.PictureMarginTop := -
10
;
WxDataTrans.PinPosition :=
New GxPointF.Create(20, 20
);
WxDataTrans.Extension := WxETLDataTrans
As
IWxShapeExtension;
End Sub CreateWX;
После выполнения примера (UserProc) для задачи ETL будет создан приемник данных репозитория, для которого настроено обновление записей по полям Id и Name.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Andy;
Imports Prognoz.Platform.Interop.Dal;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Drawing;
Imports Prognoz.Platform.Interop.Dt;
Imports Prognoz.Platform.Interop.Etl;
…
Public Shared Sub Main(Params: StartParams);
Var
Metabase: IMetabase;
MObj: IMetabaseObject;
EtlTask: IEtlTask;
EtlConsumer: IEtlPlainDataConsumer;
Fields: IEtlPlainFields;
Field: IEtlPlainField;
MBConsumer: IDtMetabaseConsumer;
Tab: IDatasetModel;
Begin
Metabase := Params.Metabase;
MObj := Metabase.ItemById["ETL"].Edit();
EtlTask := MObj As IEtlTask;
Tab := Metabase.ItemById["TABLE"].Bind() As IDatasetModel;
EtlConsumer := EtlTask.Create(EtlObjectType.eotPlainDataMetabaseConsumer) As IEtlPlainDataConsumer;
EtlConsumer := EtlConsumer.Edit();
EtlConsumer.ClearConsumer := False;
EtlConsumer.Id := "MB_Consumer";
EtlConsumer.Name := "Приемник данных репозитория";
MBConsumer := EtlConsumer.Consumer As IDtMetabaseConsumer;
MBConsumer.Dataset := Tab;
Fields := EtlConsumer.PlainInput.Fields;
Fields := Fields.Edit();
Field := Fields.Add();
Field.Id := "Name";
Field.Name := "Name";
Field.DataType := DbDataType.ddtString;
Field := Fields.Add();
Field.Id := "Id";
Field.Name := "Id";
Field.DataType := DbDataType.ddtInteger;
Field := Fields.Add();
Field.Id := "Order";
Field.Name := "Order";
Field.DataType := DbDataType.ddtInteger;
Fields.Save();
EtlConsumer.KeyFieldNames := "ID;NAME";
EtlConsumer.Save();
CreateWX(EtlConsumer, EtlTask);
MObj.Save();
End Sub;
Public Shared Sub CreateWX(CopyObj: IEtlPlainDataConsumer; etltask: IEtltask);
Var
WxDataTrans: IWxRectangle;
WxETLDataTrans: WxETLObject = New WxETLObjectClass();
OutPoint: GxPointF = New GxPointFClass();
Begin
WxDataTrans := EtlTask.Workspace.CreateRectangle();
WxDataTrans.Id := CopyObj.Id;
WxETLDataTrans.EtlObject := CopyObj;
WxDataTrans.Style.TextPosition := WxTextPosition.wtpBottom;
WxDataTrans.Style.PictureMarginTop := -10;
OutPoint := WxDataTrans.PinPosition;
OutPoint.Create(20, 20);
WxDataTrans.Extension := WxETLDataTrans As IWxShapeExtension;
End Sub CreateWX;
См. также: