Все особенности, улучшения и исправления FIBPlus в версиях
5.0-6.7
Особенности и улучшения версии 5.0:
- Переписан редактор FIBPlus DataSet Repository.
- В TpFIBDatabase добавлено свойство
FIBDatabase.UseRepositaries. Если установить его равным False, вы
можете насильно отключить любую поддержку репозитариев во всем
приложении.
- Свойство useRepositaries переименовано в useRepositories
- Добавлены поля в FIBPlus DataSet Repository:
UPDATE_TABLE_NAME,
UPDATE_ONLY_MODIFIED_FIELDS,
CONDITIONS
- Добавлен метод TFIBXSQLDA.AssignValues.
- Таймеры для датасетов теперь создаются не безусловно, а
только при необходимости.
- FIBDatabase.CacheSchemaOptions Добавлено свойство
ValidateAfterLoad : boolean;
Если его отключить, FIBPlus не будет пытаться проверить сохраненную
схему метаданных после загрузки.
- У TpFIBQuery появилась public read-write свойство:
PlanClause.
- В SQLEditor кнопка SaveSQL перестала проверять синтаксис
SQL, если соответствующая проверка выключена
- Модуль SqlTxtRtns полностью переписан.
- Изменено поведение UpdateTransaction. Теперь оно
запускается только при выполнении модифицирующего запроса. Подготовка
запроса выполняется в открытых транзакциях.
- Теперь TpFIBDatabase.Gen_Id вызывается в первой доступной
открытой транзакции, а не создает свою собственную транзакцию.
- Улучшена работа с новыми ключевыми словами InterBase.
- Свойство AsIn64 добавлено в TFIBBCDField (для всех версий
Delphi начиная с Delphi 4).
- Свойство, отвечающее за шаг генератора было добавлено в
AutoUpdateOptions у TpFIBDataSet.
- Некоторые события были переименованы:
* TpFIBDatabase.Onlogin изменено на BeforeConnect,
* TpFIBDatabase.OnConnect изменено на AfterConnect.
- Поддержка исключений сервера при работе с Foreign Keys,
Check Constraints и Unique Constraints добавлена в TpFibErrorHandler.
Чтобы активизировать данную особенность, нужно активизировать
соответствующую опцию в свойстве Options property у TpFIBErrorHandler и
создать следующую таблицу в базе данных:
CREATE TABLE FIB$ERROR_MESSAGES (CONSTRAINT_NAME VARCHAR(67) NOT NULL,
MESSAGE_STRING VARCHAR(100), FIB$VERSION INTEGER, CONSTR_TYPE
VARCHAR(11) DEFAULT 'UNIQUE' NOT NULL);
Создание данной таблицы и работа с ней теперь реализована в редакторе
компонента TpFIBDataBase.
- В AutoUpdateOptions добавлено два новых свойства:
- ParamsToFieldsLinks: TStrings. Позволяет задать
соответствие между полями датасета и параметрами в форме
FieldName=ParamName. затем это соответствие используется во внутреннем
обработчике перед вызовом OnNewRecord. Значение параметра автоматически
задается указанному полю.
- AutoParamsToFields: boolean. Если вы зададите этому
свойству значение True, TpFIBDataSet постарается задать свойство
ParamsToFieldsLinks самостоятельно, проанализировав текст SelectSQL
(только в run-time).
- В TpFIBDatabase добавлено свойство
DefaultUpdateTransaction. Все TpFIBDataSet, добавленные на форму после
задания DefaultUpdateTransaction, будут использовать это значение
свойства для того, чтобы задать свойство UpdateTransaction.
- У TpFIBTransaction появились методы:
* SetSavePoint(const Name: string) и
* RollBackToSavePoint(const Name: string)
(только для FB 1.5)
- У TpFIBDatabase появилось свойство
ServerActiveTransactions: TStringList, которое возвращает список
идентификаторов активной транзакции текущей базы данных на сервере.
Этот список возвращает ID список активных на данных момент транзакций.
(только для FB 1.5)
- Минорные изменения в TFIBSQLMonitor, которые позволяют
отслеживать новые операции с SavePoint.
Исправленные ошибки:
- При открытии SQL Generator был виден список таблиц из базы,
а в ListBoxе написано "Closed". Исправлено.
- В редакторе SQL не выделялись цветом названия изменённых
запросов. Исправлено.
- У датасета в AutoUpdateOptions ни в какую не добавлялись
варианты выбора ключевого поля (KeyFields) BIGINT. Исправлено.
- Исправлено множество ошибок в работе репозитариев.
- Design-Time редактор Options у TpFibDataSet не работал,
если было выбрано несколько компонент. Исправлено.
- Переполнение стека при попытке изменить OrderClause, если
до этого был использовано свойство Conditions. Исправлено.
- Неправильная работа BatchOutputRawFile, если в запросах
существовали VARCHAR поля. Исправлено.
- Некоторые исправления в методе FullRefresh. (иногда слетала
текущая позиция)
- Исправлен слет UpdateTransaction, если у датабэйса был
назначен дефолтный UpdateTransaction. Исправлено.
- Улучшена работа с макросами, в частности, исправлена ошибка
при обработке некоторых SQL с макросами
- Исправлено:
See pFIBDataSet.InternalPostRecord
UpdateBlobInfo(Buff,True,False,CachedUpdates);
^^^^^^^^^^^^^
CachedUpdates =>> ForceWrite in DoFinalize
Если CachedUpdates равно true, Blob поля всегда отсылались. Исправлено.
- Слетали default поля при FullRefresh. Исправлено.
- Полностью переписан unit SqlTxtRtns;
- Вставка в пустой датасет при использовании отдельной
модифицирующей транзакции. Изменения в блоб поле в этом случае не
записывались. Исправлено.
- Bool поля в некоторых случаях эмулировались только после
переоткрытия Delphi. Исправлено.
- Field дизайнер не поднимался в том случае, если в датасете
был записан неправильный SelectSQL. Исправлено.
- Исправлены ошибки при работе с RDB$DB_KEY.
- Неправильная проверка транзакции при ApplyUpdates.
Исправлено.
- Ошибка в FIBDatabase.QueryValue, если возвращаемое поле
является блобом. Исправлено.
- Проблема с нетекстовыми BLOB полями устранена.
- Ошибки в функциях макросов. Исправлены.
- Ошибки с DDL запросами. Исправлены.
- AV в SQL Editor исправлено.
- Исправлены ошибки в редакторе свойства Options в
TpFIBDataSet.
- Ошибки использования RDB$DB_KEY в TpFIBDataSet. Исправлены.
- Ошибки, которые появлялись при проверке активных транзакций
в ApplyUpdates. Исправлены.
- Ошибки в FIBDatabase.QueryValue, если возвращаемое поле
BLOB. Исправлены.
- Изменения BLOB-полей не сохранялись после вставки записи в
пустой датасет в контексте отдельной модифицирующий транзакции.
Исправлено.
- Ошибка в методе LocateNext. Исправлена.
- Ошибка эмуляции Boolean-полей в design-time. Исправлена.
- Ошибка, при которой не запускался Field Editor, если в
TpFIBDataSet был задан некорректный SelectSQL. Исправлена.
- Ошибка работы с запросами вида "Select for update".
Исправлена.
- Ошибка обработки Cancel после exception во время выполнения
запроса INSERT. Исправлена.
- Ошибка, вызывающая удаление полей по умолчанию после вызова
метода FullRefresh.
Особенности и улучшения версии 5.0.8:
- Добавлена возможность обращения к калк полям из обработчика
OnFilterRecord.
Исправления:
- Искажение дефолтных значений, при включенной опции
pfImportDefaultValues в PrepareOptions. Исправлено.
- При попытке открыть редактор 'Edit field information table'
появлялось сообщение "List index out of bounds (1074778116)".
Исправлено.
- TFIBFloatField неправильно отображал значение Float полей.
Исправлено.
- UpdateOnlyModified не работал с CachedUpdates. Исправлено.
- Не обновлялся статус записи после CommitUpdToCach.
Исправлено.
- Неправильное получение и обработка некоторых дефолтных
значений полей (pfImportDefaultValues). Исправлено.
- Убраны некоторые дефайны из FIBPlus.inc. (В связи с
прекращением поддержки Delphi 3-4).
- Мелкое исправление в редакторе запросов. Кнопка "Clear SQL"
не очищала содержимое текущего запроса.
- Правки в юнитах FIBDataSet и pFIBDataSet.
- Ошибка в процедуре OpenAsClone. Исправлена.
- Подправлен TIBSuperAlerter.
- Ликвидирована утечка памяти, которая проявлялась при работе
с запросами, возвращающими пустой набор данных.
Особенности и улучшения версии 5.1:
- Добавилась возможность указания пути на клиентскую
библиотеку для отдельно взятой TpFIBDatabase! (разные gds32.dll,
fbclient.dll).
- Введено свойство у датасета
RefreshTransactionKind:TTransactionKind, где
TTransactionKind=(tkReadTransaction,tkUpdateTransaction); Оно
определяет, в контексте какой транзакции будет выполняться Refresh.
Если датасет не имеет отдельной UpdateTransaction, то значение свойства
игнорируется.
- Изменена функция CompareBookmarks.
- Тип TTransactionAction в юните unit IB_Services;
переименован в TServiceTransactionAction во избежание конфликта с типом
TTransactionAction в юните FIBDatabase.
Исправленные ошибки:
- Исправлена работа TpFIBDataSet.Locate Description: и
TpFIBDataSet.Locate по датасету, имеющему удаленные или отфильтрованные
записи.
- Устранен разрыв соединения при работе с версиями
ИБ<6.
- Ошибка при работе с блобами (иногда неверно реагировали на
DataSet.Cancel)
- Ошибка в обработке String полей. Проявлялась при попытке
присвоить пустую строку.
- Ошибка при обработке некоторых ключевых слов.
- Ошибка при отмене вставки записи в пустой датасет.
Проявлялась, если перед отменой была попытка неудачного Post.
- Изменения в работе LockRecord (неправильно работал при
некоторых особенностях текста в UpdateSQL)
Особенности и улучшения версии 5.2:
-
Добавились обработчики FIBDataSet:
- property BeforeStartTransaction: TNotifyEvent;
- property AfterStartTransaction: TNotifyEvent;
- property BeforeEndTransaction: TEndTrEvent;
- property AfterEndTransaction: TEndTrEvent;
- property BeforeStartUpdateTransaction: TNotifyEvent;
- property AfterStartUpdateTransaction: TNotifyEvent;
- property BeforeEndUpdateTransaction: TEndTrEvent;
- property AfterEndUpdateTransaction: TEndTrEvent;
- В SQL Generator добавлена возможность генерировать не все
модифицирующие запросы сразу, а только один выбранный.
- Добавлен редактор компонента для pFIBQuery.
- Переписаны такие редакторы компонентов как SQL Generator и
диалог для редактирования Dataset Repository.
- Добавлена опция poFetchAll в свойство TpFIBDataSet.Options.
При включенной опции, после открытия TpFIBDataSet, все записи
автоматически закачиваются с сервера.
- У TpFIBDataSet добавлено новое событие OnApplyDefaultValue:
TOnApplyDefaultValue, где TOnApplyDefaultValue = procedure (DataSet:
TDataSet; Field: TField; var Applied: boolean) of object;
Обработчик события вызывается во время вставки новой записи, для
каждого поля имеющего непустой DefaultExpression. В обработчике вы
можете самостоятельно обработать DefaultExpression для ваших полей,
если стандартная процедура обработки с ними не справляется. Задайте
значение Applied равным True, если вы самостоятельно обработали
выражение. В этом случае стандартная обработка производиться не будет.
- Изменено поведение при проверке сохраненного кэша
метаданных. Сейчас проверка производится не сразу после подключения, а
частями по мере необходимости. Таким образом, если какая-то часть кэша
в текущем сеансе не потребуется, то и проверяться она не будет.
- Введено сохранение кэша DataSet Repository. В связи с этим
в таблицу DataSet Repository добавлено еще одно поле, содержащее номер
версии записи репозитария. Для автоматического изменения структуры
таблицы репозитария вызовите редактор репозитария при помощи
выпадающего меню на TpFIBDatabase.
- Введена глобальная переменная FIBHideGrantError: boolean =
False. Когда значение переменной равно True, то при отсутствии прав на
модификацию данных, TpFIBDataSet отключает возможность редактирования
или удаления без вывода сообщений об ошибке.
- В TpFIBDataSet добавлено событие OnCompareFieldValues:
TCompareFieldValues, где TCompareFieldValues = function (Field: TField;
const S1,S2: variant): integer of object. Обработчик события вызывается
в процессе локальной сортировки. При помощи этого обработчика вы можете
самостоятельно управлять порядком сортировки, сравнивая попарно
переданные значения.
- Включена поддержка комментариев с маркером '--'.
- В FIBPlusTools добавлена возможность задавать умолчания для
свойства TpFIBDataSet.DefaultFormats.
Исправленные ошибки:
- Ликвидирована мелкая ошибка при работе в режиме
poProtectedEdit.
- Исправлены мелкие погрешности в процедурах сохранения
свойства Conditions в dfm-файл.
- Теперь при активном режиме poImportDefaultValue,
DefaultExpression для строковых полей безусловно обрамляется одинарными
кавычками. Старая реализация порождала проблемы с ClientDataSet, если
строковое поле имело значение по умолчанию вида '1xxxxx'.
- Переписан способ хранения свойства Options в dfm-файле.
- Подправлена замена NULL параметров на "Is Null". Ранее
замена работала неправильно в случаях конструкций вида ttt = :ttt
<арифметическая операция> <выражение>.
- Ликвидирован Stack Overflow при попытке локальной
сортировки по вычислимому полю.
- Исправлена неправильная работа TpFIBDataSet в режиме
poProtectedEdit. (Текущая позиция в TFIBDataSet иногда терялась).
- Исправлена ошибка «XSQLDA index out of
range» при работе с макросами в датасетах с опцией
poNoForceIsNull.
- Подправлена процедура локальной сортировки.
- Исправлена работа с блоб-полями для датасетов, работающих с
двумя транзакциями.
- В Delphi 5 после ReopenLocate в data-aware controls не
возникало событие изменения данных, т.е. показывались старые данные.
Исправлено.
- После выполнения Append свойство RecNo возвращало
неправильное значение. Оно всегда было равно 1 вне зависимости от
реального количества записей. Исправлено.
- Устранена несовместимость режимов poProtectedEdit и
UpdateOnlyModifiedFields.
Особенности и улучшения версии 5.3:
- Теперь метод TpFIBTableInfo.GetPrimaryKeyFields закрывает
транзакцию, если сам ее предварительно открывал.
- В FIBDataSet добавлены методы.
procedure BatchRecordToQuery(ToQuery: TFIBQuery);
procedure BatchAllRecordsToQuery(ToQuery: TFIBQuery);
BatchRecordToQuery - заносит в указанный запрос (ToQuery) значения
параметров, взятые из полей текущей записи и выполняет запрос.
BatchAllRecordsToQuery - выполняет BatchRecordToQuery для всех записей
датасета.
- Добавлен новый тип поля: TFIBGuidField.
- Новая опция psUseGuidField в FIBDataSet.PrepareOptions.
Работает по аналогии с psUseBooleanField. То есть, если поле имеет
домен, в названии которого есть строка 'GUID', то на клиенте он
представляется в виде экзмепляра TFIBGuidField.
- Значения полей TFIBGuidField генерируются в обработчике
события OnNewRecord автоматически, если свойство AutoGenerateValue поля
равно arAutoInc.
- В TpFIBDatabase добавлен метод CreateGUIDDomain. Создает в
базе данных специальный домен для полей типа GUID.
- В TFIBXSQLVAR добавлены методы поддержки GUID-полей:
function GetAsGUID: TGUID;
procedure SetAsGuid (aValue: TGUID);
- В TpFIBDataSet добавлены методы DisableCalcFields и
EnableCalcFields. Выключают-включают автоматический вызов обработчика
OnCalcFields.
- Семейство методов Locate выключают пересчет calc-полей на
время своей работы, если в искомых полях нет ни calc, ни lookup поле
- В SQL Editor добавлено отображение текущей позиции курсора
в тексте SQL.
- Теперь такие методы TpFIBDatabase как
function QueryValues(const aSQL: string): Variant; overload;
function QueryValues(const aSQL: string; ParamValues: array of
variant):Variant; overload;
возвращают в виде вариантного массива значения всех полей указанного
запроса.
- Теперь вызовы Before/AfterScroll при Locate
- при неуспешном Locate вообще не вызываются.
- при успешном на старой записи вызывается BeforeScroll,
а на новой – AfterScroll
Исправленные ошибки:
- Подправлена работа свойства AsBoolean в TFIBXSQLVAR.
(Поддержка для типов SmallInt и Integer).
- Исправления в процедуре FormatExtended из юнита StdFuncs
(некорректно работало при некоторых форматах).
- Изменен порядок вызова обработчика AfterConnect.
- Добавлены условные директивы для packages из D7. (Убраны
замечания по поводу unsafe code).
- RefreshClientFields изменял флаг Eof. Исправлено.
- Исправления в работе с полями-массивами.
- Если свойство UpdateTransaction у TpFIBDataSet уже
назначено, то при смене значения свойства Database, оно не
переназначается на Database.DefaultTransaction.
- Редактор свойства DBName не работал нормально, если в
DBName был указан невалидный путь.
- Исправлена ошибка в FullRefresh (reported by Janex).
- Исправлена ошибка при парсинге некоторых запросов.
- Иногда терялось значение свойства Transaction у FIBQuery
(сообщил С. Ломакин).
- Исправлена ошибка при вызове GenerateSQLs после Open и
наличии в запросе поля типа TIMESTAMP (сообщил П. Шибанов).
- Исправлена ошибка в методе function TSQLParser.IsDDL
(сообщил П. Шибанов).
- Исправлена ошибка при использовании poKeepSorting на
отфильтрованном TpFIBDataSet.
- Исправлена ошибка в SQL editor, которая не позволяла
использовать режим "use selected field only".
- Исправлен AV при AppendRecord на пустом TpFIBDataSet.
- В design-time во время операций copy-paste TpFIBDataSet и
TpFIBQuery сбивались настройки в скопированном компоненте.
- Устранено зависание в ReplaceMacroStr.
- Исправлена некорректная обработка исключений при
автозакрытии подчинённой таблицы в связке мастер-деталь.
- Присваивание значения полю закрытого TpFIBDataSet вызывало
выполнение недопустимой операции.
- Прямой вызов FIBStringField.SetData отрабатывал неправильно.
- Подправлена функция ExecSQL из юнита CommonIB.
- Подправлен метод TFIBInputDelimitedFile.ReadParameters.
Особенности и улучшения версии 6.0:
- В TpFIBQuery введен метод function FindField(const
FieldName: string): TFIBXSQLVAR. Если искомое поле не найдено, функция
не генерирует исключение, а возвращает nil.
- В TpFIBQuery добавлено свойство GroupByClause:string.
Возвращает текст выражения GROUP BY из текущего SQL текста.
- В TpFIBQuery и TpFIBDataSet добавлена возможность работать
с макросами в DDL запросах.
- Добавлена директива {$DEFINE NO_GUI} в файл FIBPlus.inc. В
случае включения этой директивы, файлы библиотеки компилируются без
использования VCL-модулей с визуальными компонентами.
- В новой версии метод TpFIBDataSet.GenerateSQLs работает
даже если коллекция полей еще пустая. Это может пригодиться, если
необходимо сделать вызов до открытия датасета, и поля не созданы в
дизайне.
- В TpFIBDataSet добавлен новый метод function LocatePrior
(const KeyFields: String; const KeyValues: Variant; Options:
TLocateOptions): Boolean. Метод позволяет осуществлять поиск записи в
локальном буфере в обратном направлении (от текущей записи, к началу
буфера).
- В свойство TpFIBDataSet.Options добавлена опция
psSetEmptyStrToNull. При включении опции, у вновь создаваемых строковых
полей этого датасета включается свойство EmptyStrToNull.
- В свойство TpFIBDataSet.Options добавлена опция
poFreeHandlesAfterClose. При включенной опции после достижения
состояния Eof (то есть, при получении всех записей результата запроса),
Handle у TpFIBDataSet освобождается. Это, в частности, поможет избегать
сообщения сервера «Object in use» при изменении
объектов базы данных. Следует обратить внимание, что освобождение
Handle означает также и закрытие запроса.
- Добавлена аналогичная опция (poFreeHandlesAfterClose) в
TpFIBQuery. При ее использовании, Handle освобождается сразу же после
вызова метода Execute.
- В TpFIBTransaction добавлена возможность указать параметр
транзакции isc_tpb_no_auto_undo.
- Добавлено свойство TAutoUpdateOptions.SeparateBlobUpdate:
boolean. При включенном свойстве BLOB-поля сохраняются следующим
образом:
- Генерируются тексты модифицирующих запросов без
BLOB-полей.
- Отдельно генерируется модифицирующие запросы с
BLOB-полями.
- При выполнении Post запускается запрос без BLOB-полей,
потом создается «пустой» BLOB, который сохраняется
в базе, и только после этого запускается UPDATE для сохранения
реального значения BLOB-поля. При стандартном подходе BLOB-поля
сохраняются обычным модифицирующим запросом. В случае, если этот запрос
был отвергнут сервером, и мы получили исключение, то при следующей
попытке BLOB-поля приходится передавать на сервер заново. При новом
подходе мы этого избегаем, поскольку BLOB-поле просто не передается на
сервер до тех пор, пока не пройдет основной запрос INSERT/UPDATE, и
пока мы не будем уверены, что операция в целом не будет отвергнута
сервером.
- Введен новый режим организации внутреннего буфера
TpFIBDataSet. Подробнее это режим описан в пункте «Режим
работы TpFIBDataSet "Ограниченный локальный буфер"».
- Введена возможность автоматического кэширования BLOB-полей
на клиенте. Подробнее читайте пункт «Кэширование BLOB-полей
на клиенте».
- В свойстве AutoUpdateOptions.UpdateTableName теперь можно
записывать имя таблицы с псевдонимом (alias). Например,
«TABLE1 AAA». Такая возможность полезна для
правильной генерации модифицирующих запросов по тексту SelectSQL, в
котором модифицируемая таблица упоминается 2 или более раз.
Например:
SELECT
AAA.*, BBB.*
FROM
TABLE1 AAA, TABLE1 BBB
WHERE …….
Предыдущие версии FIBPlus не могли сформировать правильные
модифицирующие запросы для таких запросов. В FIBPlus 6.0 достаточно
указать AutoUpdateOptions.UpdateTableName := 'TABLE1 AAA'.
- В SQLEditor добавилась кнопка 'To Code Editor'. При
нажатии, текст запроса открывается в стандартном редактор кода IDE, а
редактор закрывается. Существует побочный эффект для редактора
TpFIBDataSet - при переходе в стандартный редактор кода, все запросы
сохраняются в соответствующих свойствах, то есть, происходит неявное
сохранение.
- Теперь, если пакет с редакторами использует SynEdit, то в
SQLEditor доступен CodeProposal. В pFIBPropEd.inc введены новые
директивы для разных версий SynEdit.
- Изменения в SQLNavigator:
- окно SQLNavigator не модальное, а StayOnTop.
- Добавлена функция доступа к компоненту на форме из
редактора кода. То есть, теперь, можно подвести текстовый курсор к
названию компонента (например, pFIBQuery1), нажать Ctrl-W и
SQLNavigator передаст фокус на форму с этим компонентом. Причем,
компонент на этой форме будет выделен и выбран в Object Inspector. В
случае если мы находимся в редакторе кода SQL, то будет открыта форма и
компонент носитель соответствующего свойства.
- Добавлена комбинация Ctrl-Shift-W аналогичная пункту
b), только поиск ведется по всем формам проекта. В случае обнаружения
более одного компонента - выдается список форм, где встретились
компоненты с искомым именем. Из списка двойным кликом можно открыть
форму и сразу перейти на искомый компонент.
- У компонентов TpFIBDatabase и TpFIBTransaction ряд методов
и свойств объявляются устаревшими и в дальнейших версиях реализованы не
будут. Речь, в частности, идет о:
procedure RemoveDataSet(Idx: Integer);
procedure RemoveDataSets;
function AddDataSet(ds: TFIBBase): Integer; deprecated;
property DataSetCount: Integer read GetFIBBasesCount;
property DataSets[Index: Integer]: TFIBBase read GetFIBBase;
Они заменены на:
procedure RemoveFIBBase(Idx: Integer);
procedure RemoveFIBBases;
function AddFIBBase(ds: TFIBBase): Integer;
property FIBBaseCount: Integer read GetFIBBasesCount;
property FIBBases[Index: Integer]: TFIBBase read GetFIBBase;
Реорганизация вызвана тем, что предыдущие названия не соответствовали
сути этих методов и свойств, что вносило путаницу. Несмотря на то, что
данные методы, как правило, не используются в прикладных приложениях, и
изменение вряд ли затронет существующие программы, для поддержки
совместимости с предыдущими версиями в файле FIBPlus.inc можно включить
директиву $DEFINE USE_DEPRECATE_METHODS1}.
- В TpFIBDataSet и TpFIBQuery добавлены методы
RestoreMacroDefaultValues, восстанавливающие значения макросов по
умолчанию.
- Поведение TpFIBDataSet при включенной опции
poPersistentSorting и использовании макросов стало более устойчивым.
Сортировка результата меняется только в том случае, если поля, по
которым осуществлялась сортировка до изменения макросов, перестали
существовать.
- Добавлена новая декларация для метода OpenWP в TpFIBDataSet.
procedure OpenWP(const ParamNames:array of string;const ParamValues:
array of Variant); overload;
Новый вариант позволяет указывать названия параметров в переменной
ParamNames. В переменной ParamValues необходимо передавать значения
параметров.
- В TpFIBQuery добавлен аналогичный метод:
procedure ExecWP(const ParamNames: array of string;ParamValues: array
of Variant);
overload;
- В TpFIBDataSet добавлены новые методы:
procedure ReOpenWP(const ParamValues: array of Variant); overload;
procedure ReOpenWP(const ParamNames: array of string; const
ParamValues: array of Variant); overload;
procedure ReOpenWPS(const ParamSources: array of ISQLObject);
Методы аналогичны OpenWP, OpenWPS, но предварительно закрывают
TpFIBDataSet, если он был открыт.
- В классе TFIBBlobField добавлено read-only свойство Blob_id.
- Реализована поддержка строковых полей и подключений с
charset UNICODE_FSS. Для реализации полной поддержки многоязыковых
текстовых данных добавлены новые классы полей TpFIBDataSet:
- TFIBWideStringField = class(TWideStringField) - для полей
типа VARCHAR,CHAR; TFIBMemoField = class(TMemoField, IWideStringField)
- для BLOB-полей, где IWideStringField - интерфейс обрабатываемый
визуальными компонентами TNT
(http://tnt.ccci.org/delphi_unicode_controls)
- Новая опция psSupportUnicodeBlobs в DataSet.PrepareOptions,
которая позволяет работать с BLOB-полями UNICODE_FSS. По умолчанию
опция отключена, потому что для выяснения charet конкретного BLOB-поля
необходим дополнительный запрос. Если вы не работаете с UNICODE, то
запрос окажется лишним.
- Новый метод TFIBDatabase - function IsUnicodeCharSet:
Boolean.Возвращает True, если подключение использует UNICODE_FSS.
- Новое свойство FIBXSQLVAR.AsWideString: WideString;
Исправленные ошибки:
- Игнорировались некоторых события при работе
TSIBfibEventAlerter1.
- Неверно работал метод CancelUpdates при повторном вызове
ApplyUpdates после Commit: показывались записи, удаленные до вызова
Commit.
- Изменены некоторые внутренние запросы для совместимости с
Borland InterBase 4.
- Ошибка в реализации AutoUpdateOptions.AutoParamsToFields.
- Ошибка «Invalid Blob_id» при попытке
выполнить повторный запрос UPDATE после неудачной первой.
- Метод FIBDataSet.LockRecord генерировал неправильный
запрос, если было указано более одного ключевого поля.
- Если выражение ORDER BY формировалось через макрос, то
свойство SortFields не заполнялось. Что приводило к неработоспособности
опции poKeepSorting.
- Неправильно возвращались координаты ошибки в тексте SQL при
неудачной попытке выполнить Prepare.
- Ошибка сохранения в dfm-файле свойства
DefaultFormats.DateTimeDisplayFormat.
- Неоправданное изменение позиции текущей записи после
редактирования в TpFIBDataSet с опцией poKeepSorting. Позиция иногда
менялась, даже если значения сортируемых полей реально не изменились.
- Свойство Field.OldValue в состоянии dsInsert возвращало
случайные значения. Сейчас свойство в этой ситуации строго равно null.
- Ошибка в методе TFIBInputRawFile.ReadParameters, которая
приводила к неправильной работе класса, если в читаемом файле были
сохраненные BLOB-поля.
- BlobField.OldValue теперь показывает реальное значение.
Ранее свойство возвращало текущее значение BLOB-поля.
- Неправильная работа TpFIBDataSet при одновременно
включенных опциях poKeepSorting и poProtectedEdit в запросах
отсортированных по вычислимым-полям.
- Ошибка режима poKeepSorting при добавлении новой записи в
пустой датасет.
- Исправлен метод Resync. Ранее, если TpFIBDataSet закрыт, то
вызов Resync приводил к ошибкам, так как метод пытался обработать
потерю коннекта к базе данных.
- Ошибки при UpdateOnlyModifiedFields.
- Ошибка генерации запроса RefreshSQL при использовании
макросов.
- Не работали Array -поля в TpFIBDataSet с разделенными
транзакциями.
- Не обрабатывались Array-поля типа NUMERIC(18,xxx) под
третьим диалектом.
- В SQLNavigator не работала кнопка CheckSQLS.
- Приложение,
в котором рассказано о режиме работы TpFIBDataSet "Ограниченный
локальный буфер" и кэширование BLOB-полей на клиенте.
Особенности и улучшения версии 6.1:
- Сообщение "Can''t read Buffer.Incorrect RecordNo"
появлялось при попытке добавить новую запись в базу данных. Исключение
возникало при обновлении пустого датасета. Исправлено.
- Некорректный FullRefresh при
CacheModelKind=cmkLimitedBufferSize. Исправлено.
- Не работали локальная сортировка и метод CloneCurRecord.
Исправлено.
- При сохранении датасета в репозитарий диалог запроса всегда
открывался с пустой строкой. Исправлено.
- FIBPlus 6 вызывала ошибку в Refreh SQL Query при создании
SQL выражений в design time. Исправлено.
- Если Select использовал макросы, не работал refresh.
Исправлено.
- При попытке соединиться с базой данных в design-time
FIBPlus использовала клиентскую библиотеку gds32.dll, хотя в свойстве
LibraryName property была указана fbclient.dll. Исправлено.
- AV при попытке отменить изменения в Blob. Исправлено.
- Ошибка с poKeepSorting при работе с огромным датасетом,
сортированным по ORDER BY. Исправлено.
- Ошибка вызова Append. Проявлялась не всегда. Исправлено.
- Не работал DoSortEx. Исправлено.
- FullRefresh некорректно работал в режиме ограниченного
локального буфера. Исправлено.
- Поправлена генерация SQL для запросов, использующих
"закавыченные" имена объектов.
- В FIBPlus Tools не присваивался RefreshSQL через
SQLNavigator. Исправлено.
Особенности и улучшения версии 6.2:
- Значения TFIBGUIDField автоматически генерируются при
вставке новой записи.
- Теперь есть возможность использовать в явном виде строковые
значения в условии WHERE при работе с Unicode-подключением к базе
данных (SELECT * FROM T1 WHERE MyField = 'строка'). До версии 6.2, в
Unicode-подключениях можно было использовать только параметрические
запросы.
- FIBPlusTools адаптированы для Delphi 2005.
- Изменен метод BatchOutputRawFile компонента TpFIBQuery:
procedure BatchOutputRawFile (const FileName: string; Version: integer
= 1);
Второй аргумент задает принцип записи в файл.
Если Version = 1, то используется старый принцип, при котором во
внешний файл выводятся только данные в порядке, который определяется
полями SQL-запроса. Предполагается, что при чтении записанных данных
методом BatchInputRawFile в читающем SQL параметры будут расположены в
том же порядке. Количество полей TpFIBQuery, данные которого
записывались, и количество параметров в TpFIBQuery, который потом будет
считывать данные, должны совпадать. Для строковых полей необходимо,
чтобы длина записываемого поля и читающего параметра также совпадали,
однако совпадения имен не требуется.
Если Version = 2, то используется новый принцип записи. Помимо данных в
файл записывается служебная информация о полях (имя, тип и длина). При
последующем чтении, данные будут читаться по принципу совпадения имен.
Порядок и количество полей в записывающем TpFIBQuery может не совпадать
с порядком и количеством параметров в читающем TpFIBQuery. Типы и длина
тоже могут не совпадать. Требуется лишь совпадение имен.
- В компоненте TpFIBDatabase добавлены новые свойства:
property ServerMajorVersion: integer;
property ServerMinorVersion: integer;
property ServerRelease: integer;
property ServerBuild: integer;
Их смысл очевиден из их названий.
- Добавлены новые методы в TpFIBQuery:
function TableAliasForField(FieldIndex:integer):string; overload;
function TableAliasForField(const aFieldName:string):string; overload;
Функции возвращают алиас таблицы поля в запросе по номеру или названию
поля.
- В интерфейс ISQLObject добавлен метод
function FieldName (FieldIndex: integer): string;
- Увеличена максимальная длина события (event) в
TSIBfibEventAlerter с 64 до 128 символов.
- Добавлена возможность использовать вычислимые Blob-поля в
приложениях. Для этого в классе TFIBBlobField добавлено свойство
IsClientField: Boolean, а в TpFIBDataSet добавлено событие
OnFillClientBlob:TOnFillClientBlob, где
TOnFillClientBlob = procedure (DataSet: TFIBCustomDataSet; Field:
TFIBBlobField; Stream: TFIBBlobStream) of object;
Теперь, если у блоб-поля IsClientField равно True, то значение поля не
берется из базы данных и не записывается в базу данных (однако в
SELECT-запросе блоб-поле, все-таки, должно присутствовать). Для
заполнения значения поля необходимо определить обработчик события
OnFillClientBlob у соответствующего экземпляра TpFIBDataSet. Например:
procedure TForm1.NoLookupFIBDataSetFillClientBlob (DataSet:
TFIBCustomDataSet; Field: TFIBBlobField; Stream: TFIBBlobStream);
begin
Stream.LoadFromFile('c:\temp.txt');
end;
- Добавлена опция poCacheCalcFields в компоненте
TpFIBDataSet. При включенной опции, результаты вычисления calculated- и
lookup-полей сохраняются в кэше, что позволяет их пересчитывать только
после модификации записи. Этот режим рекомендуется использовать, если
calculated-поля используются для "тяжелых" расчетов, а также, если
используется локальная сортировка, фильтрация и поиски по
calculated-полям.
- В компонент TpFIBDataSet добавлены методы:
function CreateCalcField (FieldClass: TFieldClass; const aName,
aFieldName: string; aSize: integer): TField;
function CreateLookUpField (FieldClass: TFieldClass; const aName,
aFieldName: string; aSize: integer; aLookupDataSet: TDataSet; const
aKeyFields, aLookupKeyFields, aLookupResultField: string): TField;
для создания calculated- и lookup-полей в run-time.
- Ускорена работа методов Locate и DoSort.
- Теперь если Required-поля являются пустыми, методы
CacheInsert, CacheEdit не вызывают исключения.
- Поле класса TFIBWideStringField теперь может быть
calculated (стандартный класс TWideStringField использовать практически
нельзя из-за ошибки в VCL)
- В TpFIBDataSet добавлено свойство FieldOriginRule:
TFieldOriginRule, где
TFieldOriginRule = (forNoRule, forTableAndFieldName,
forClientFieldName, forTableAliasAndFieldName);
Свойство руководит правилом заполнения свойства TField.Origin.
forNoRule: Origin не заполняется вообще. Предполагается, что
разработчик самостоятельно заполнит данное свойство.
forTableAndFieldName: Origin заполняется в виде строки - "физическое
имя таблицы"+"."+"физическое имя поля".
forClientFieldName: Origin совпадает с именем Field.FieldName.
forTableAliasAndFieldName: Origin заполняется в виде строки - "алиас
таблицы в запросе"+"."+"физическое имя поля".
Правила forNoRule и forClientFieldName актуальны для программистов,
которые используют FIBPlus совместно с DevExpress. Правило
forTableAliasAndFieldName актуально для работы с Firebird 2.
- В свойстве AutoUpdateOptions.UpdateTableName теперь можно
указывать не просто имя таблицы, но также имя таблицы + пробел + алиас
таблицы. При этом, если имя таблицы не прописное (3 диалект), то его
необходимо обрамлять двойными кавычками. Это дает возможность корректно
генерировать модифицирующие запросы для Firebird 2, поскольку позволяет
FIBPlus разбираться с конструкциями типа
Select a.*, b.Description DescripB
from Tasks a
left join Tasks b on (b.id = a.id)
Т.е., в частности, с конструкциями, в которых одна таблица используется
более одного раза. Поле Description в данном примере не должно
редактироваться. Предыдущие версии FIBPlus и IB/FB не позволяли
корректно работать с такими запросами. Теперь достаточно указать
AutoUpdateOptions.UpdateTableName := 'Tasks a' вместо
AutoUpdateOptions.UpdateTableName := 'Tasks'.
Исправленные ошибки:
- Исправлена ошибка с TFIBGUIDField (класс не был
зарегистрирован).
- Исправление в методе Locate, который не совсем правильно
работал с unicode-полями.
- Исправлена ошибка в редакторе SQL, проявлявшаяся в Delphi
2005. Переход в Code Editor работал некорректно
- Исправлена ошибка в SQL-парсере, проявлявшаяся на
достаточно редких запросах.
- Исправлена ошибка в работе с GUID-полями в режиме
мастер-деталь.
- Методы SetAsBCD и GetAsBCD класса FIBBCDField работали
неправильно с calculated-полями.
- Исправлена ошибка в свойстве AsString компонента в
TpFIBQuery при работе с Unicode.
- Исправлено отображение полей типа NUMERIC(xxx, yyy) при
использовании свойства DisplayFormat для значений, для которых тип
Double не дает необходимую точность.
- Исправлена ошибка вставки в пустой TpFIBDataSet при
включенной опции poKeepSorting.
- Исправлена ошибка в ApplyUpdates при удалении всех записей.
- ExtLocate по сортированному запросу в TpFIBDataSet работал
неправильно, если порядок KeyFields не совпадал с реальным порядком
полей в сортировке. Исправлено.
- Если вызывался ExtLocate с опцией eloInSortedDS по
несортированному запросу в TpFIBDataSet, то поиск ведется методом
простого перебора. В предыдущих версиях в этом случае поиск приводил к
некорректным результатам. Исправлено.
Особенности и улучшения версии 6.2.5:
- В компонент TpFIBDatabase добавлены два метода для
поддержки новых команд RDB$GET_CONTEXT и RDB$SET_CONTEXT введенных в
Firebird 2:
function GetContextVariable (ContextSpace: TFBContextSpace; const
VarName: string): Variant;
procedure SetContextVariable (ContextSpace: TFBContextSpace; const
VarName, VarValue: string);
Исправленные ошибки:
- Исправлена ошибка в методе TpFIBQuery.SetAsExtended.
- Исправлена небольшая утечка памяти в модуле RegUtils.
- Исправлена ошибка при записи в BLOB-поле через
TDataSetProvider.
- При определенных обстоятельствах возникала ошибка
«Can’t read buffer. Invalid RecordNo».
Исправлено.
- При определенных обстоятельствах вызов метода Refresh в
TpFIBDataSet приводил к неверному результату. Исправлено.
- Исправлена ошибка при попытке прочитать BLOB-поля в
обработчике OnCalcFields.
- Исправлена ошибка в метода Locate компонента TpFIBDataSet,
в ситуации, когда не все записи были получены с сервера.
- Возвращались неправильные значения свойства Origin при
опции FieldOriginRule = forNoRule. Исправлено.
- Возникала ошибка генерации запросов при включенной опции
UpdateOnlyModifiedFields в компоненте TpFIBDataSet. Ошибка проявлялась
на полях NUMERIC (18, x) при попытке изменить NULL значение на 0 или
наоборот. FIBPlus ошибочно считал значения таких полей неизменными.
Исправлено.
- Исправлена неверная работа DisplayFormat для полей NUMERIC
(18, x). В частности, проявлялось при использовании символов, которые
не являются символами маски. Например, «#,000 р.00
коп».
- Исправлена ошибка в работе клиентских calculated-полей. Не
очищался буфер перед вычислением поля. Ошибка проявлялась в случае,
если в обработчике события OnCalcFields поле текущей записи не
вычислялось, а для предыдущей вычислялось. В этой ситуации вместо
пустого значения показывалось значение из предыдущей записи.
- Поиск булевого значения True в поле TpFIBBooleanField
выполнялся неверно. Исправлено.
- Исправлен AV в FIBStringField, возникавший в определенных
ситуациях с использованием свойства psSetEmptyStrToNull.
- Убраны ненужные кавычки в автоматическом получении
свойства GeneratorName.
- Исправлена ошибка определения ключевых полей в SQLEditor.
- При использовании макросов не подставлялись вложенные
параметры в RefreshSQL. Исправлено.
Особенности и улучшения версии 6.3.0:
- Метод function FIBDataSet.IsComputedField(Field:Variant):
boolean;
- Возвращает true если поле является server-calculated. В
качестве аргумента подается либо имя поля в датасете, либо его номер в
коллекции полей.
- Метод procedure FIBDataSet.AssignProperties(Source:
TFIBCustomDataSet);
Присваивает всем свойствам значения из свойств от Source датасета.
Аналогичный метод FIBQuery.AssignProperties
- Добавлены свойства датасета - дают доступ к выражениям в
SELECTSQL
property GroupByClause:string;
property MainWhereClause:string;
property PlanClause:string;
- в pFIBPropEd.inc добавлена новая директива {$DEFINE
synedit-201b.zip} Включает Директивы (define) актуальные для
определенной сборки SynEdit. На сайте производителя эта сборка доступна
под именем synedit-201b.zip
- FIBDataBase добавлено свойство SQLLogger. Убран компонент
FIBAppStatistics. Его функциональность перенесена в новый компонент
FIBSQLLogger.
FIBSQLLogger - компонент, отвечающий за логгирование SQL запросов, и
сбор статистики по ним.
Свойства:
property ActiveStatistics:boolean - включен ли сбор статистики.
property ActiveLogging:boolean - включено ли логгирование
property LogFileName:string - имя файла, куда пишется лог
property StatisticsParams :TFIBStatisticsParams - какие именно
параметры включены в сбор статистики
property LogFlags: TLogFlags - какие операции логгируются
property ForceSaveLog:boolean - вести запись лога сразу же. Т.е после
каждого запроса немедленно идет запись в файл.
Методы
function ExistStatisticsTable:boolean; - существует ли таблица для
хранения статистики
procedure CreateStatisticsTable; - создает таблицу для хранения
статистики в базе
procedure SaveStatisticsToDB(ForMaxExecTime:integer=0); - сохранить
накопленную статистику в таблицу. Параметр указывает, по каким запросам
нам статистика вообще интересна. Для этого надо задать значение
ForMaxExecTime равным нижнему пределу времени выполнения запроса. Т.е.
записывается статистика по тем запросам которые выполнялись дольше или
столько же времени как, указанное в ForMaxExecTime.
procedure SaveLog; - запись лога в файл. (имеет смысл, если выключен
ForceSaveLog)
- Добавлена возможность отключить показ имени компонента,
вызвавшего ошибку. Для этого можно воспользоваться кодом:
use FIB; Exclude(IBErrorMessages, ShowRaiserName)
- Добавлена обработка параметра транзакции
isc_tpb_no_savepoint. (Для InterBase 7.5)
- Новый вариант метода FIBQuery.
ExecWPS;
procedure ExecWPS (ParamSource:ISQLObject; AllRecords:boolean=True);
overload;
Действие почти аналогично действию старого вызова ExecWPS. Т.е.
запускает ExecQuery, используя в качестве источника параметров
переданный параметр ParamSource. Второй аргумент сообщает методу, нужно
ли выполнять ExecQuery для каждой записи из ParamSource или только для
текущей.
- pFIBClientDataSet теперь поддерживает интерфейс ISQLObject.
Это в сочетании с пунктом 2 позволяет делать легкую перекачку данных в
базы InterBase из данных клиент-датасета.
Пример:
FIBQuery1.ExecWPS(FibClienDataSet1,True)
- Небольшие улучшения в обработке параметров компонентом
FIBQuery (Спасибо Andry Ogorodnik).
- Добавлена поддержка новой возможности FB2. Новая
функциональность заключается в синтаксисе:
Insert Into Table1 ...
RETURNING FIELD1,FIELD2...
Поддержка выражается в том, что если в датасете написан такой
InsertSQL, то сразу же после срабатывания метода Post, те поля,
значения которых запрос вернул через выражение RETURNING, будут
обновлены в датасете. Это позволяет получать значения полей, которые
сформировались триггерами без дополнительного вызова метода Refresh.
Т.о. можно получить и значение первичного ключа, без предварительного
обращения к генератору с клиента.
- Внесены небольшие правки для лучшей поддержки C++ Builder и
Kylix.
- В SQLEditor при использовании SynEdit в Code Proposal
добавилась обработка gen_id(). Т.е., при нажатии Ctrl+space в этом
случае открывается список генераторов. (спасибо Джонатану Ниву)
- SQLEditor теперь показывает типы полей. (спасибо Джонатану
Ниву)
Исправленные ошибки:
- Неправильно генерировались запросы в режиме ограниченного
кэша, если в клаузе order by присутствовали комментарии. Исправлено
- Неправильно работала опция poKeepSorting при добавлении
ПЕРВОЙ записи в датасет. Исправлено
- Не срабатывала генерация первичного ключа в МИДАС
приложениях, если в провайдере свойство ResolveToDataset = False.
Исправлено
- Неправильно работало отображение Numeric полей при
использовании несколько секционных форматов. Т.е. форматы типа
'#,##0.00;#,##0.000;Zero'. Исправлено
- Исправлены ошибки в СloneCurrRecord, макросах и ошибки
препарировании запросов; DoSortEx в OpenAsClone
- Ошибка парсера SQL. Проявлялась, когда за знаком "-" сразу
же шел параметр, Например, SET IS_DELETE = -?OLD_RING_IDENT. Исправлено
- Ошибка в методе OpenAsClone. Проявлялся при попытке
сортировки в отклонированном датасете и попытке модификации данных в
отклонированном датасете. Исправлено
- Исправлена ошибка обработки опции poTrimCharFields, когда
пользователь вводил много лишних пробелов в конце строки при работе с
Varchar. После Post эти пробелы запоминались, а не отсекались. При этом
данных отображались нормально, без хвостовых пробелов.
- Неправильно работал ExtLocateNext с опцией eloInSortedDS.
Исправлено
- Ошибка при Refresh со включенной опцией poVisibleRecno при
связке Мастер-деталь. При добавлении записи в Detail датасет и
последующем выполнении Refresh, у Master датасета происходила смена
текущей позиции на произвольную запись. Исправлено
- Неправильно генерировались модифицирующие запросы при смене
текста SelectSQL, если при этом менялся также алиас модифицируемой
таблицы. Исправлено
- Неправильная работа TpFIBTableInfoCollect.ClearForTable для
таблиц с Именами взятыми в двойные кавычки. Исправлено
- При удачном перемещении указателя на последнюю запись в
наборе после выполнения Locate, не сбрасывался флаг Eof. Исправлено
- В некоторых случаях возникало исключение в RefreshSQL.
EFIBInterbaseError с кодом SQL -804 "Incorrect values within SQLDA
structure". Исправлено
- Ошибка при работе датасета с одноименными макросами +
изменением текста запроса после присвоения значения макросам. Исправлено
- Подправлено поведение метода LocateNext. Метод возвращал
неправильный результат, если последняя запись датасета удовлетворяла
условию поиска, и при этом уже была текущей при вызове метода.
- Устранена плавающая ошибка при компиляции пакетов под C++
Builder.
- Ошибка при использовании poProtectedEdit, возникавшая при
завершении транзакции по CommitRetaining. Исправлено
- Исправлена ошибка "Invalid Blob_id". Проявлялась при
вставке BLOB-поля из датасета через хранимую процедуру, если при этом
не вызывался RefreshSQL после Post.
- Исправлена ошибка в методе TFIBXSQLVAR.SetAsXSQLVAR. Иногда
приводила к проблемам при использовании методов BatchXXX.
- Исправлена ошибка в реализации poKeepSorting, из-за которой
при Insert иногда не заполнялись значения упорядоченных полей.
- Внесены исправления в IB_Services в части директив для
Kylix.
Особенности и улучшения версии 6.4:
-
Добавлен обработчик TpFIBDataSet.
property AfterUpdateRecord: TFIBAfterUpdateRecordEvent
read FAfterUpdateRecord
write FAfterUpdateRecord
где
TFIBAfterUpdateRecordEvent = procedure(DataSet: TDataSet;
UpdateKind: TUpdateKind;
var Resume:boolean) of object;
Событие происходит при работе методов ApplyUpdates и
ApplyUpdToBase для каждой записи, модификации которой отправляются на
сервер. Обработчик вызывается непосредственно ПОСЛЕ того, как успешно
выполняется запрос на изменения.
-
В TpFIBDataSet добавлена опция poRefreshAfterDelete. Если
опция включена, то после Вызова метода Delete производится попытка
Refresh только что удаленной записи. Если попытка успешная (т.е. запись
физически не была удалена), то запись не будет помечаться в кэше как
удаленная, и останется видимой.
-
В FIBPlusTools закладка Preferences пополнена опциями
poUseLargeIntField в PrepareOptions и настройкой DateTimeDisplay в
DefaultFormats
-
Добавлена совместимость компонентов FIBPlus и экспертов
FIBPlusTools с Delphi 2006.
Исправленные ошибки:
- Небольшие исправления в SQLNavigator из FIBPlusTools: при
открытии окна SQL Navigator в только что созданном проекте приложения
(File->New->Application; FIBPlus -> SQL Navigator)
происходило исчезновение из проекта модуля, созданного по умолчанию
(Unit1.pas).
- Небольшие исправления в механизме поиска текста SQL в
SQLEditor.
- Исправлена ошибка в методе Locate, связанная с нахождением
уже удаленных записей.
- Исправлена ошибка в обработке Field.DisplayFormat вида
"#,##0.00;-#,##0.00; ;"
- Исправлена неправильная работа SQL Editor при установленном
флажке "Use Selected Fiedls Only".
- Исправлена ошибка SQL Editor при генерации RefreshSQL,
возникавшая из-за присутствия в начале SelectSQL закомментированного
текста.
- Исправлена неправильная работа опции dcForceMasterRefresh.
- Исправлена ошибка в обработке опции poKeepSorting при
попытке изменения первой записи TpFIBDataSet.
- Исправлена ошибка при применении poProtectedEdit. Позиция
текущей записи сбивалась.
- Введен workaround для внутренней ошибку компилятора E5912,
которая проявлялась при попытке скомпилировать строки FIBBCDField.Value
:= 1.
- Исправлена ошибка при работе с памятью в TFIBStringField.
Ошибка проявлялась при создании полей в design-time, и последующем
изменении в run-time текст SQL таким образом, что длина полей
изменялась в большую сторону.
Особенности и улучшения версии 6.4.1:
- При сборке под BDS 2006 TFIBDataSet является потомком
класса TWideDataSet, а не TDataSet.
Исправленные ошибки:
- Потеря значений параметров TpFIBClientDataSet, присвоенных
в обработчике OnBeforeOpen. Исправлено.
- Утечка памяти при использовании DataSet.UniDirectional.
Исправлено.
- Ошибка при использовании макросов с квотированием.
Исправлено.
- Неправильная работа Locate в некоторых редких случаях.
Исправлено.
- Исправление ошибки в коде Borland. Подробности смотреть в Bug
Tracker.
- Исправление ошибки в коде Borland. Подробности смотреть в Bug
Tracker.
- Для полей LargeInt не работало свойство Filter. Исправлено.
- Плавающее AV при обращении к DoTrim когда в качестве
аргумента используется пустая строка. Исправлено.
- Неправильная работа LocateNext, если не все записи выбраны
в кэш. Исправлено.
- При успешном поиске по сортированному датасету, при наличии
нескольких записей, одинаковых по искомым полям, ExtLocate иногда
показывал не первую найденную запись, а последнюю. Исправлено.
Особенности и улучшения версии 6.4.5:
- Добавлена поддержка C++ Builder 2006
- Добавлена обработка полей charset UTF8 для Firebird 2
- В TpFIBDatabase добавлено свойство property
UseBlrToTextFilter :boolean. Это свойство включает/выключает обработку
BLOB полей с подтипами Blr (2), Acl(3)
- Метод FIBDatabase.QueryValueAsStr теперь возвращает пустую
строку, если запрос, передаваемый в функцию, либо ничего не возвращает,
либо содержит возвращаемое поле Null.
- В TpFIBDatabase добавлен обработчик:
TOnApplyFieldRepository=procedure
(DataSet:TDataSet;Field:TField;FieldInfo:TpFIBFieldInfo) of object;
- В DSContainer добавлен обработчик:
TOnApplyFieldRepository=procedure(DataSet:TDataSet;Field:TField;FieldInfo:TpFIBFieldInfo)
of object;
- В DSContainer добавлено свойство IsGlobal:boolean. Если это
свойство установлено в True, DSContainer начинает действовать на ВСЕ
датасеты приложения.
- Изменена обработка SQL запросов "COMMIT" и "ROLLBACK".
Теперь такие запросы не отдаются серверу на исполнение, а вызываются
соответствующие транзакции. Такое поведение позволяет корректно закрыть
запросы, выполнявшиеся в рамках закрываемой транзакции.
Совокупность изменений в пунктах 4-6 позволяет разработчику
легко использовать свои собственные настройки в репозитарии полей.
Пример:
Если нужно настроить свойство EditMask, добавьте в таблицу
репозитария поле EDIT_MASK, создайте контейнер в приложении, сделайте
его глобальным, присвоив значение True в свойстве IsGlobal, затем в
обработчике OnApplyFieldRepository напишите:
procedure TForm1.DataSetsContainer1ApplyFieldRepository(DataSet:
TDataSet;Field: TField; FieldInfo: TpFIBFieldInfo);
begin
Field.EditMask:=FieldInfo.OtherInfo.Values['EDIT_MASK'];
end;
- Редактор репозитария ошибок неправильно работал при выборе
"Unique Indices". Исправлено.
- Ошибка в методе FIBDataSet . RecordFieldValue ( Field :
TField ; aBookmark : TBookmark ): Variant ; Исправлена.
- Если текущий текст клаузы PLAN в запросе TpFIBDataSet .
SelectSQL использовал неявный JOIN (т.е. начинался со скобки, а не со
слова JOIN), то присваивание нового значения свойству
TpFIBDataSet.PlanClause результировало запросом с неверной клаузой PLAN
(с ненужной скобкой после слова PLAN). Исправлено.
- В TpFibErrorHandler была некорректная обработка сообщений о
пользовательских exception под Firebird 2 (с учетом введенного в этой
версии PSQL Stack Trace). Исправлено.
- Подправлена обработка потери соединения для случая, когда
производится попытка его восстановления.
- В TFIBCustomDataSet.RecordFieldValue отсутствовала
обработка BOOLEAN полей для InterBase 7. Исправлено.
- Ошибка CloneCurRecord: error with boolean field in record
(IB7). Исправлена .
- Ошибка в LocateNext: Если последняя запись датасета
удовлетворяла условию поиска, и поиск начинался с этой записи, то
LocateNext возвращал True. Исправлена.
- Неправильная работа методов LocateXXX в сочетании с
фильтрацией по вычисляемым полям. Проявлялась в том случае, если Locate
происходил по невычисляемым полям, а фильтрация ( Filtered ) - по
вычисляемым. Исправлено.
- Возникновение EAccessViolation после отработки
OnUpdateError при CachedUpdates=True и OnUpdateError
"UpdateAction:=uaAbort;". Исправлено.
- Ошибка в SQLEditor при попытке работы с хранимыми
процедурами. Исправлена.
- Ошибка при генерации RefreshSQL, если alias таблицы
начинался с буквосочетания "AS". Исправлена.
- Ошибка при выполнении некоторых execute block. Исправлена.
- Ошибка при обработке потери соединения в случае, если
существовало несколько соединений к разным базам данных. Исправлена.
- Незначительная ошибка в методе FIBQuery.PrepareArraySqlVar.
Исправлена.
- Ошибка при присвоении в BCD поле строкового значения
'000...'. Как пример FIBBCDField1.asString:='0000';
Особенности и улучшения версии 6.5:
- Теперь SQLMonitor показывает текст SQL уже после применения
макросов и кондишенов
- Событие OnFillClientBlob теперь вызывается не только при
первом считывании записи, но и после ее модификации
- В TpFIBDataSet.Options добавлена опция poUseSelectForLock.
Она действует при включенном режиме poProtectedEdit. Если
poProtectedEdit = True, то блокирование записи будет производиться не
"холостым апдейтом", а следующей конструкцией:
Select * from TABLE1 WHERE ... for update with lock
Примечание: Эта особенность работает ТОЛЬКО
для Firebird)
- Добавлен метод FIBQuery.ExecuteImmediate, который
немедленно выполняет запрос без предварительного Prepare (cм.
документацию по IB API функции isc_dsql_execute_immediate)
- Выполнение DDL запросов теперь производится через
ExecuteImmediate.
- В процедуру CopyFieldsProperties добавлено копирование
свойств AutoGenerateValue, ConstraintErrorMessage, CustomConstraint,
Tag и Index.
- Свойство pFIBDataSet.ReceiveEvents и событие
pFIBDataSet.OnUserEvent объявляются устаревшими и убираются из
основного кода. Пользователям, которые все же используют их, нужно
компилироваться с дефайном USE_DEPRECATE_METHODS2 в файле FIBPlus.inc.
Исправленные ошибки:
- В некоторых случаях добавление записи в сортированный набор
данных происходило неверно. Исправлено.
- Ошибка в TpFIBCustomService.GenerateSPB проявлялась при
пустом значении свойства Params. Исправлена.
- При смене свойства Filter не происходило обнуления
результатов предыдущего фильтра. Исправлено.
- Ошибка в методе Locate при попытке поиска числовых значений
в стринговых полях. Исправлена.
- Поправлена работа SQLMonitor при мониторинге exception
(иногда приводило к зависанию).
- Подправлен SQL редактор датасета для правильной работы с
запросами, в которых одна и та же таблица встречается по нескольку раз
(работа гарантирована только под Firebird 2)
- Для кэшированных вычисляемых полей в
TFIBCustomDataSet.RecordFieldValue не был предусмотрен тип ftSmallInt.
Исправлено.
- Неправильная обработка полей с чарсетом UTF8 и collate,
отличным от значения по умолчанию (default). Исправлена.
- Соединение автоматически закрывалось, обнаружив, что база
находится в shutdown. Далее производилась обработка потери коннекта
(при использовании pFibErrorHandler). Исправлено.
- Ошибка в генераторе запросов: не показывался тип поля для
полей DOUBLE PRECISION. Исправлена.
- В некоторых случаях была небольшая утечка памяти при работе
с BLOB-параметрами. Исправлена.
- Ошибка при поиске (Locate) Unicode-строки в поле
varchar(unicode_fss) при включенной опции poTrimCharFields. Исправлена.
- Поправлена функция function InvertOrderClause(const
OrderText:string):string; (не обрабатывала Order By с употреблением
NULLS FIRST, как следствие, это приводило к некорректной работе режима
ограниченного cache для таких запросов).
- Поправлены методы TpFIBDataSet.PSInTransaction,
PSStartTransaction,PSEndTransaction.
- Ошибка при выполнении DDL запросов в Unicode коннекте
(портились комментарии, сделанные на всех языках, кроме английского).
Исправлена.
Особенности и улучшения версии 6.7:
- Добавлена поддержка Delphi 2007
- Добавлена поддержка InterBase 2007
- введен специальный define в FIBPlus.inc {$DEFINE
SUPPORT_IB2007}. Если этот define включен, в FIBPlus добавляется
поддержка некоторых особенностей InterBase 2007
- добавлен метод TpFIBDatabase.IsIB2007Connect:boolean;
- добавлено свойство InstanceName в ConnectParams
- Добавлена поддержка charset SUPPORT_KOI8_CHARSET и define в
FIBPlus.inc {$DEFINE SUPPORT_KOI8_CHARSET}
- Изменен метод procedure TFIBXSQLVAR.SetAsVariant(Value:
Variant);
Теперь он может также работать с типом данных OleVariant
(спасибо Danny Van den Wouwer)
- В редакторе репозитария датасетов появилась возможность
выбирать генератор из списка существующих.
- У TpFIBDatabase в свойстве TConnectParams появилось
подствойство IB2007: TIBConnectParams, где TIBConnectParams содержит
поле InstanceName: string. (Только при включенном {$DEFINE
SUPPORT_IB2007})
- В редакторе TpFIBDatabase появилась возможность отдельно
указывать порт подключения (только для Firebird).
Исправленные ошибки:
- Некоторые значения, например,
{00000000-0000-0000-0000-000000000000}, неверно отображались в
TFIBGuidField. Исправлено.
- Ошибка при вызове метода IsEmpty при установленном
свойстве DataSet.CacheModelOptions.CacheModelKind=
cmkLimitedBufferSize. Исправлена.
- Ошибка в процедуре Sort (unit fibDataset) c
DisableScrollEvents. Проявлялась, если в dataset содержалось
не более одной записи. Исправлена.
- Исправлена ошибка в методе function
TpFIBDataSet.PSGetParams: TParams; (спасибо Danny Van den Wouwer).
- Внесены исправления в pFIBClientDataSet для корректной
работы с Unicode полями под BDS2006.
- Ошибка в методе TFIBQuery.DoAfterExecute приводила к
неправильной последовательности вывода действий на SQLMonitor.
Исправлена (спасибо Danny Van den Wouwer).
- Ошибка при смене клиентской библиотеки в runtime.
Исправлена.
- В методе TFIBXSQLVAR.GetAsDateTime проявлялась ошибка при
значениях даты, меньших даты, принятой за начальную в InterBase.
Исправлена.
- В методе WhereClause неправильно обрабатывались
комментарии
в стиле Firebird (--). Исправлено.
- Ошибка при обработке запросов c командой "with" для
Firebird 2.1. Исправлена.
- Не работали TGUID поля для TClientDataSet. Исправлено
(спасибо Антону Трилю).
- Не работали TGUID поля в связке с QuantumGrid. Исправлено
(спасибо Антону Трилю).
- В случае потери связи с сервером обработка потери
коннекта
делалась неверно, когда TFIBSQLLogger был подключен к TpFIBDatabase.
Программа попадала в цикл, при этом OnLostConnect вызывался
многократно. При отключении TFIBSQLLogger от TpFIBDatabase все работало
нормально. Исправлено.
- Изменено объявление обработчиков событий
TBeforeLoadBlobFromSwap, TBeforeLoadBlobFromSwap. Старое объявление
обработчиков неправильно работало для Delphi 5.