DestField: Integer;
DestField: integer;
Свойство DestField возвращает номер поля в приемнике данных.
Для получения номера соответствующего поля в источнике данных используйте свойство ICubeMetaLoaderLogEntry.SourceField.
Для выполнения примера в репозитории предполагается наличие базы данных временных рядов с идентификатором «TSDB_UNPIVOT», содержащей атрибуты временных рядов с идентификаторами «COUNTRY» и «INDICATOR». Атрибут «COUNTRY» должен быть ссылкой на справочник НСИ, а атрибут «INDICATOR» - ссылкой на табличный справочник НСИ.
В файловой системе должен содержаться файл «D:\Indicator_Data.xlsx», содержащий лист сданными, имеющий наименование «Лист1».
Добавьте ссылки на системные сборки: Cubes, Db, Dimensions, Dt, Metabase, Rds.
Содержимое листа «Лист1» в файле «D:\Indicator_Data.xlsx»
Sub UserProc;
Var
mb: IMetabase;
desc: IMetabaseObjectDescriptor;
importObject: IImportRequestDefinition;
createInfo: IMetabaseObjectCreateInfo;
params: IImportRequestProviderParams;
importBinding: ICubeMetaLoaderBinding;
Bindings: ICubeMetaLoaderBindings;
rdsDictionary: IRdsDictionary;
excel: IDtExcelProviderEx;
instance: IImportRequestInstance;
importResult: IImportRequestResult;
Log: ICubeMetaLoaderLog;
LogStr: String;
count, i: Integer;
entry: ICubeMetaLoaderLogEntry;
rub: IRubricator;
Unpivot: IDtUnpivotProvider;
Attributes: IMetaAttributes;
Begin
MB := MetabaseClass.Active;
// Получаем и очищаем базу данных временных рядов
desc := mb.ItemById("TSDB_UNPIVOT");
rub := desc.Bind As IRubricator;
rub.Truncate;
// Создаем объект для импорта временных рядов
createInfo := mb.CreateCreateInfo;
createInfo.ClassId := MetabaseObjectClass.KE_CLASS_IMPORTREQUEST;
// Задаем параметры объекта
createInfo.Name := "Импорт из файла";
createInfo.KeepEdit := True;
createInfo.Permanent := False;
createInfo.Parent := desc;
importObject := mb.CreateObject(createInfo) As IImportRequestDefinition;
// Задаем тип источника, из которого будут импортироваться данные
importObject.SourceType := ImportRequestSourceType.Provider;
// Задаем базу данных временных рядов, в которую будут импортироваться данные
importObject.DestinationRubricator := desc.Bind As IRubricator;
// Задаем параметры импорта
params := importObject.ProviderParams;
// Снимаем ограничение на максимальное количество ошибок в отчете о импорте данных
(params As ICubeMetaLoader).Log.MaxErrors := -1;
// Получаем привязки атрибутов
Bindings := params.Bindings;
// Получаем атрибуты временных рядов;
Attributes := rub.Facts.Attributes;
// Получаем справочник, на который ссылается атрибут «COUNTRY»
desc := Attributes.FindById("COUNTRY").ValuesObject;
rdsDictionary := desc.Bind As IRdsDictionary;
// Создаем привязку для атрибута «COUNTRY»
importBinding := Bindings.Add;
importBinding.BindingType := CubeMetaLoaderBindingType.Attribute;
importBinding.Attribute := "COUNTRY";
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item(0).Id;
// Указываем, что данные для атрибута будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.Index;
// Указываем номер поля
importBinding.Field := "0";
// Получаем справочник, на который ссылается атрибут «INDICATOR»
desc := Attributes.FindById("INDICATOR").ValuesObject;
rdsDictionary := desc.Bind As IRdsDictionary;
// Создаем привязку для атрибута «INDICATOR»
importBinding := Bindings.Add;
importBinding.BindingType := CubeMetaLoaderBindingType.Attribute;
importBinding.Attribute := "INDICATOR";
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item(1).Id;
// Указываем, что данные для атрибута будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.Index;
// Указываем номер поля
importBinding.Field := "1";
// Получаем справочник, на который ссылается атрибут «UNIT»
desc := Attributes.FindById("UNIT").ValuesObject;
rdsDictionary := desc.Bind As IRdsDictionary;
// Создаем привязку для атрибута «UNIT»
importBinding := Bindings.Add;
importBinding.BindingType := CubeMetaLoaderBindingType.Unit;
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item(0).Id;
// Указываем, что в качестве данных атрибута будет браться заданное значение
importBinding.FieldType := CubeMetaLoaderFieldType.ConstValue;
// Задаем значение атрибута
importBinding.FieldValue := 1 As Variant;
// Создаем привязку для календаря
importBinding := Bindings.Add;
importBinding.BindingType := CubeMetaLoaderBindingType.Calendar;
importBinding.ByColumns := False;
importBinding.CalendarDateFormatEx(DimCalendarLevel.Year) := "$Year$";
importBinding.CalendarOptions.Levels := DimCalendarLevelSet.Year;
// Указываем, что данные для календаря будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.Index;
// Указываем номер поля
importBinding.Field := "2";
// Создаем привязку для значений временных рядов
importBinding := Bindings.Add;
importBinding.BindingType := CubeMetaLoaderBindingType.Value;
// Указываем, что значения будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.Index;
// Указываем номер поля
importBinding.Field := "3";
// Настраиваем источник данных
Try
excel := New DtExcelProviderEx.Create;
// Задаем параметры файла, из которого будет импортировать данные
excel.File := "D:\Indicator_Data.xlsx";
excel.Sheet := "Лист1";
excel.Format := "XLSX";
Excel.HasHeader := False;
// Задаем расположение областей данных в файле-источнике
Unpivot := New DtUnpivotProvider.Create;
Unpivot.Provider := Excel;
Unpivot.LeftEnd := 2;
Unpivot.DataWidth := 2;
Unpivot.DataTop := 3;
Unpivot.DataBottom := 5;
Unpivot.HeadBottom := 2;
Unpivot.DataRight := 8;
Unpivot.HeadColumn := 1;
Unpivot.LeftBegin := 1;
Unpivot.HeadTop := 2;
// Выполняем загрузку данных
Unpivot.Open;
count := Unpivot.Fields.Count;
importObject.ProviderParams.Provider := Unpivot As IDatasetDataProvider;
instance := (importObject As IMetabaseObject).Open(Null) As IImportRequestInstance;
Instance.LoadData;
// Получаем отчет о загрузке данных
importResult := instance.ImportResult;
Log := importResult.Log;
count := Log.Count;
// Выводим отчет в окно консоли
Debug.WriteLine("Количество записей = " + Count.ToString);
For i := 0 To Count - 1 Do
Entry := Log.Item(i);
LogStr := i.ToString + ": "
+ (Entry.IsError ? "Ошибка: " :(Entry.IsMessage ? "Сообщение: " : "Предупреждение: ")) +
+ Entry.ErrorMessage;
Debug.WriteLine(LogStr);
Debug.Indent;
Debug.WriteLine("Номер записи = " + Entry.RecordNumber.ToString);
Debug.WriteLine("Значение записи = " + Entry.ValueRecordNumber.ToString);
Debug.WriteLine("Поле в источнике данных = " + Entry.Field);
Debug.WriteLine("Номер записи в источнике данных = " + Entry.SourceRecord.ToString);
Debug.WriteLine("Номер поля в источнике данных = " + Entry.SourceField.ToString);
Debug.WriteLine("Номер записи в приемнике данных = " + Entry.DestRecord.ToString);
Debug.WriteLine("Номер поля в приемнике данных = " + Entry.DestField.ToString);
Debug.Unindent;
End For;
Except On e: Exception Do
Debug.WriteLine(e.Message);
Finally
End Try;
End Sub UserProc;
В результате выполнения примера будет выполнен импорт данных из файла «D:\Indicator_Data.xlsx» в базу данных временных рядов «TSDB_UNPIVOT». Ошибки импорта будут выведены в окно консоли.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Dt;
Imports Prognoz.Platform.Interop.Rds;
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
desc: IMetabaseObjectDescriptor;
importObject: IImportRequestDefinition;
createInfo: IMetabaseObjectCreateInfo;
ImportParams: IImportRequestProviderParams;
importBinding: ICubeMetaLoaderBinding;
Bindings: ICubeMetaLoaderBindings;
rdsDictionary: IRdsDictionary;
excel: IDtExcelProviderEx;
instance: IImportRequestInstance;
importResult: IImportRequestResult;
Log: ICubeMetaLoaderLog;
LogStr: String;
count, i: Integer;
entry: ICubeMetaLoaderLogEntry;
rub: IRubricator;
Unpivot: IDtUnpivotProvider;
Attributes: IMetaAttributes;
Begin
MB := Params.Metabase;
// Получаем и очищаем базу данных временных рядов
desc := mb.ItemById["TSDB_UNPIVOT"];
rub := desc.Bind() As IRubricator;
rub.Truncate();
// Создаем объект для импорта временных рядов
createInfo := mb.CreateCreateInfo();
createInfo.ClassId := MetabaseObjectClass.KE_CLASS_IMPORTREQUEST As integer;
// Задаем параметры объекта
createInfo.Name := "Импорт из файла";
createInfo.KeepEdit := True;
createInfo.Permanent := False;
createInfo.Parent := desc;
importObject := mb.CreateObject(createInfo) As IImportRequestDefinition;
// Задаем тип источника, из которого будут импортироваться данные
importObject.SourceType := ImportRequestSourceType.irstProvider;
// Задаем базу данных временных рядов, в которую будут импортироваться данные
importObject.DestinationRubricator := desc.Bind() As IRubricator;
// Задаем параметры импорта
ImportParams := importObject.ProviderParams;
// Снимаем ограничение на максимальное количество ошибок в отчете о импорте данных
(ImportParams As ICubeMetaLoader).Log.MaxErrors := -1;
// Получаем привязки атрибутов
Bindings := ImportParams.Bindings;
// Получаем атрибуты временных рядов;
Attributes := rub.Facts.Attributes;
// Получаем справочник, на который ссылается атрибут «COUNTRY»
desc := Attributes.FindById("COUNTRY").ValuesObject;
rdsDictionary := desc.Bind() As IRdsDictionary;
// Создаем привязку для атрибута «COUNTRY»
importBinding := Bindings.Add();
importBinding.BindingType := CubeMetaLoaderBindingType.cmlbtAttribute;
importBinding.Attribute := "COUNTRY";
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item[0].Id;
// Указываем, что данные для атрибута будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.cmlftIndex;
// Указываем номер поля
importBinding.Field := "0";
// Получаем справочник, на который ссылается атрибут «INDICATOR»
desc := Attributes.FindById("INDICATOR").ValuesObject;
rdsDictionary := desc.Bind() As IRdsDictionary;
// Создаем привязку для атрибута «INDICATOR»
importBinding := Bindings.Add();
importBinding.BindingType := CubeMetaLoaderBindingType.cmlbtAttribute;
importBinding.Attribute := "INDICATOR";
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item[1].Id;
// Указываем, что данные для атрибута будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.cmlftIndex;
// Указываем номер поля
importBinding.Field := "1";
// Получаем справочник, на который ссылается атрибут «UNIT»
desc := Attributes.FindById("UNIT").ValuesObject;
rdsDictionary := desc.Bind() As IRdsDictionary;
// Создаем привязку для атрибута «UNIT»
importBinding := Bindings.Add();
importBinding.BindingType := CubeMetaLoaderBindingType.cmlbtUnit;
importBinding.Dimension := rdsDictionary As IDimensionModel;
importBinding.KeyAttribute := rdsDictionary.Attributes.Key.Id;
importBinding.Index := rdsDictionary.UniqueKeys.Item[0].Id;
// Указываем, что в качестве данных атрибута будет браться заданное значение
importBinding.FieldType := CubeMetaLoaderFieldType.cmlftConstValue;
// Задаем значение атрибута
importBinding.FieldValue := 1 As object;
// Создаем привязку для календаря
importBinding := Bindings.Add();
importBinding.BindingType := CubeMetaLoaderBindingType.cmlbtCalendar;
importBinding.ByColumns := False;
importBinding.CalendarDateFormatEx[DimCalendarLevel.dclYear] := "$Year$";
importBinding.CalendarOptions.Levels := DimCalendarLevelSet.dclsYear;
// Указываем, что данные для календаря будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.cmlftIndex;
// Указываем номер поля
importBinding.Field := "2";
// Создаем привязку для значений временных рядов
importBinding := Bindings.Add();
importBinding.BindingType := CubeMetaLoaderBindingType.cmlbtValue;
// Указываем, что значения будут браться по номеру поля в источнике данных
importBinding.FieldType := CubeMetaLoaderFieldType.cmlftIndex;
// Указываем номер поля
importBinding.Field := "3";
// Настраиваем источник данных
Try
excel := New DtExcelProviderEx.Create();
// Задаем параметры файла, из которого будет импортировать данные
excel.File := "D:\Indicator_Data.xlsx";
excel.Sheet := "Лист1";
excel.Format := "XLSX";
Excel.HasHeader := False;
// Задаем расположение областей данных в файле-источнике
Unpivot := New DtUnpivotProvider.Create();
Unpivot.Provider := Excel;
Unpivot.LeftEnd := 2;
Unpivot.DataWidth := 2;
Unpivot.DataTop := 3;
Unpivot.DataBottom := 5;
Unpivot.HeadBottom := 2;
Unpivot.DataRight := 8;
Unpivot.HeadColumn := 1;
Unpivot.LeftBegin := 1;
Unpivot.HeadTop := 2;
// Выполняем загрузку данных
Unpivot.Open();
count := Unpivot.Fields.Count;
importObject.ProviderParams.Provider := Unpivot As IDatasetDataProvider;
instance := (importObject As IMetabaseObject).Open(Null) As IImportRequestInstance;
Instance.LoadData();
// Получаем отчет о загрузке данных
importResult := instance.ImportResult;
Log := importResult.Log;
count := Log.Count;
// Выводим отчет в окно консоли
System.Diagnostics.Debug.WriteLine("Количество записей = " + Count.ToString());
For i := 0 To Count - 1 Do
Entry := Log.Item[i];
LogStr := i.ToString() + ": "
+ (Entry.IsError ? "Ошибка: " :(Entry.IsMessage ? "Сообщение: " : "Предупреждение: "))
+ Entry.ErrorMessage;
System.Diagnostics.Debug.WriteLine(LogStr);
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Номер записи = " + Entry.RecordNumber.ToString());
System.Diagnostics.Debug.WriteLine("Значение записи = " + Entry.ValueRecordNumber.ToString());
System.Diagnostics.Debug.WriteLine("Поле в источнике данных = " + Entry.Field);
System.Diagnostics.Debug.WriteLine("Номер записи в источнике данных = " + Entry.SourceRecord.ToString());
System.Diagnostics.Debug.WriteLine("Номер поля в источнике данных = " + Entry.SourceField.ToString());
System.Diagnostics.Debug.WriteLine("Номер записи в приемнике данных = " + Entry.DestRecord.ToString());
System.Diagnostics.Debug.WriteLine("Номер поля в приемнике данных = " + Entry.DestField.ToString());
System.Diagnostics.Debug.Unindent();
End For;
Except On e: Exception Do
System.Diagnostics.Debug.WriteLine(e.Message);
Finally
End Try;
End Sub;
См. также: