понедельник, 29 апреля 2013 г.

Создание master/detail формы

Часто возникающая задача - в верхней (левой) части формы список header'ов, а в нижней (или правой) части - список details'ов. Здесь популярно расписано решение: http://daxdave.blogspot.ru/2006/10/creating-headerdetail-based-linkage-on.html
PS да, и тут ни строчки кода ;)
 PPS  и вдогонку оставлю тут ссылочку про как сделать вертикальный сплиттер на форме:  http://dynamicsaxposed.wordpress.com/2011/08/17/how-to-make-vertical-splitter-on-forms-in-ax-2012/

среда, 24 апреля 2013 г.

Зависимые Lookup на форме

Возникла необходимость сделать серию из трёх зависимых полей, выбор значения в одном из них фильтрует значения во втором, выбор второго фильтрует третий. Азбучный пример из книги (перекрытие метода lookup) отлично подходит для поля StringEdit, но отказывается работать на ReferenceGroup. Для последнего необходимо перекрывать lookupReference.
public void lookup() //для StringEdit

воскресенье, 7 апреля 2013 г.

“Продвинутый” фильтр на форме

Microsoft Dynamics AX 2012 for Developers [AX 2012]
Форма позволяет фильтровать Grid различными способами, но нам захотелось сделать свой – по нажатию кнопки открывать дочернюю форму, в которой задать определенные поля, которые сформируют нужный Query.
Первая попытка – сделать extends RunBase класс, в котором создавать DialogField. Всё было б ничего, но не получилось следующее – хотелось вывести в выпадающем меню фильтра Name, а передать в query родительской формы RecId.
Вторая попытка – вызывать из формы всё тот же класс, сделать от этого класса форму, в которой можно разместить ReferenceField, который реализует нужный нам функционал…
Оба эти примера не доделаны, сюда скинул промежуточный итог.
Рабочий и самый простой вариант – одна простая форма. Тут её код:

public class FormRun extends ObjectRun
{
    Object caller;
    boolean activate;
}
void closeOk()
{
    super();
    caller = element.args().caller();
    caller.itemRangeValue(itemIdStringEdit.text());
    caller.subitemNumberValue(subitemNumberIntEdit.value());
    caller.subitemGroupValue(subitemGroupStringEdit.text());
    caller.subitemgoValue(subitemgoReferenceGroup.value());
    if (subitemgoYesNo.checked()) {
        caller.subitemgoYesNo(true);
    }
    caller.1stplaceValue(1stplaceReferenceGroup.value());
    caller.currentplaceValue(CurrentplaceReferenceGroup.value());
    caller.activateFilter(true);
    caller.update();
   ));
}

и код формы – caller’a:

SSRS Отчеты в Dynamics AX 2012

Developing Reports for Microsoft Dynamics AX in Visual Studio [AX 2012]

Очень полезный фрагмент книжки о разработке отчетов – позволяет быстро начать, даже если раньше вам не приходилось работать с Reporting Services + Dynamics.
Находится тут: http://www.slideshare.net/harshnmh/developing-ssrsreportsfordynamicsax
+для себя копия
Задача стояла следующая – необходимо разработать простой отчет, в котором на входе должен быть параметр, взятый из грида. На форме размещается кнопка, по нажатию на кнопку Action – class, код класса ниже:

class RdpReport extends SrsReportRunController
{
    #define.ReportName('QueryBasedReport.Report')
}
protected void prePromptModifyContract()
{
    this.setRanges(this.parmReportContract().parmQueryContracts().lookup(this.getFirstQueryContractKey()));
}
public static client void main(Args _args)
{    rdpReport controller = new rdpReport();
    controller.parmReportName(#ReportName);
    controller.parmArgs(_args);
    controller.startOperation();
}
private void setRanges(Query _query)
{
    real volumeRange;
    Report ReportLocal;
  
    if (this.parmArgs())
    {
                ReportLocal = this.parmArgs().record();
                volumeRange = ReportLocal.Volume;
    }
   
    if (volumeRange)
    {
        SysQuery::findOrCreateRange(
            _query.dataSourceTable(tableNum(Report)),
            fieldNum(Report, Volume)).value(int2str(volumeRange));
    }   
}