ADD


Библиотека

V32.EXE

Синтаксис

ADD(file: IDENT;
    index: IDENT;
    [ VAR oc: SCAL[2] ];
    { indexFieldValue: ANYTYPE; }
    { VAR fileField: FLOAT;
      addValue: FLOAT });

ADD(file: IDENT;
    index: IDENT;
    { indexFieldValue: ANYTYPE; }
    { VAR fileField: FLOAT;
      addValue: FLOAT }
   ): SCAL[2];

Описание

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

Условно можно считать, что работа состоит из трех этапов.

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

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

Возвращаемое значение в режиме функции или значение параметра oc в режиме процедуры означает "Искомая запись к моменту вызова ADD уже существовала", т.е. вставка новой записи не выполнялась, а модифицировалась существующая запись.

Контроль ссылочной целостности БД поддерживается частично. Считается (не проверяется), что поля fileField не входят в индексы, по которым организована связь с другими файлами. Однако при включенном контроле целостности (начиная с V14.54.2) проверяется наличие справочных записей, соответственно могут быть выброшены исключения 217, 218, 219, 220.

Пример

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

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

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

fileField не является полем файла file Исключение 19
Тип поля fileField не определен или является массивом Исключение 10
Поле fileField или значение addValue имеют не числовой тип Исключение 7
Поле fileField модифицируемой записи имеет пустое значение Исключение 290
Переполнение при вычислении значения поля fileField Исключение 48
Попытка выполнения операции модификации для подключаемого файла, открытого на чтение Исключение 941
Указан неуникальный индекс либо значения не всех его полей Исключение 959
Исходное значение записи файла file не удовлетворяет файловому фильтру (см. TABLE.Filter) Исключение 396
Новое значение записи файла file не удовлетворяет файловому фильтру (см. TABLE.Filter) Исключение 397
Выполнение процедуры, когда файла file находится в конкурентном режиме, и модифицируемая запись не заблокирована ни разделяемо, ни монопольно (подробнее см. конкурентные операции модификации) Исключение 960
Только при включенном контроле целостности БД: исходная запись ссылается на справочную запись, не удовлетворяющую файловому фильтру (см. TABLE.Filter) Исключение 219
Только при включенном контроле целостности БД: исходная запись ссылается на несуществующую справочную запись Исключение 218
Только при включенном контроле целостности БД: новый экземпляр записи ссылается на справочную запись, не удовлетворяющую файловому фильтру (см. TABLE.Filter) Исключение 217
Только при включенном контроле целостности БД: новое значение записи файла file нарушает ссылочную целостность, так как поля связи со справочником имеют такие значения, что в справочном файле нет соответствующей записи Исключение 220

См. также