How-to: GROUP MAX/MIN/AGGR
Пример 1
Условие
Есть набор книг, для каждой из которых задан уникальный номер.
CLASS Book 'Книга';
id 'Номер' = DATA INTEGER (Book);
Необходимо найти максимальный номер книги.
Решение
maxId 'Максимальный номер' () = GROUP MAX id(Book b);
Пример 2
Условие
Аналогично Примеру 1.
Необходимо по номеру книги найти объект 'Книга'
.
Решение
// Вариант 1
book1 'Книга' (INTEGER i) = GROUP MAX Book b BY id(b);
// Вариант 2
book2 'Книга' (INTEGER i) = GROUP AGGR Book b BY id(b);
Вариант 2 отличается от варианта 1 тем, что объявление этого свойства добавляет ограничение на уникальность номера для книги. При попытке добавить две книги с одинаковыми номерами будет выдано сообщение с ошибкой.
Пример 3
Условие
Есть набор книг, для каждой из которых задана категория и цена.
CLASS Category 'Категория';
category 'Категория' = DATA Category (Book);
price 'Цена' = DATA NUMERIC[10,2] (Book);
Нужно посчитать минимальную цену по категории.
Решение
minPrice 'Минимальная цена' (Category c) = GROUP MIN price(Book b) BY category(b);
Пример 4
Условие
Задан документ отгрузки книг.
CLASS Shipment 'Отгрузка';
CLASS ShipmentDetail 'Строка отгрузки';
shipment 'Отгрузка' = DATA Shipment (ShipmentDetail) NONULL DELETE;
book 'Книга' = DATA Book (ShipmentDetail);
Необходимо найти некоторую строку отгрузки по документу и книге.
Решение
shipmentDetail 'Строка отгрузки' (Shipment s, Book b) = GROUP MAX ShipmentDetail d BY shipment(d), book(d);
Этот свойство может использоваться для реализации функционала Подбор при вводе документа отгрузки.