KeyFieldNames: String;
KeyFieldNames: string;
The KeyFieldNames property determines fields used to find identical records in a source and consumer.
A line that contains fields identifiers separated with semicolon should be passed by this property. This property is relevant only if data consumer is configured on repository table. An example of records identification is shown below. Source and consumer are configured on two repository tables, that are identical by structure, respectively. Each table has three fields: Code, Name and Order. For consumer records update is set by fields Code and Name. Under such settings if in a source table in a current record field value Order changes, and values of fields Code and Name remain unchanged, after data loading in a consumer table in a corresponding record (values Code and Name coincide with values in a source) only value Order changes. If records update by fields Code and Name is not on for a consumer, after data loading a new record appears in a consumer table.
Executing this example requires an ETL task with the ETL identifier and a table with the Table identifier in repository. This table represents a data consumer.
Add links to the Andy, Dal, Db, Drawing, Dt, Etl, Metabase system assemblies.
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 := "Repository data consumer" ;
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;
After executing this example (UserProc) repository data consumer, for which records update by fields Id and Name is configured, is created for ETL task.
The requirements and result of the Fore.NET example execution match with those in the Fore example.
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 := Repository data consumer;
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;
See also: