Слияние изменений после обновления
Как вы уже знаете, сервер возвращает набор изменений обратно клиенту, при этом возвращённый набор может не соответствовать рабочему набора данных у клиента, поскольку он может содержать изменения, внесённый триггерами базы данных или изменения, внесённые другими пользователями. Такие серверные изменения должны быть объединены с рабочим набором на клиенте.
Слияние изменений после обновления отличается от обычного повторного чтения данных. Когда данные извлекаются повторно, вы не знаете, что изменилось. Но когда вы делаете слияние, вы можете проверить каждую запись для обработки изменений или ошибок, возникших в результате вызова процедуры обновления.
Поэтому необходимо написать код для слияния возвращаемых с сервера изменений и очистки таблиц BEFORE перед началом работы с рабочим набором данных. При этом в некоторых случаях возвращаемый набор данных может иметь ошибки, но о том, как их обрабатывать будет рассказано позже.
Для слияния серверных изменений с рабочим набором данных на клиенте применяется метод MERGE-CHANGES, при этом таблицы BEFORE для рабочего набора очищаются.
Перед вызовом метода MERGE-CHANGES для возвращённого набора данных необходимо убедиться в отсутствии каких-либо ошибок в этом наборе. Для этого используется логический атрибут набора данных ERROR.
<change-dataset-handle>:ERROR
Если набор изменений не содержит ошибок, то вы можете безопасно выполнить слияние изменений и очистить таблицы BEFORE в рабочем наборе данных.
Синтаксис метода MERGE-CHANGES:
<change-dataset-handle>:MERGE-CHANGES(<working-dataset-handle>).
В следующем примере клиент отправляет набор изменений на сервер для обновления базы данных. Затем сервер возвращает набор изменений и если ошибок в наборе не обнаружено, то выполняется слияния набора изменений с рабочим набором с последующей очисткой таблиц BEFORE.
/* client.p */ RUN update_dsOrderOrderLine IN hProc(INPUT-OUTPUT DATASET-HANDLE hChangeDataSet). IF hChangeDataset:ERROR = FALSE THEN DO: hChangeDataset:MERGE-CHANGES(hdsOrderOrderLine). END.