How-to: Явная типизация
Иногда возникают ситуации, когда необходимо использовать одинаковое имя для разных свойств или действий системы.
Например создадим два свойства с именем sum, одно из которых вычисляет сумму строки заказа, а второе - сумму всего заказа:
sum = DATA NUMERIC[10,2] (OrderDetail);
sum = GROUP SUM sum(OrderDetail od) BY order(od);
Соответственно, первое свойство принимает на вход один параметр класса OrderDetail, а второе - один параметр класса Order.
Теперь если создать, к примеру, ограничение с одним параметром, и попытаться обратиться к свойству с именем sum без явного указания класса этого параметра платформа выдаст ошибку:
Все такие обращения требуют явного указания класса параметров:
CONSTRAINT sum(Order o) < 0 MESSAGE 'Сумма заказа должна быть положительной';
Класс параметра, вводимого внутри выражения, задается так же — при первом использовании параметра. Например, типовая задача — найти объект по значению его свойства (здесь свойство name объявлено у нескольких классов):
currency (STRING[10] name) = GROUP MAX Currency currency IF name(currency) = name;
Задать класс параметра оператором AS нельзя: в записи GROUP MAX currency AS Currency IF name(currency) = name параметр currency остается нетипизированным — AS создает свойство, которое возвращает значение, только если оно принадлежит классу, но класс самого параметра не меняет, поэтому обращение name(currency) даст ту же ошибку.