Схемы импорта и экспорта являются дочерними объектами табличного справочника НСИ. Используя язык Fore и Fore.NET можно настроить:
импорт из источников:
Microsoft OLEDB Provider for Oracle;
Microsoft OLEDB Provider for SQL Server;
Microsoft Excel (*.xls, *.xlsx);
Microsoft Access (*.mdb);
Microsoft XML (*.xml);
текстовый файл (*.txt);
буфер обмена.
экспорт в приёмники:
Microsoft OLEDB Provider for Oracle;
Microsoft OLEDB Provider for SQL Server;
Microsoft Excel (*.xls, *.xlsx);
Microsoft Access (*.mdb);
Microsoft XML (*.xml);
Текстовый файл (*.txt).
Для выполнения примера в репозитории предполагается наличие репозитория НСИ с идентификатором RDS. Данный репозиторий должен содержать табличный справочник НСИ с идентификатором D_EXP_IMP.
Также требуется форма, на которой расположены:
кнопка «ExpButton» для экспорта;
кнопка «ImpButton» для импорта;
Добавьте ссылки на системные сборки: Metabase, Rds, Dt.
При нажатии кнопки «ExpButton» выполняется экспорт элементов справочника D_EXP_IMP в текстовый файл «C:\Data_out.txt». Экспорт производится по следующим параметрам:
экспортируются только элементы первого уровня справочника;
выполняется сортировка экспортируемых элементов по значению атрибута «NAME».
При нажатии кнопки «ImpButton» выполняется импорт данных из текстового файла «C:\Data_out.txt» в справочник D_EXP_IMP.
Порядок выполнения примера:
нажмите кнопку «ExpButton»;
нажмите кнопку «ImpButton».
В результате выполнения примера в справочнике D_EXP_IMP после экспорта и импорта останутся только элементы первого уровня.
Данная процедура является обработчиком события для кнопки «ExpButton»:
для примера на Fore событие OnClick;
для примера на Fore.NET событие Click.
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(Null) As 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(Null) As IRdsDictionaryInstance;
dictInst.ExportData(sExport);
End Sub;
После выполнения процедуры в файле «C:\Data_out.txt» будут содержаться элементы первого уровня справочника D_EXP_IMP, отсортированные по значению атрибута «NAME».
Данная процедура является обработчиком события для кнопки «ImpButton»:
для примера на Fore событие OnClick;
для примера на Fore.NET событие Click.
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(Null) As 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(Null) As IRdsDictionaryInstance;
dictInst.ImportData(sImport);
End Sub;
После выполнения примера в справочник D_EXP_IMP будут импортированы данные из файла «C:\Data_out.txt».
См. также: