How-to: GROUP MAX/MIN/AGGR
Example 1
Task
We have a set of books, where each book has a unique ID.
CLASS Book 'Book';
id 'Number' = DATA INTEGER (Book);
We need to find the maximum book ID.
Solution
maxId 'Maximum number' () = GROUP MAX id(Book b);
Example 2
Task
Similar to Example 1.
We need to find a Book
object by book ID.
Solution
// Option 1
book1 'Book' (INTEGER i) = GROUP MAX Book b BY id(b);
// Option 2
book2 'Book' (INTEGER i) = GROUP AGGR Book b BY id(b);
The difference between Option 2 and Option 1 is that declaration of this property puts a constraint on the uniqueness of book IDs. Any attempt to add two or more books with the same ID will result in the error message.
Example 3
Task
We have a set of books, where each book is associated with a category and price.
CLASS Category 'Category';
category 'Category' = DATA Category (Book);
price 'Price' = DATA NUMERIC[10,2] (Book);
We need to calculate the minimum price per category.
Solution
minPrice 'Maximum number' (Category c) = GROUP MIN price(Book b) BY category(b);
Example 4
Task
We have a book shipment document.
CLASS Shipment 'Shipment';
CLASS ShipmentDetail 'Shipment line';
shipment 'Shipment' = DATA Shipment (ShipmentDetail) NONULL DELETE;
book 'Book' = DATA Book (ShipmentDetail);
We need to find a line with a given shipment by shipment document and book.
Solution
shipmentDetail 'Shipment line' (Shipment s, Book b) = GROUP MAX ShipmentDetail d BY shipment(d), book(d);
You can use this property to implement the Search functionality when inputting a shipment document.