IEtlPlainDataProvider.FetchBlockSize

Синтаксис Fore

FetchBlockSize: Integer;

Синтаксис Fore.NET

FetchBlockSize: integer;

Описание

Свойство FetchBlockSize определяет количество обрабатываемых записей при использовании частичной выборки данных в источнике.

Комментарии

Данное свойство актуально, если свойство IEtlTask.PartialFetch принимает значение True.

Если свойство IEtlPlainDataProvider.FetchBlockSize принимает какое-нибудь значение, то оно перекрывает значение свойства IEtlTask.DefaultBlockSize.

Пример Fore

Для выполнения примера в репозитории необходимо наличие:

Таблицы содержат по 3 идентичных поля.

Добавьте ссылки на системные сборки: Andy, Db, Drawing, Dt, Etl, Metabase.

Sub UserProc;
Var
    MB: IMetabase;
    MObj: IMetabaseObject;
    EtlTask: IEtlTask;
    EtlProvider: IEtlPlainDataProvider;
    EtlConsumer: IEtlPlainDataConsumer;
    MBProvider: IDtMetabaseProvider;
    MBConsumer: IDtMetabaseConsumer;
    TabProv, TabCons: IDatasetModel;
    DataSetInstance: IDataSetInstance;
    Fields: IDatasetInstanceFields;
    DBU: IDatasetBatchUpdate;
    Vals: Array[0..2Of Variant;
    i, j: integer;
    PlainLink: IEtlPlainLink;
    ProvPlainOutput: IEtlPlainOutput;
    ConsPlainInput: IEtlPlainInput;
    WLink: IWxLink;
    WxETLLink: IWxEtlObject;
    WxProvider, WxConsumer: IWxShape;
Begin
    MB := MetabaseClass.Active;
    MObj := MB.ItemById("T_ETL").Edit;
    EtlTask := MObj As IEtlTask;
    EtlTask.PartialFetch := True;
    If EtlTask.Workspace.Shapes.Count > 0 Then
        j := EtlTask.Workspace.Shapes.Count - 1;
        // Удаляем объекты задачи ETL
        For i := j To 0 Step - 1 Do
        EtlTask.Workspace.Shapes.Item(i).Delete;
            End For;
        EtlTask.FindById("MB_Provider").Remove;
    End If;
    // Получим таблицу-источник данных
    TabProv := MB.ItemById("IMPORT_TABLE").Bind As IDatasetModel;
    DataSetInstance := MB.ItemById("IMPORT_TABLE").Open(NullAs IDataSetInstance;
    // Получим коллекцию значений полей текущей записи источника данных
    Fields := DataSetInstance.Fields;
    // Создадим объект для обновления данных источника
    DBU := DataSetInstance.CreateBatchUpdate;
    // Установим способ обновления данных в таблице - быстрая вставка
    DBU.BatchCommand := DataSetBatchCommand.Insert;
    DBU.FastInsert := True;
    // Обновим записи, значения первого поля которых больше 1
    Dbu.KeyFieldNames := Fields.Item(0).Id;
    Dbu.FailPolicy := DatasetFailPolicy.CommitByRow;
    Dbu.BeginUpdate;
    While Not DataSetInstance.Eof Do
        i := Fields.Item(0).Value As Integer;
        If i > 1 Then
            Vals[0] := i;
            Vals[1] := Fields.Item(1).Value;
            Vals[2] := (i - (Fields.Item(1).Value As Integer)) * 10;
            Dbu.AddRecord(Vals);
        End If;
        DataSetInstance.Next;
    End While;
    // Применим обновление
    Dbu.Commit;
    //Создание объекта "Источник репозитория"
    EtlProvider := EtlTask.Create(EtlObjectType.PlainDataMetabaseProvider) As IEtlPlainDataProvider;
    EtlProvider := EtlProvider.Edit;
    EtlProvider.Id := "MB_Provider";
    EtlProvider.Name := "Источник данных репозитория";
    EtlProvider.FetchBlockSize := 200;
    //Настройка "Источника репозитория"
    MBProvider := EtlProvider.Provider As IDtMetabaseProvider;
    MBProvider.Dataset := TabProv;
    MBProvider.FieldsFromFile;
    EtlProvider.FillDefault;
    ProvPlainOutput := EtlProvider.PlainOutput;
    EtlProvider.Save;
    If EtlTask.Workspace.Shapes.Count > 0 Then
        j := EtlTask.Workspace.Shapes.Count - 1;
        // Удаляем объекты задачи ETL
        For i := j To 0 Step - 1 Do
        EtlTask.Workspace.Shapes.Item(i).Delete;
            End For;
        EtlTask.FindById("MB_Consumer").Remove;
    End If;
    TabCons := MB.ItemById("EXPORT_TABLE").Bind As IDatasetModel;
    //Создание объекта "Приемник репозитория"
    EtlConsumer := EtlTask.Create(EtlObjectType.PlainDataMetabaseConsumer) As IEtlPlainDataConsumer;
    EtlConsumer := EtlConsumer.Edit;
    EtlConsumer.Id := "MB_Consumer";
    EtlConsumer.Name := "Приемник данных репозитория";
    //Настройка "Приемника репозитория"
    MBConsumer := EtlConsumer.Consumer As IDtMetabaseConsumer;
    MBConsumer.Dataset := TabCons;
    EtlConsumer.FillDefault;
    ConsPlainInput := EtlConsumer.PlainInput;
    EtlConsumer.Save;
    // Создание визуальных объектов
    CreateWXP(EtlProvider, EtlTask);
    CreateWXC(EtlConsumer, EtlTask);
    // Создадим связь и ее визуальное представление
    PlainLink := EtlTask.CreatePlainLink;
    PlainLink.DestinationObjectInput := ConsPlainInput;
    PlainLink.SourceObjectOutput := ProvPlainOutput;
    PlainLink.FillDefault;
    //Прямоугольник источника
    WxProvider := EtlTask.Workspace.Shapes.Item(0);
    //Прямоугольник приемника
    WxConsumer := EtlTask.Workspace.Shapes.Item(1);
    WLink := EtlTask.Workspace.AutoLinkShapes(WxProvider, WxConsumer);
    WxETLLink := New WxEtlObject.Create;
    WxETLLink.EtlObject := PlainLink;
    WLink.Extension := WxETLLink As IWxShapeExtension;
    // Сохраним изменения
    Mobj.Save;
End Sub UserProc;

// Создание визуального объекта источника данных
Sub CreateWXP(CopyObj: IEtlPlainDataProvider; 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 CreateWXP;

// Создание визуального объекта приемника данных
Sub CreateWXC(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(4040);
    WxDataTrans.Extension := WxETLDataTrans As IWxShapeExtension;
End Sub CreateWXC;

После выполнения примера в задаче ETL будут созданы:

После выполнения примера при запуске указанной задачи ETL выполнение займет меньше времени.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Andy;
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;
    MObj: IMetabaseObject;
    EtlTask: IEtlTask;
    EtlProvider: IEtlPlainDataProvider;
    EtlConsumer: IEtlPlainDataConsumer;
    MBProvider: IDtMetabaseProvider;
    MBConsumer: IDtMetabaseConsumer;
    TabProv, TabCons: IDatasetModel;
    DataSetInstance: IDataSetInstance;
    Fields: IDatasetInstanceFields;
    DBU: IDatasetBatchUpdate;
    Vals: Array[0..2Of object;
    i, j: integer;
    PlainLink: IEtlPlainLink;
    ProvPlainOutput: IEtlPlainOutput;
    ConsPlainInput: IEtlPlainInput;
    WLink: IWxLink;
    WxETLLink: WxEtlObject = New WxEtlObjectClass();
    WxProvider, WxConsumer: IWxShape;
Begin
    MB := Params.Metabase;
    MObj := MB.ItemById["T_ETL"].Edit();
    EtlTask := MObj As IEtlTask;
    EtlTask.PartialFetch := True;
    If EtlTask.Workspace.Shapes.Count > 0 Then
        j := EtlTask.Workspace.Shapes.Count - 1;
        // Удаляем объекты задачи ETL
        For i := j To 0 Step - 1 Do
        EtlTask.Workspace.Shapes.Item[i].Delete();
            End For;
        EtlTask.FindById("MB_Provider").Remove();
    End If;
    // Получим таблицу-источник данных
    TabProv := MB.ItemById["IMPORT_TABLE"].Bind() As IDatasetModel;
    DataSetInstance := MB.ItemById["IMPORT_TABLE"].Open(NullAs IDataSetInstance;
    // Получим коллекцию значений полей текущей записи источника данных
    Fields := DataSetInstance.Fields;
    // Создадим объект для обновления данных источника
    DBU := DataSetInstance.CreateBatchUpdate();
    // Установим способ обновления данных в таблице - быстрая вставка
    DBU.BatchCommand := DataSetBatchCommand.dbcInsert;
    DBU.FastInsert := True;
    // Обновим записи, значения первого поля которых больше 1
    Dbu.KeyFieldNames := Fields.Item[0].Id;
    Dbu.FailPolicy := DatasetFailPolicy.dfpCommitByRow;
    Dbu.BeginUpdate();
    While Not DataSetInstance.Eof() Do
        i := Fields.Item[0].Value As Integer;
        If i > 1 Then
            Vals[0] := i;
            Vals[1] := Fields.Item[1].Value;
            Vals[2] := (i - (Fields.Item[1].Value As Integer)) * 10;
            Dbu.AddRecord(Vals);
        End If;
        DataSetInstance.Next();
    End While;
    // Применим обновление
    Dbu.Commit();
    //Создание объекта "Источник репозитория"
    EtlProvider := EtlTask.Create(EtlObjectType.eotPlainDataMetabaseProvider) As IEtlPlainDataProvider;
    EtlProvider := EtlProvider.Edit();
    EtlProvider.Id := "MB_Provider";
    EtlProvider.Name := "Источник данных репозитория";
    EtlProvider.FetchBlockSize := 200;
    //Настройка "Источника репозитория"
    MBProvider := EtlProvider.Provider As IDtMetabaseProvider;
    MBProvider.Dataset := TabProv;
    MBProvider.FieldsFromFile();
    EtlProvider.FillDefault();
    ProvPlainOutput := EtlProvider.PlainOutput;
    EtlProvider.Save();
    If EtlTask.Workspace.Shapes.Count > 0 Then
        j := EtlTask.Workspace.Shapes.Count - 1;
        // Удаляем объекты задачи ETL
        For i := j To 0 Step - 1 Do
        EtlTask.Workspace.Shapes.Item[i].Delete();
            End For;
        EtlTask.FindById("MB_Consumer").Remove();
    End If;
    TabCons := MB.ItemById["EXPORT_TABLE"].Bind() As IDatasetModel;
    //Создание объекта "Приемник репозитория"
    EtlConsumer := EtlTask.Create(EtlObjectType.eotPlainDataMetabaseConsumer) As IEtlPlainDataConsumer;
    EtlConsumer := EtlConsumer.Edit();
    EtlConsumer.Id := "MB_Consumer";
    EtlConsumer.Name := "Приемник данных репозитория";
    //Настройка "Приемника репозитория"
    MBConsumer := EtlConsumer.Consumer As IDtMetabaseConsumer;
    MBConsumer.Dataset := TabCons;
    EtlConsumer.FillDefault();
    ConsPlainInput := EtlConsumer.PlainInput;
    EtlConsumer.Save();
    // Создание визуальных объектов
    CreateWXP(EtlProvider, EtlTask);
    CreateWXC(EtlConsumer, EtlTask);
    // Создадим связь
    PlainLink := EtlTask.CreatePlainLink();
    PlainLink.DestinationObjectInput := ConsPlainInput;
    PlainLink.SourceObjectOutput := ProvPlainOutput;
    // Создадим связь и ее визуальное представление
    PlainLink := EtlTask.CreatePlainLink();
    PlainLink.DestinationObjectInput := ConsPlainInput;
    PlainLink.SourceObjectOutput := ProvPlainOutput;
    PlainLink.FillDefault();
    //Прямоугольник источника
    WxProvider := EtlTask.Workspace.Shapes.Item[0];
    //Прямоугольник приемника
    WxConsumer := EtlTask.Workspace.Shapes.Item[1];
    WLink := EtlTask.Workspace.AutoLinkShapes(WxProvider, WxConsumer);
    WxETLLink.EtlObject := PlainLink;
    WLink.Extension := WxETLLink As IWxShapeExtension;
    // Сохраним изменения
    Mobj.Save();
End Sub;

// Создание визуального объекта источника данных
Public Shared Sub CreateWXP(CopyObj: IEtlPlainDataProvider; 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 CreateWXP;

// Создание визуального объекта приемника данных
Public Shared Sub CreateWXC(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(4040);
    WxDataTrans.Extension := WxETLDataTrans As IWxShapeExtension;
End Sub CreateWXC;

См. также:

IEtlTask