Описание изменения объекта по заданным условиям

Изменение данных объекта

Бывают ситуации, когда можно допустить изменение какого-либо поля объекта, только если это удовлетворяет некоторым условиям относительно старого значения этого же поля. Однако, на момент попадания объекта в бизнес-сервер (в метод OnUpdate), информация о старом значении поля уже отсутствует.

Старое значение поля можно узнать, вычитав его из базы, так как измененный объект хранится в памяти приложения, но изменения еще не попали в базу.

Пример

В банке, в котором планируется использование этой системы, предусмотрено следующее правило: срок кредита, определенный для клиента при выдаче кредита, может быть продлен, но при этом обязательно увеличение суммы кредита (наложение штрафов). При этом, срок кредита не может быть уменьшен, а только увеличен.

  • Создать бизнес-сервер для класса Кредит (если он еще не был создан).
  • В методе OnUpdate напишем следующий код:
if (UpdatedObject.GetStatus() == ObjectStatus.Altered)
{
    var newValue = UpdatedObject;
    var ds = (MSSQLDataService)DataService;
    var oldValue = ds.Query<Кредит>(Кредит.Views.КредитE).Where(k => k.__PrimaryKey == UpdatedObject.__PrimaryKey).First();

    if (newValue.СрокКредита > oldValue.СрокКредита && newValue.СуммаКредита <= oldValue.СуммаКредита)
        throw new Exception("При изменении срока кредита сумма кредита должна увеличиться.");

    if (newValue.СрокКредита < oldValue.СрокКредита)
        throw new Exception("Срок кредита не может уменьшиться.");
}

oldValue можно получить и таким образом:

LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Кредит), Кредит.Views.КредитE);
var ld = SQLWhereLanguageDef.LanguageDef;
lcs.LimitFunction = ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, "Клиент"), UpdatedObject.Клиент.__PrimaryKey);
var oldValue = DataService.LoadObjects(lcs)[0) as Кредит;
UpdatedObject.GetStatus() == ObjectStatus.Altered

При такой проверке статуса отсекаются варианты, когда объект создан или удален.

Таким образом мы можем проверять вводимые данные на основании уже существующих данных.