CalcFieldsErrors: IDtCalcFieldErrors;
CalcFieldsErrors: Prognoz.Platform.Interop.Dt.IDtCalcFieldErrors;
Свойство CalcFieldsErrors возвращает коллекцию ошибок, возникших при расчете вычисляемых полей.
Ошибки могут было получены только после вызова одного из следующих методов: IDtConsumer.Put, IDtConsumer.PutProvider, IDtConsumer.PutRow.
Для выполнения примера в файловой системе предполагается наличие файла «c:\Import Text.txt» с данными.
Добавьте ссылки на системные сборки: Dal, Dt, Metabase.
Содержимое файла «c:\Import Text.txt»
Sub UserProc;
Var
mb: Imetabase;
DTConsumer: IDtTextConsumer;
DTProviderWithData: IDtTextProvider;
Errors: IDtCalcFieldErrors;
Error: IDtCalcFieldError;
FieldsIn, FieldsOut: IDtFieldDefinitions;
FieldIn, FieldOut: IDtFieldDefinition;
i: Integer;
Begin
// Получаем текущий репозиторий
mb := MetabaseClass.Active;
// Создаем текстовый приёмник данных
DTConsumer := New DtTextConsumer.Create;
// Задаем базовые параметры приёмника
DTConsumer.FormatType := DtTextFormatType.Delimited;
DTConsumer.RowDelimiter := #13 + #10;
DTConsumer.DelimitedColumnDelimiter := ";";
DTConsumer.Encoding := "WIN";
DTConsumer.DelimitedTextQualifier := """";
DTConsumer.WriteHeader := True;
DTConsumer.Metabase := mb;
// Указываем файл, в который будут выгружены данные
DTConsumer.File := "c:\Export Text.txt";
// Создаем текстовый источник данных
DTProviderWithData := New DtTextProvider.Create;
// Задаем базовые параметры источника
DTProviderWithData.FormatType := DtTextFormatType.Delimited;
DTProviderWithData.RowDelimiter := #13 + #10;
DTProviderWithData.DelimitedColumnDelimiter := ";";
DTProviderWithData.Encoding := "WIN";
DTProviderWithData.DelimitedTextQualifier := """";
DTProviderWithData.RangeHasHeader := True;
DTProviderWithData.Metabase := mb;
// Указываем файл, из которого будут загружены данные
DTProviderWithData.File := "c:\Import Text.txt";
// Загружаем поля источника из файла
DTProviderWithData.FieldsFromFile;
// Получаем поля источника и приёмника
FieldsIn := DTConsumer.Fields;
FieldsOut := DTProviderWithData.Fields;
// Обрабатываем каждое из полученных полей
For Each FieldOut In FieldsOut Do
// Указываем тип поля источника
FieldOut.DataType := DbDataType.Integer;
// Добавляем поле в приёмник данных
FieldIn := FieldsIn.Add;
// Указываем, что базовые параметры добавленного поля в приёмнике
// будут совпадать с соответствующим полем из источника
FieldIn.DataDomain := FieldOut.DataDomain;
FieldIn.DataType := FieldOut.DataType;
FieldIn.Name := FieldOut.Name;
FieldIn.Precision := FieldOut.Precision;
FieldIn.Size := FieldOut.Size;
// Если поле в источнике вычисляемое, то и в приёмнике
// будет использоваться аналогичное выражение
If FieldOut.IsCalculated Then
FieldIn.Expression.AsString := FieldOut.Expression.AsString;
End If;
End For;
// Укажем выражение для расчета поля с индексом 1 в приёмнике данных
FieldIn := FieldsIn.Item(1);
// Выражение будет основано на значении поля с индексом 1 из источника данных
FieldOut := FieldsOut.Item(1);
FieldIn.Expression.AsString := FieldOut.Name + " + 2";
// Открываем и очищаем приёмник данных
DTConsumer.Open;
DTConsumer.Clear;
// Экспортируем значения из источника в приёмник
DTConsumer.PutProvider(DTProviderWithData);
// Получаем ошибки, возникшие при расчете вычисляемых полей
Errors := DTConsumer.CalcFieldsErrors;
// Выводим ошибки в окно консоли
If Errors.Count > 0 Then
For i := 0 To Errors.Count Do
Error := Errors.Item(i);
Debug.WriteLine("В строке №" + Error.Row.ToString + " в поле " + Error.Field + " произошла ошибка");
Debug.WriteLine("Текст ошибки: " + Error.Message);
End For;
End If;
// Закрываем приёмник данных
DTConsumer.Close;
End Sub UserProc;
В результате выполнения примера данные из файла «c:\Import Text.txt» будут выгружены в файл «Export Text». Для исходных данных будет применена формула: значение поля с индексом «1» из источника данных будет увеличено на два. Если в процессе вычисления формулы возникнут ошибки, то они будут выведены в окно консоли.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Dal;
Imports Prognoz.Platform.Interop.Dt;
…
Public Shared Sub Main(Params: StartParams);
Var
mb: Imetabase;
DTConsumer: IDtTextConsumer;
DTProviderWithData: IDtTextProvider;
Errors: IDtCalcFieldErrors;
Error: IDtCalcFieldError;
FieldsIn, FieldsOut: IDtFieldDefinitions;
FieldIn, FieldOut: IDtFieldDefinition;
i: Integer;
Begin
// Получаем текущий репозиторий
mb := Params.Metabase;
// Создаем текстовый приёмник данных
DTConsumer := New DtTextConsumer.Create();
// Задаем базовые параметры приёмника
DTConsumer.FormatType := DtTextFormatType.tftDelimited;
DTConsumer.RowDelimiter := char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10);
DTConsumer.DelimitedColumnDelimiter := ";";
DTConsumer.Encoding := "WIN";
DTConsumer.DelimitedTextQualifier := """";
DTConsumer.WriteHeader := True;
DTConsumer.Metabase := mb;
// Указываем файл, в который будут выгружены данные
DTConsumer.File := "c:\Export Text.txt";
// Создаем текстовый источник данных
DTProviderWithData := New DtTextProvider.Create();
// Задаем базовые параметры источника
DTProviderWithData.FormatType := DtTextFormatType.tftDelimited;
DTProviderWithData.RowDelimiter := char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10);
DTProviderWithData.DelimitedColumnDelimiter := ";";
DTProviderWithData.Encoding := "WIN";
DTProviderWithData.DelimitedTextQualifier := """";
DTProviderWithData.RangeHasHeader := True;
DTProviderWithData.Metabase := mb;
// Указываем файл, из которого будут загружены данные
DTProviderWithData.File := "c:\Import Text.txt";
// Загружаем поля источника из файла
DTProviderWithData.FieldsFromFile();
// Получаем поля источника и приёмника
FieldsIn := DTConsumer.Fields;
FieldsOut := DTProviderWithData.Fields;
// Обрабатываем каждое из полученных полей
For Each FieldOut In FieldsOut Do
// Указываем тип поля источника
FieldOut.DataType := DbDataType.ddtInteger;
// Добавляем поле в приёмник данных
FieldIn := FieldsIn.Add();
// Указываем, что базовые параметры добавленного поля в приёмнике
// будут совпадать с соответствующим полем из источника
FieldIn.DataDomain := FieldOut.DataDomain;
FieldIn.DataType := FieldOut.DataType;
FieldIn.Name := FieldOut.Name;
FieldIn.Precision := FieldOut.Precision;
FieldIn.Size := FieldOut.Size;
// Если поле в источнике вычисляемое, то и в приёмнике
// будет использоваться аналогичное выражение
If FieldOut.IsCalculated Then
FieldIn.Expression.AsString := FieldOut.Expression.AsString;
End If;
End For;
// Укажем выражение для расчета поля с индексом 1 в приёмнике данных
FieldIn := FieldsIn.Item[1];
// Выражение будет основано на значении поля с индексом 1 из источника данных
FieldOut := FieldsOut.Item[1];
FieldIn.Expression.AsString := FieldOut.Name + " + 2";
// Открываем и очищаем приёмник данных
DTConsumer.Open();
DTConsumer.Clear();
// Экспортируем значения из источника в приёмник
DTConsumer.PutProvider(DTProviderWithData);
// Получаем ошибки, возникшие при расчете вычисляемых полей
Errors := DTConsumer.CalcFieldsErrors;
// Выводим ошибки в окно консоли
If Errors.Count > 0 Then
For i := 0 To Errors.Count Do
Error := Errors.Item[i];
System.Diagnostics.Debug.WriteLine("В строке №" + Error.Row.ToString() + " в поле " + Error.Field + " произошла ошибка");
System.Diagnostics.Debug.WriteLine("Текст ошибки: " + Error.Message);
End For;
End If;
// Закрываем приёмник данных
DTConsumer.Close();
End Sub;
См. также: