Locate и Assertion failure line 2573

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов

Ответить
vostden
Сообщения: 4
Зарегистрирован: Чт 28 дек 2017 05:50

Locate и Assertion failure line 2573

Сообщение vostden » Пн 07 май 2018 09:01

Доброго времени суток!

Наша команда работает на Delphi 2010 и ODAC 10.0.2
Проблема следующая:
Есть датасет TOraQuery.
В нём в дизайнере объявлены поля. Одно из полей - "MyLookUpField" - является lookup - полем. Так же есть вычисляемое поле "MyCalcField" (calculated) и задан обработчик OnCalcFields.
Далее в рантайм датасет открывается, но по условию выборки не было возвращено ни одной записи - т.е. датасет пуст.
Далее мы вызываем метод Locate('MyCalcField', Null, []). Автоматически запускается обработчик OnCalcFields. в нём идёт присваивание

Код: Выделить всё

DataSet.FieldByName('MyCalcField').AsString := DataSet.FieldByName('Field1').AsString + ' ' 
+ DataSet.FieldByName('Field2').AsString;
И вот тут возникает ошибка:
"Assertion failure (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, line 2573)"

По стеку частично видно, что всему этому предшествует вызов lookup от поля MyLookUpField. Должно ли это происходить при пустом датасете?
Если убрать из Fields лукап поле, то ошибки Assertion failure не возникает.. Датасет на который ссылается лукап-поле открыт и стабильно в dsBrowse (т.е. проблема явно не в нём).

К сожалению не удалось воспроизвести на демо проекте.
Два главных вопроса:
1. Если TOraQuery пуст и делается Locate по calc-полю, должны ли происходить вызовы lookup, до входа в обработчик OnCalcFields?
2. Если даже Assertion failure не происходит, то по DataSet.Field.AsString возвращаются мусорные данные. Является ли это багом? Ведь NullAsStringValue = ''.
Прикладываю демо проект, где это прослеживается.

Оконечный стек при Assertion failure:

Код: Выделить всё

:775cc54f KERNELBASE.RaiseException + 0x58
:06e00d09 RaiseExceptionProcHook + $71
:06a3e1a0 TData.GetFieldData + $188
:06b05115 TCRRecordSet.GetFieldData + $1ED
:07509808 TOCIRecordSet.GetFieldData + $90
:06a3e3f0 TData.GetField + $D4
:06aa168d TMemDataSet.GetFieldData + $85
Вложения
DatasetLocate.7z
(3.72 КБ) 54 скачивания

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: Locate и Assertion failure line 2573

Сообщение MaximG » Вт 08 май 2018 10:36

Спасибо за Вашу информацию. Действительно описываемая Вами ошибка имела место в ODAC 10.0.2 и в настоящее время исправлена. Проверьте работу своего проекта с помощью последней версии ODAC 10.1.5 (02-Apr-2018)

Ответить