Ax2009 — Перекрытие lookup() на диалоге класса

Представляю подробную шпаргалку, как перекрыть метод lookup() на диалоге класса в Microsoft Dynamics AX 2009.

В качестве примера выбрано поле InventLocation, которое зависит от поля InventSiteId. Выпадающий список складов на форме диалога должен ограничиваться в зависимости от выбранного значения в поле InventSiteId.

1. В ClassDeclaration

class Class1 extends RunBaseBatch
{
    InventSiteId        mInventSiteId;
    InventLocationId    mInventLocationId;
    
    DialogField             mDialogInventSiteId;
    FormBuildStringControl  mFBSControlInventLocationId;
    FormStringControl       mFSControlInventLocationId;
}

2. Перекрыть метод dialog()

protected Object dialog(DialogRunbase _dialog, boolean forceOnClient)
{
    DialogRunbase           dialog;
    DialogGroup             dialogGroup;
    ;

    dialog  = super(_dialog, forceOnClient);

    dialogGroup = dialog.addGroup("Складские аналитики");
    mDialogInventSiteId     = dialog.addFieldValue(TypeId(InventSiteId), mInventSiteId);
    mFBSControlInventLocationId    = dialogGroup.formBuildGroup().addControl(FormControlType::String, "dialogInventLocationId");
    mFBSControlInventLocationId.extendedDataType(extendedtypenum(InventLocationId));
    mFBSControlInventLocationId.text(mInventLocationId);

    return dialog;
}

3. Перекрыть метод dialogPostRun()

public void dialogPostRun(DialogRunbase _dialog)
{
    FormRun formRun;

    super(_dialog);

    //lookup and validation for inventlocationId is overridden
    formRun = _dialog.dialogForm().formRun();
    formRun.controlMethodOverload(true);
    formRun.controlMethodOverloadObject(this);

    //do casting from formbuildstringcontrol to formstringcontrol
    mFSControlInventLocationId = formRun.design().control(mFBSControlInventLocationId.id());
}

4. Создать метод dialogInventLocationId_lookup()

void dialogInventLocationId_lookup()
{
    ;

    InventLocation::lookupBySiteIdAllTypes(mFSControlInventLocationId, mDialogInventSiteId.value());
}

5. Перекрыть метод getFromDialog()

public boolean getFromDialog()
{
    boolean ret;
    ;

    ret = super();

    mInventSiteId       = mDialogInventSiteId.value();
    mInventLocationId   = mFSControlInventLocationId.text();

    return ret;
}

6. Метод содержит lookupBySiteIdAllTypes() следующий код:

public client static void lookupBySiteIdAllTypes(FormStringControl ctrl, InventSiteId inventSiteId)
{
    SysTableLookup       sysTableLookup = SysTableLookup::newParameters(tablenum(InventLocation), ctrl);
    Query                query = new Query();
    QueryBuildDataSource queryBuildDataSource;
    ;

    sysTableLookup.addLookupfield(fieldnum(InventLocation, InventLocationId));
    sysTableLookup.addLookupfield(fieldnum(InventLocation, Name));
    sysTableLookup.addLookupfield(fieldnum(InventLocation, InventSiteId));

    queryBuildDataSource = query.addDataSource(tablenum(InventLocation));

    if (inventSiteId)
        queryBuildDataSource.addRange(fieldnum(InventLocation, InventSiteId)).value(queryValue(inventSiteId));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *