IEtlPlainDataConsumer.KeyFieldNames

Fore syntax

KeyFieldNames: String;

Fore.NET syntax

KeyFieldNames: string;

Description

The KeyFieldNames property determines fields used to find identical records in a source and consumer.

Comments

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.

Fore example

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(2020 );
    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.

Fore.NET example

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(2020);
    WxDataTrans.Extension := WxETLDataTrans As IWxShapeExtension;
End Sub CreateWX;

See also:

IEtlPlainDataConsumer