CONCURRENTRESET


Библиотека

V32.EXE

Синтаксис

CONCURRENTRESET(file: IDENT;
                index: IDENT;
                { indexFieldValue: ANYTYPE; }
                { fileField: FIELDIDENT });

Описание

Выполняет конкурентное присваивание полям fileField файла file указанной записи значений по умолчанию.

Условно можно считать, что работа состоит из следующих этапов:

  1. В файле file устанавливает текущим индекс index, не фиксируя значений полей индекса (селект на 0 полей), и ищет запись с заданными значениями полей индекса index. Эти значения задаются перечнем параметров indexFieldValue, причем их количество и порядок следования должен соответствовать количеству и порядку следования полей в индексе index, а типы параметров indexFieldValue должны быть совместимыми по присваиванию с типами соответствующих полей индекса index (аналог вызова SEARCH).
    Индекс index должен быть де-факто уникальным, иначе исключение 959.
    Если требуемой записи в файле file не нашлось, то выполняется вставка новой записи, все поля которой заполнены соответствующими default-значениями, а поля индекса index соответствующими значениями, указанными в параметрах indexFieldValue. При заполнении полей значениями по умолчанию знаки вопроса игнорируются. Например, заданное default-значение "?0" интерпретируется как "0".
    Найденная или вновь вставленная запись становится текущей.
  2. В памяти сервера формируется псевдоэкземпляр текущей записи, содержащий значения  модифицируемых полей fileField. fileField - это имя поля файла file, которое указывается без префикса файла, но с индексом, если это массивовое поле. В этом псевдоэкземпляре значение каждого указанного поля fileField файла file имеет значение по умолчанию. В параметрах процедуры может быть указано любое количество полей fileField. Поля fileField могут входить в индексы файла file, но
    1. такие поля не должны входить в индекс index, по которому выполняется поиск записи, иначе исключение  956;
    2. в каждый индекс может входить не более одного такого поля, иначе исключение 957. Если 2 поля входят в индекс, то к ним запрещено применять CONCURRENTRESET даже последовательно, даже с разных транзакций - при попытке выполнить CONCURRENTRESET над вторым полем той же записи будет выброшено исключение 957.
    Поля fileField не могут быть массивовыми (иначе исключение 10), но можно указать элемент массива. Все эти поля обязаны иметь числовой тип, т.е. NUMERIC, SCAL, FLOAT.

После успешного выполнения процедуры текущая позиция всегда определена (OCCURE вернет 1) и соответствует обрабатываемой записи. Если индекс index совпадает с текущим индексом курсора файла file, и обрабатываемая запись попадает в селект курсора файла file, то индекс и селект в курсоре не меняется. Иначе текущим становится индекс index без зафиксированных полей (селект на 0 полей).

Подробнее о том, как система обрабатывает конкурентные операции см. здесь.

Пример

CONCURRENTRESET(File, FileIndex,
                FileIndexField1Value, FileIndexField2Value + 2,
                FileField,
                FileArrayField[3]);

В файле File устанавливает текущим индекс FileIndex, состоящий из двух полей. По индексу FileIndex ищет запись со значением FileIndexField1Value первого поля индекса FileIndex и значением FileIndexField2Value + 2 второго поля индекса FileIndex. Если такая запись не нашлась, то выполняется вставка. Затем формируется псевдоэкземпляр, в котором сказано, что полям FileField и 3-му элементу массивового поля FileArrayField нужно присвоить значение по умолчанию.

Исключительные ситуации

fileField не является полем файла file Исключение 19
Тип поля fileField не определен или является массивом Исключение 10
Поле fileField имеет не числовой тип Исключение 7
Попытка выполнения операции модификации для подключаемого файла, открытого на чтение Исключение 941
Поле %s файла %s, указанное в параметрах процедуры CONCURRENTRESET, входит в состав индекса поиска записи Исключение 956
В индекс %s файла %s входит более одного поля, из указанных в параметрах процедуры CONCURRENTRESET Исключение 957
Указан неуникальный индекс либо значения не всех его полей Исключение 959
Файл File не находится в конкурентном режиме Исключение 962
Исходное значение записи файла file не удовлетворяет файловому фильтру (см. TABLE.Filter) Исключение 396
Последовательное (в любом порядке) выполнение CONCURRENTRESET и CONCURRENTADD (или CONCURRENTADDONLY) Исключение 960
Только при включенном контроле целостности БД: исходная запись ссылается на справочную запись, не удовлетворяющую файловому фильтру (см. TABLE.Filter) Исключение 219
Только при включенном контроле целостности БД: исходная запись ссылается на несуществующую справочную запись Исключение 218

См. также