Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: Ещё раз о InternalCalc в ADCDS
Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/06 06:15
 
Здравствуйте Дмитрий.

Довольно долго не трогал AD (хочу использовать его как InMemDS взамен CDS)

Есть некоторые баги:

1. Не работают агрегаты поверх InternalCalc

2. Если в DS, в котором есть поля InternalCalc фильтровать по выражению
(свойство Filter), то глотается первая строка. Хотя она фильтрации не подлежит. Если же при создании DS (CreateDataSet), фильтрация уже установлена, то бага не наблюдается.
(Мои чувства вовремя поиска данного бага сложно передать словами ).

Заранее спасибо.
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 00:53
 
Привет

У меня не получилось воспроизвести описанные вами проблемы. Буду благодарен, если вы предоставите тестовый пример.

Удачи,
Дмитрий
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 03:38
 
>У меня не получилось воспроизвести описанные вами проблемы. Буду >благодарен, если вы предоставите тестовый пример.

Вот приготовил.
Ничего, что оба бага на одной форме?

Из того что я заметил
по 1. Агрегат по InternalCalc считается по предыдущему состоянию (до последнего изменения), но иногда выдает совсем непонятно что.
Может где-то при подсчете участвует ссылка на не актуальные (но не очещенные) данные.

по 2. Оказалось что удаляется не только первая строка (почему в моей исходной проге это происходило - незнаю), а все строки при установке Filtered:=true. Но если до создания DS фильтрация уже была установлена,
то все работает, как надо (если конечно же не трогать фильтр)
И всё это только при наличии InternalCalc (для fkCalculated все OK).
File Attachment:
File name: ADTestCase.zip
File size:4002 bytes
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 05:09
 
Привет

1. Не работают агрегаты поверх InternalCalc
Ok. С этим разобрался. Для исправления, откройте daADCompDataSet.pas, найдите в нем метод TADDataSet.SetFieldData. В нем строки:

         if oRow.RowState in [rsInsertedrsModifiedrsUnchangedthen           oRow.BeginEdit;         oRow.SetData(iColIndexpDataiLen);



Замените на:

         if oRow.RowState in [rsInsertedrsModifiedrsUnchangedthen begin           lEndEdit := State in [dsCalcFieldsdsInternalCalc];           oRow.BeginEdit;         end         else           lEndEdit := False;         oRow.SetData(iColIndexpDataiLen);         if lEndEdit then           oRow.EndEdit(True);


И переменную lEndEdit добавьте в VAR.

2. Если в DS, в котором есть поля InternalCalc фильтровать по выражению
Так и не увидел бага ... Может этот патч исправил и его. Попробуйте и дайте мне знать.

Удачи,
Дмитрий
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 05:22
 
При компиляции пишет что, too many params
(Как я понимаю наверное было добавлен параметр с дефолт значением false)
[src]
...
if lEndEdit then
oRow.EndEdit(True); <<--
[/src]
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 05:24
 
Да, так. Просто уберите аргумент у EndEdit.
Re:Ещё раз о InternalCalc в ADCDS
Posted: 2007/08/07 05:42
 
Спасибо.
Всё работает.
Видимо действительно оба бага имели один корень.

Есть какие-нибудь уточняющие данные о выходе беты.

Также хотелось бы посмотреть IB/FB драйвер - возможно он мне в некоторых ситуациях больше подойдет, чем FIB+.
Могу попробовать по-тестить его на моих запросах.