Обработка ошибок, связанных с данными в приложении
Вы можете обнаружить ошибки, связанные с данными в коде приложения на стороне сервера до того, как будет сделана попытка обновить базу данных. Например, если на клиенте поле получило новое значение, которое находится вне допустимого диапазона значений, то можно добавить код в приложение на стороне сервера, чтобы обнаружить ошибку.
В этом случае для строки устанавливается атрибут REJECTED, а на уровне временных таблиц и набора данных устанавливается атрибут ERROR. При установке атрибута REJECTED на сервере для строки, он всегда устанавливается на буфер before-таблицы. Атрибут ERROR устанавливается на before-таблицу. Когда устанавливается ERROR или REJECTED на запись before-таблицы или на саму before-таблицу, то они устанавливаются на соответствующую запись after-таблицы и саму after-таблицу автоматически.
Использование атрибута REJECTED делает проще определить тип ошибки на клиенте, позволяя отличать системные ошибки от ошибок данных.
Также как метод MERGE-CHANGES обрабатывает строки с атрибутом ERROR, MERGE-CHANGES не загружает строки с атрибутом REJECTED в клиентский набор данных.
В зависимости от бизнес-требований, когда обнаруживается ошибка в записи, например ttOrderLine, можно также отклонить все связанные с ней записи. В этом случае, когда произойдёт ошибка, произойдёт откат всех таких записей. Чтобы реализовать это, необходимо:
- Установить атрибут REJECTED в TRUE для строки с ошибкой из ttOrderLine.
- Установить атрибут REJECTED в TRUE для всех строк ttOrderLine в пределах ttOrder.
- Установить атрибут REJECTED в TRUE для соответствующей строки из ttOrder.
Дополнительно, необходимо установить атрибут ERROR для временных таблиц ttOrderLine и ttOrder, а также для набора данных dsOrderOrderLine.
Примеры установки атрибутов ERROR и REJECTED
В следующем примере процедура обновления на сервере устанавливает для строки атрибут REJECTED если значение поля SupplierIDNum больше десяти. Дополнительно атрибуты ERROR устанавливаются в TRUE для before-таблицы и набора данных.
. . . hQuery:GET-FIRST. DO WHILE hBeforeBuffer:AVAILABLE: IF hBuffer:NAME = "ttPurchaseOrder" AND hBeforeBuffer:ROW-STATE = ROW-MODIFIED THEN DO: IF hBuffer::SupplerIDNum <= 10 THEN hBeforeBuffer:SAVE-ROW-CHANGES() NO-ERROR. ELSE ASSIGN hBeforeBuffer:REJECTED = TRUE hBeforeBuffer:TABLE-HANDLE:ERROR = TRUE phChangeDataset:ERROR = TRUE. END. /* if modified ttPurchaseOrder record fails constraints */ hQuery:GET-NEXT. END. /* DO WHILE hBeforeBuffer is available */
В следующем примере приложение устанавливает атрибут REJECTED на буфер строки before-table если произошла ошибка валидации данных. Приложение также устанавливает атрибут ERROR на before-таблицу и набор данных.
. . . hQuery:GET-FIRST. DO WHILE hBeforeBuffer:AVAILABLE: /* procedure to validate the data */ RUN ValidateData(hBuffer, OUTPUT lValid). IF lValid THEN hBeforeBuffer:SAVE-ROW-CHANGES() NO-ERROR. ELSE ASSIGN hBeforeBuffer:REJECTED = TRUE hBeforeTable:ERROR = TRUE hChangeDataset:ERROR = TRUE . hQuery:GET-NEXT. END. . . .