CONCURRENTADD


Библиотека

V32.EXE

Синтаксис

CONCURRENTADD(file: IDENT;
              index: IDENT;
              { indexFieldValue: ANYTYPE; }
              { fileField: FIELDIDENT;
                addValue: FLOAT });

Описание

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

Интерфейс и результат работы процедуры CONCURRENTADD аналогичны процедуре ADD, но в отличии от нее CONCURRENTADD - это конкурентная операция.

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

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

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

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

Пример

CONCURRENTADD(File, FileIndex,
              FileIndexField1Value, FileIndexField2Value + 2,
              FileField, -1,
              FileArrayField[3], 4.3);

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

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

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

См. также