Экспорт и импорт табличного справочника НСИ

Схемы импорта и экспорта являются дочерними объектами табличного справочника НСИ. Используя язык Fore и Fore.NET можно настроить:

Описание примера

Для выполнения примера в репозитории предполагается наличие репозитория НСИ с идентификатором RDS. Данный репозиторий должен содержать табличный справочник НСИ с идентификатором D_EXP_IMP.

Также требуется форма, на которой расположены:

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

При нажатии кнопки «ExpButton» выполняется экспорт элементов справочника D_EXP_IMP в текстовый файл «C:\Data_out.txt». Экспорт производится по следующим параметрам:

При нажатии кнопки «ImpButton» выполняется импорт данных из текстового файла «C:\Data_out.txt» в справочник D_EXP_IMP.

Порядок выполнения примера:

В результате выполнения примера в справочнике D_EXP_IMP после экспорта и импорта останутся только элементы первого уровня.

Процедура экспорта данных

Данная процедура является обработчиком события для кнопки «ExpButton»:

Sub ExpButtonOnClick(Sender: Object; Args: IMouseEventArgs);
Var
    mb: IMetabase;
    rdsKey: Integer;
    dictObj: IMetabaseObject;
    Dict: IRdsDictionary;
    sExport: IMetaRdsExportSchema;
    i: Integer;
    dictAts: IRdsAttributes;
    Attr: IRdsAttribute;
    attrMap: IRdsExportSchemaAttribute;
    dictSort: IRdsSortAttributes;
    dictFilter: IRdsDictionaryFilterConditions;
    Cond: IRdsDictionaryFilterCondition;
    textCons: IDtTextConsumer;
    dictInst: IRdsDictionaryInstance;
