воскресенье, 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:

public class FormRun extends ObjectRun
{
    boolean active;
    boolean subitemgoyn;
    itemId itemRangeValue;
    subitemNumber subitemNumberValue;
    Int64 subitemgoValue;
    placeRecId currentplaceValue;
    placeRecId 1stplaceValue;
    String255 subitemGroupValue;
    QueryBuildRange itemRange;
    QueryBuildRange arrStatRange;
    QueryBuildRange curStatRange;
    QueryBuildRange subitemNumRange;
    QueryBuildRange subitemgoRange;
    QueryBuildRange subitemGroupRange;
}
public boolean activateFilter(boolean _active=active)
{
    active = _active;
    return active;
}
public Int64 1stplaceValue(placeRecId _rangeValue = 1stplaceValue)
{
    1stplaceValue = _rangeValue;
    return 1stplaceValue;
}
public Int64 subitemgoValue(Int64 _rangeValue = subitemgoValue)
{
    subitemgoValue = _rangeValue;
    return subitemgoValue;
}
public boolean subitemgoYesNo(boolean _subitemgoyn=subitemgoyn)
{
    subitemgoyn = _subitemgoyn;
    return subitemgoyn;
}
public str subitemGroupValue(String255 _rangeValue = subitemGroupValue)
{
    subitemGroupValue = _rangeValue;
    return subitemGroupValue;
}
public Integer subitemNumberValue(subitemNumber _rangeValue = subitemNumberValue)
{
    subitemNumberValue = _rangeValue;
    return subitemNumberValue;
}
private void createFilters()
{
    itemRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, itemId)));
        if  (itemRange==null) {
            itemRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, itemId));
        }
    arrStatRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, 1stplace)));
        if  (arrStatRange==null) {
            arrStatRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, 1stplace));
        }
    curStatRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, Currentplace)));
        if  (curStatRange==null) {
            curStatRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, Currentplace));
        }
    subitemNumRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, subitemNumber)));
        if  (subitemNumRange==null) {
            subitemNumRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, subitemNumber));
        }
    subitemgoRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, subitemgo)));
        if  (subitemgoRange==null) {
            subitemgoRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, subitemgo));
        }
    subitemGroupRange = (MyTable_ds.query().dataSourceTable(tableNum("MyTable")).findRange(fieldNum(MyTable, subitemGroup)));
        if  (subitemGroupRange==null) {
            subitemGroupRange = MyTable_ds.query().dataSourceTable(tableNum("MyTable")).addRange(fieldNum(MyTable, subitemGroup));
        }
}
public Int64 currentplaceValue(placeRecId _rangeValue = currentplaceValue)
{
    currentplaceValue = _rangeValue;
    return currentplaceValue;
}
public void init()
{
    active = false;
    subitemgoyn = false;
    super();
    element.createFilters();
}
public str itemRangeValue(itemId _rangeValue = itemRangeValue)
{
    itemRangeValue = _rangeValue;
    return itemRangeValue;
}
public void update()
{
    MyTable_ds.executeQuery();
}
public void updateFilters()
{
    if (active) {
        if (itemRangeValue!="") {
            itemRange.value(queryValue(itemRangeValue));
        }
        if (currentplaceValue!=0) {
            curStatRange.value(queryValue(currentplaceValue));
        }
        if (1stplaceValue!=0) {
            arrStatRange.value(queryValue(1stplaceValue));
        }
        if (subitemNumberValue!=0) {
            subitemNumRange.value(queryValue(subitemNumberValue));
        }
        if (subitemgoyn) {
            subitemgoRange.value(queryValue(subitemgoValue));
        }
        if (subitemGroupValue!="") {
            subitemGroupRange.value(queryValue(subitemGroupValue));
        }
    }
    else {
      itemRange.value(SysQuery::valueUnlimited());
      curStatRange.value(SysQuery::valueUnlimited());
      arrStatRange.value(SysQuery::valueUnlimited());
      subitemNumRange.value(SysQuery::valueUnlimited());
      subitemgoRange.value(SysQuery::valueUnlimited());
      subitemGroupRange.value(SysQuery::valueUnlimited());
      subitemgoyn = false;
    }
}

Комментариев нет:

Отправить комментарий