Распечатать страницу

Предварительные замечания Visual FoxPro

« Назад

Если поле числовое, а записываемое в него значение слишком велико, то выполняются следующие действия:

- обрезаются неумещающиеся десятичные знаки, оставшаяся десятичная порция округляется;

- если значение по-прежнему не вписывается в поле, выполняется попытка записать значение в научной нотации (экспоненциальной форме), при условии, что размер поля не менее 7;

- если эта попытка неудовлетворительна, то поле заполняется звездочками.

Тип вставляемого в поле значения должен соответствовать типу поля. В противном случае генерируется ошибка.

Все команды игнорируют поля типа General.

Многие команды оперируют опцией FOR, а некоторые – WHERE. При их использовании в сложных выражений могут возникать ошибки 1308 – недостаточен размер стека и 1812 - SQL: слишком длинный оператор. Чтобы их избежать, нужно либо упростить выражения и, возможно, уменьшить их число, либо увеличить уровень сложности, разрешенный в опциях FOR и WHERE. Последнее осуществляется функцией

SYS(3055 [, nComplexity])

за счет задания соответствующего значения nComplexity – числа в диапазоне от 320 (по умолчанию) до 2040. Увеличение nComplexity поднимает порог допустимого уровня сложности. Если значение nComplexity нечетно, то функция приведет его к ближайшей четной величине.

Функция SYS(3055) возвращает установленный на момент ее вызова уровень сложности, разрешенный в опциях FOR и WHERE.

Пример. Вызов TABLEUPDATE( ) для локальной таблицы или вида, не использующей индекса, генерирует длинную опцию WHERE для поиска обновляемой строки. По умолчанию опция WHERE поддерживает 40 полей. Если получена ошибка 1812, то для ее преодоления нужно либо использовать индекс, либо увеличить допустимую сложность опции WHERE, устанавливая его равным 8 * FCOUNT( )

set multilocks on

&& Устанавливаем пессимистическую буферизацию записи

CursorSetProp("Buffering", 2)

&& Выполняются операции с таблицей

&& …

&& Функция FCOUNT( ) возвращает число полей таблицы

&& Обращаясь к SYS(3055), учитываем, что 320 ≤ nComplexity ≤ 2040

Sys(3055, Max(320, Min(2040, 8 * Fcount( ))))

&& Обновляем текущую таблицу

TableUpdate( )

&& Восстанавливаем заданный по умолчанию уровень сложности

Sys(3055, 320)

Большинство примеров выполнено с использованием таблиц базы данных HomeLibrary, рассмотренной в разд. 2.2. Для сокращения кода примеров нередко предполагается, что нужные таблицы уже открыты. Поэтому для воспроизведения примера, выполненного с таким предположением, следует предварительно открыть используемые в примере таблицы.

Если SET DELETED установлен в ON, то записи с пометкой удаления командами, оперирующими с диапазоном записей, игнорируются.

При работе с полями типа Integer (AutoInc) и употреблении команд типа APPEND FROM или INSERT INTO следует позаботиться о надлежащей установке SET AUTOINCERROR.