Begin
    mb := MetabaseClass.Active;
    // Получаем ключ репозитория НСИ
    rdsKey := mb.GetObjectKeyById("RDS");
    // Получаем табличный справочник НСИ
    dictObj := mb.ItemByIdNamespace("D_EXP_IMP", rdsKey).Edit;
    Dict := dictObj As IRdsDictionary;
    // Создаем новую схему экспорта
    sExport := Dict.ExportSchemas.Add As IMetaRdsExportSchema;
    // Определяем привязку атрибутов справочника к полям приёмника
    dictAts := Dict.Attributes;
    For i := 0 To dictAts.Count - 1 Do
        Attr := dictAts.Item(i);
        attrMap := sExport.AddMapping;
        attrMap.Attribute := Attr;
        attrMap.FieldName := Attr.Id;
    End For;
    // Указываем, что перед экспортом необходимо очистить приёмник
    sExport.ClearBeforeExport := True;
    // Задаем сортировку по атрибуту "NAME"
    dictSort := sExport.SortAttributes;
    Attr := dictAts.FindById("NAME");
    dictSort.Add(Attr, True);
    // Добавляем фильтрацию: экспортировать только элементы 1-го уровня
    dictFilter := sExport.Filter;
    Attr := dictAts.FindById("PARENT_KEY");
    Cond := dictFilter.Add(Attr);
    Cond.Value := Null;
    Cond.Operation := RdsConditionOperation.Equal;
    // Настраиваем приемник данных: текстовый файл
    textCons := New DtTextConsumer.Create;
    textCons.File := "c:\Data_out.txt";
    textCons.WriteHeader := True;
    textCons.RowDelimiter := #13 + #10;
    textCons.DelimitedColumnDelimiter := #9;
    textCons.DelimitedTextQualifier := "'";
    sExport.Consumer := textCons;
    // Сохраняем справочник
    dictObj.Save;
    // Выполняем экспорт
    dictInst := dictObj.Open(NullAs IRdsDictionaryInstance;
    dictInst.ExportData(sExport);
End Sub ExpButtonOnClick;

Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Dt;
Imports Prognoz.Platform.Interop.Rds;

Private Sub ExpButton_Click(sender: System.Object; e: System.EventArgs);
Var
    mb: IMetabase;
    rdsKey: uinteger;
    dictObj: IMetabaseObject;
    Dict: IRdsDictionary;
    sExport: IMetaRdsExportSchema;
    i: Integer;
    dictAts: IRdsAttributes;
    Attr: IRdsAttribute;
    attrMap: IRdsExportSchemaAttribute;
    dictSort: IRdsSortAttributes;
    dictFilter: IRdsDictionaryFilterConditions;
    Cond: IRdsDictionaryFilterCondition;
    textCons: IDtTextConsumer;
    dictInst: IRdsDictionaryInstance;
Begin
    mb := self.Metabase;
    // Получаем ключ репозитория НСИ
    rdsKey := mb.GetObjectKeyById("RDS_70");
    // Получаем табличный справочник НСИ
    dictObj := mb.ItemByIdNamespace["D_EXP_IMP", rdsKey].Edit();
    Dict := dictObj As IRdsDictionary;
    // Создаем новую схему экспорта
    sExport := Dict.ExportSchemas.Add() As IMetaRdsExportSchema;
    // Определяем привязку атрибутов справочника к полям приёмника
    dictAts := Dict.Attributes;
    For i := 0 To dictAts.Count - 1 Do
        Attr := dictAts.Item[i];
        attrMap := sExport.AddMapping();
        attrMap.Attribute := Attr;
        attrMap.FieldName := Attr.Id;
    End For;
    // Указываем, что перед экспортом необходимо очистить приёмник
    sExport.ClearBeforeExport := True;
    // Задаем сортировку по атрибуту "NAME"
    dictSort := sExport.SortAttributes;
    Attr := dictAts.FindById("NAME");
    dictSort.Add(Attr, True);
    // Добавляем фильтрацию: экспортировать только элементы 1-го уровня
    dictFilter := sExport.Filter;
    Attr := dictAts.FindById("PARENT_KEY");
    Cond := dictFilter.Add(Attr);
    Cond.Value := Null;
    Cond.Operation := RdsConditionOperation.rcoEqual;
    // Настраиваем приемник данных: текстовый файл
    textCons := New DtTextConsumer.Create();
    textCons.File := "c:\Data_out.txt";
    textCons.WriteHeader := True;
    textCons.DelimitedTextQualifier := "'";
    sExport.Consumer := textCons;
    // Сохраняем справочник
    dictObj.Save();
    // Выполняем экспорт
    dictInst := dictObj.Open(NullAs IRdsDictionaryInstance;
    dictInst.ExportData(sExport);
End Sub;

После выполнения процедуры в файле «C:\Data_out.txt» будут содержаться элементы первого уровня справочника D_EXP_IMP, отсортированные по значению атрибута «NAME».

Процедура импорта данных

Данная процедура является обработчиком события для кнопки «ImpButton»:

Sub ImpButtonOnClick(Sender: Object; Args: IMouseEventArgs);
Var
    mb: IMetabase;
    rdsKey: Integer;
    dictObj: IMetabaseObject;
    Dict: IRdsDictionary;
    sImport: IMetaRdsImportSchema;
    i: Integer;
    dictAts: IRdsAttributes;
    Attr: IRdsAttribute;
    attrMap: IRdsImportSchemaAttribute;
    textProv: IDtTextProvider;
    dictInst: IRdsDictionaryInstance;
Begin
    mb := MetabaseClass.Active;
    // Получаем ключ репозитория НСИ
    rdsKey := mb.GetObjectKeyById("RDS");
    // Получаем табличный справочник НСИ
    dictObj := mb.ItemByIdNamespace("D_EXP_IMP", rdsKey).Edit;
    Dict := dictObj As IRdsDictionary;
    // Создаем новую схему импорта
    sImport := Dict.ImportSchemas.Add As IMetaRdsImportSchema;
    // Определяем привязку атрибутов справочника к полям источника
    dictAts := Dict.Attributes;
    For i := 0 To dictAts.Count - 1 Do
        Attr := dictAts.Item(i);
        attrMap := sImport.Mappings(Attr);
        attrMap.Attribute := Attr;
        attrMap.FieldName := Attr.Id;
    End For;
    // Указываем режим импорта
    sImport.Mode := UpdateLoadMode.Replace;
    // Настраиваем источник данных: текстовый файл
    textProv := New DtTextProvider.Create;
    textProv.File := "c:\Data_out.txt";
    textProv.RangeHasHeader := True;
    textProv.HeaderRow := 0;
    textProv.RowDelimiter := #13 + #10;
    textProv.DelimitedColumnDelimiter := #9;
    textProv.DelimitedTextQualifier := "'";
    sImport.Source := textProv;
    // Сохраняем справочник
    dictObj.Save;
    // Выполняем импорт
    dictInst := dictObj.Open(NullAs IRdsDictionaryInstance;
    dictInst.ImportData(sImport);
End Sub ImpButtonOnClick;

Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Dt;
Imports Prognoz.Platform.Interop.Rds;

Private Sub ImpButton_Click(sender: System.Object; e: System.EventArgs);
Var
    mb: IMetabase;
    rdsKey: uinteger;
    dictObj: IMetabaseObject;
    Dict: IRdsDictionary;
    sImport: IMetaRdsImportSchema;
    i: Integer;
    dictAts: IRdsAttributes;
    Attr: IRdsAttribute;
    attrMap: IRdsImportSchemaAttribute;
    textProv: IDtTextProvider;
    dictInst: IRdsDictionaryInstance;
Begin
    mb := self.Metabase;
    // Получаем ключ репозитория НСИ
    rdsKey := mb.GetObjectKeyById("RDS_70");
    // Получаем табличный справочник НСИ
    dictObj := mb.ItemByIdNamespace["D_EXP_IMP", rdsKey].Edit();
    Dict := dictObj As IRdsDictionary;
    // Создаем новую схему импорта
    sImport := Dict.ImportSchemas.Add() As IMetaRdsImportSchema;
    // Определяем привязку атрибутов справочника к полям источника
    dictAts := Dict.Attributes;
    For i := 0 To dictAts.Count - 1 Do
        Attr := dictAts.Item[i];
        attrMap := sImport.Mappings[Attr];
        attrMap.Attribute := Attr;
        attrMap.FieldName := Attr.Id;
    End For;
    // Указываем режим импорта
    sImport.Mode := UpdateLoadMode.ulmReplace;
    // Настраиваем источник данных: текстовый файл
    textProv := New DtTextProvider.Create();
    textProv.File := "c:\Data_out.txt";
    textProv.RangeHasHeader := True;
    textProv.HeaderRow := 0;
    //textProv.RowDelimiter := "\r" + "\n";
    //textProv.DelimitedColumnDelimiter := "\t";
    textProv.DelimitedTextQualifier := "'";
    sImport.Source := textProv;
    // Сохраняем справочник
    dictObj.Save();
    // Выполняем импорт
    dictInst := dictObj.Open(NullAs IRdsDictionaryInstance;
    dictInst.ImportData(sImport);
End Sub;

После выполнения примера в справочник D_EXP_IMP будут импортированы данные из файла «C:\Data_out.txt».

См. также:

Примеры