2015-12-08 4 views
1

я следующая схема: enter image description hereКак это сделать в ocl?

Для класса Boss, мне нужно имя всех агентов, которые сделали продажу с наибольшим значением (что-то вроде: Еогеасп агента, выберите имя агента, если он имеет max(foreach command, total = total + price of the product * quantity from command). Как это сделать в OCL

ответ

2

Если вы считаете, что вы в корне модели (без контекста, в частности) для того, чтобы отобрать 20 первые главные агенты:

Agent.allInstances()->sortedBy(- sale->collect(quantity*product.price)->sum())->subSequence(1, 20) 

и из Boss Например:

self.workers->sortedBy(- sale->collect(quantity*product.price)->sum())->subSequence(1, 20) 

Идея запросу (за 1-ый):

  1. получить все агенты (Agent.allInstances())
  2. сортировать их (...->sortedBy(...))
  3. с использованием суммы их продаж (... sale->...->sum())
  4. a "sale" определяется мультипликатором. количеств по цене ссылочного продукта (quantity*product.price)
  5. для каждой продажи, вычислить этот материал (...sale->collect(...))
  6. от этого конечного результата (sum один), инвертировать результат иметь вершины в первой позиции (... - sale->collect()->sum()...)
  7. из этого окончательного списка выберите последовательность подменю (...->subSequence(1,X))

EDIT>

Только подробно о классе ассоциации навигации (от «OCL Specification», с.21)

Для указания навигации к классам ассоциации (Работа и брак в данном примере), OCL использует точку и имя из ассоциация класса

После ранней версии спецификации, имя Association Class называется положить в нижнем регистре, в более поздней версии, название выпускаемая нетронутым.

EDIT2>

Для того, чтобы получить более высокий балл, и агенты называют, кто попадает этот высокий балл:

let score : Integer = -(self.workers->collect(sale->collect(quantity*product.price)->sum())->sortedBy(i | -i)->first()) 
in self.workers->select(sale->collect(quantity*product.price)->sum() = score).name 

Первый пусть выбрать более высокий балл (собрать все баллы, сортировать их в обратном порядке и выберите первый элемент), затем выберите всех работников, у которых оценка равна ранее вычисленной.

+0

спасибо! Я видел ваш комментарий к другому сообщению. Я хотел бы знать, что означает «-» перед «продажей»? –

+0

Что делать, если есть больше агентов, имеющих одинаковое значение?Например, агент1 и агент2 делали продажи на сумму по 100 штук каждый, и я не знаю, сколько у них было, но мне нужны имена всех агентов, попавших в максимальную цель. –

+1

Просто унарная минусовая операция, чтобы отсортировать список по обратному порядку, чтобы иметь верхний агент в первой позиции в списке. В OCL нет функции 'reverse' (в Acceleo есть, но не в« чистом »OCL), так что это мой трюк, чтобы отменить список. –

Смежные вопросы