Обход действительного временного состояния в запросах AOT

У меня есть запрос AOT в Dynamics AX 2012, который состоит из таблиц HcmWorker и HcmEmployment (среди прочих). Моя проблема в том, что когда я создаю отчет (не SSRS) или иным образом использую этот запрос, я получаю только сотрудников с допустимым временным состоянием в HcmEmployment.

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

Я бы предпочел решение, в котором мне не нужно добавлять код каждый раз, когда я его использую (т.е. решаю его в запросе AOT).

Я попытался установить свойство validTimeStateDateTimeRange в запросе из кода, что привело к дублированию строк, если у сотрудника несколько должностей.

Если я установлю для источника данных HcmEmployment значение ExistsJoin и firstOnly, тогда он будет работать в представлении, но не в отчетах (все еще повторяющиеся записи) :( Использование этого представления в отчетах не вариант, потому что пользователи должны иметь возможность фильтровать по DefaultDimension от HcmEmployment.

Как я могу решить эту проблему?


person palantus    schedule 24.04.2012    source источник


Ответы (2)


Я «решил» свою проблему ...

По какой-то причине отчет неправильно наследовал свойства (ExistsJoin) из запроса AOT. После повторного сброса запроса на отчет, некоторых компиляций и следующего кода в методе query init он работает :) Больше никаких повторяющихся записей!

this.query().validTimeStateDateTimeRange(DateTimeUtil::minValue(), 
                                         DateTimeUtil::maxValue());
person palantus    schedule 25.04.2012

На мой взгляд, у вас есть противоречивые варианты:

Я хотел бы получить всех сотрудников, у которых есть запись в этой таблице, даже если у них нет текущей работы

а также:

пользователи должны иметь возможность фильтровать по DefaultDimension из HcmEmployment

Если пользователь фильтрует занятость, следует ли распечатывать сотрудника, если занятость не выбрана?

Что вам, вероятно, хотелось бы:

  • Если фильтрация по HcmEmployment не выполняется, отключите этот источник данных (свойство Enabled).

  • Если выполняется фильтрация по HcmEmployment, используйте существующее соединение.

В обоих случаях найдите maxof (ValidFrom), maxof (ValidTo) независимым выбором.

Взгляните на этот ответ, чтобы узнать, как редактировать свойства запроса по коду.

Или составьте два отчета, один с запросом к HcmEmployment и без него.

person Jan B. Kjeldsen    schedule 24.04.2012
comment
Если нет записи, соответствующей пользовательскому фильтру, то сотрудника не следует печатать. Если ЛЮБАЯ запись совпадает, то сотрудника нужно печатать ОДИН РАЗ. Для вашего решения потребуется довольно много кода в каждом месте, где используется запрос (МНОГИЕ отчеты), чего я надеюсь избежать. Но спасибо за предложение :) - person palantus; 24.04.2012
comment
Затем выберите второй вариант, используйте ExistsJoin, затем найдите оставшиеся поля в отдельном выборе. - person Jan B. Kjeldsen; 24.04.2012
comment
Если я использую ExistsJoin, я все равно получаю повторяющиеся записи. Как вы предлагаете использовать maxof? Единственный способ увидеть, что его можно использовать, - это отключить источник данных HcmEmployment, и при итерации по сотрудникам я могу проверить, есть ли у них занятость (используя диапазоны пользователей). К сожалению, производительность будет ужасной в базах данных с большим количеством сотрудников. Это решение, и я подумаю о его использовании, если не найду лучшего. - person palantus; 25.04.2012
comment
ExistsJoin будет работать, если все будет сделано правильно. В остальном я не могу помочь, так как это зависит от точных требований. - person Jan B. Kjeldsen; 25.04.2012