Axapta Dialog Validation - PullRequest
       18

Axapta Dialog Validation

3 голосов
/ 09 ноября 2009

Я нашел несколько постов и статей в сети, в которых говорилось о проверке полей формы в диалогах, но ни один из найденных примеров не работает должным образом.

Может ли кто-нибудь опубликовать полный и краткий пример кода x ++, который генерирует диалог, содержащий одно текстовое поле, выполняет простую проверку (если text = "abc") над ним и закрывает окно (возвращая значение поля), если проверка проходит или генерирует предупреждение Infolog, не закрывая диалоговое окно, если проверка не удалась.

Для тех из нас, кто только начинает работать с x ++, я думаю, что было бы хорошей отправной точкой иметь действующий рабочий пример, на котором можно основываться.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 21 ноября 2009

Вот пример в AX 2009 о том, как создать простой диалог с использованием класса RunBase. В нем я создаю класс с именем DialogExample и наследую от RunBase. Чтобы показать диалоговое окно, вам просто нужно запустить класс, но обычно это можно сделать, указав MenuItem на класс.

public class DialogExample extends RunBase
{
    DialogField dialogName;
    Name name;

    #DEFINE.CurrentVersion(1)
    #LOCALMACRO.CurrentList
        name
    #ENDMACRO
}

Object dialog()
{
    Dialog dialog = super();
    ;

    // Add a field for a name to the dialog. This will populate the field with 
    // any value that happens to be saved in name from previous uses of the
    // dialog.
    dialogName = dialog.addFieldValue(TypeId(Name), name);

    return dialog;
}

boolean getFromDialog()
{
    ;

    // Retrieve the current value from the dialog.
    name = dialogName.value();

    return true;
}

boolean validate(Object _calledFrom = null)
{
    boolean isValid;

    isValid = super(_calledFrom);


    // Perform any validation nessecary.
    if (name != 'abc')
    {
        isValid = checkFailed('Name is not equal to abc') && isValid;
    }

    return isValid;
}

Name parmName()
{
    ;

    return name;
}

public container pack()
{
    return [#CurrentVersion,#CurrentList];
}

public boolean unpack(container _packedClass)
{
    int version = conpeek(_packedClass, 1);

    switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = _packedClass;
            break;
        default :
            return false;
    }

    return true;
}

public static void main(Args args)
{
    DialogExample DialogExample;
    ;

    dialogExample = new dialogExample();

    // Display the dialog. This only returns true if the the user clicks "Ok" 
    // and validation passes.
    if (dialogExample.prompt())
    {
        // Perform any logic that needs to be run.
        info(dialogExample.parmName());
    }
}

Обычно в этом сценарии логика, которую нужно запустить, будет помещена в метод run класса, а затем вызвана из main, если нажата кнопка Ok. Поскольку метод run был бы методом экземпляра, это избавляет от необходимости для методов parm обращаться к значению поля в диалоговом окне.

2 голосов
/ 27 марта 2012

Я знаю, что это старый вопрос, но следует также отметить, что для людей, начинающих в мире разработки AX, в AOT есть отличные примеры рабочего кода, ищите Формы и Классы с префиксом "Tutorial_ ».

Tutorial_RunBaseForm - это класс в AOT, который дает вам именно то, что вам нужно.

...