1

我已经使用wizard>wizard在Ax 2012中创建了一个向导,我从Custtablelistpage表单中调用了这个向导......现在,我已经在这个向导中放置了一些控件,比如CustAccount,我需要在这个控件中从选定的记录中初始化值Custtablelistpage 表单..我正在尝试使用 Args 类执行此操作,但它不起作用,请提出一些解决方案..

请使用工具>向导>向导在 AX 2012 中创建一个向导,然后,请将此向导的菜单项放在 custtablelistpage 的某个位置。之后,请在向导的欢迎选项卡上放置一个名为客户帐户的字段。现在,如果您有任何以 custtablelistpage 形式显示的记录,请选择它。我的任务是当我单击放在 custtablelistpage 上的菜单项按钮时,向我的向导显示所选记录的帐户编号。

实际上,我已经编写了一些代码,这对于正常形式来说工作得非常好。但它不适用于向导,我没有在我的向导控件中获得初始化的价值。

4

1 回答 1

3

好的,我花了一些时间来尝试这个,我有两个可能的解决方案给你。

  • 您可以通过使用未绑定的控件并传入选定的记录来完成
  • 或者您可以在向导表单上使用数据源并过滤所选值

首先让我们尝试使用一个简单的未绑定控件来完成它。首先将 CustTable 成员变量和参数方法添加到您的向导类。

public class MyTestWizardWizard extends SysWizard
{
    CustTable   mySelectedCustomer;
}

public CustTable parmMySelectedCustomer(CustTable _mySelectedCustomer = mySelectedCustomer)
{
    ;
    mySelectedCustomer = _mySelectedCustomer;
    return mySelectedCustomer;
}

然后在您的表单中,您可以覆盖 init 方法并执行以下操作:

void init()
{
    int                 controlid;
    FormStringControl   fsControl;
    ;

    super();

    if (element.Args().caller())
    {
        sysWizard = element.Args().caller();

        // Get the control id of the CustomerId control 
        controlid = element.controlId(formControlStr(MyTestWizardWizard, CustomerId));  

        // Check if we actually have a form string control
        if(element.control(controlid) is FormStringControl)
        {
            // Cast to the FormStringControl type
            fsControl = element.control(controlid) as FormStringControl;

            // Now fill in the field value
            fsControl.text(sysWizard.parmMySelectedCustomer().AccountNum);
        }
    }
    else
    {
        MyTestWizardWizard::main(new args());
        element.closeCancel();
    }
}

因此,您实际上在这里所做的只是获取存储在您的向导类中的选定记录。然后我们检查我们要为其赋值的控件是否真的是正确的控件来放置值。

虽然这是可行的,但我更喜欢第二种方法。那将是在表单上使用数据源并像这样在所选记录上放置一个范围。只需将 CustTable 作为数据源放在表单上,​​然后像往常一样放置控件即可。

然后,确保 init 方法在底部执行 super() 调用,以确保在调用数据源方法之前完成初始化:

void init()
{
    ;

    // make sure the sysWizard is already initialized before the super to make sure the init on the datasource has an instance of sysWizard
    if (element.Args().caller())
    {
        sysWizard = element.Args().caller();
    }
    else
    {
        MyTestWizardWizard::main(new args());
        element.closeCancel();
    }

    super();
}

然后覆盖数据源上的 init 方法,在 custTable 的 recId 字段上放置一个范围。请注意,您可以在 ExecuteQuery 方法中分配范围的值,但对于这种情况,我只是在这里执行。

public void init()
{
    ;
    super();

    SysQuery::findOrCreateRange(this.query().dataSourceTable(tableNum(CustTable)), fieldNum(CustTable, RecId)).value(queryValue(SysWizard.parmMySelectedCustomer().RecId));
}

现在,当您的向导运行时,args 将记录传递给您的向导类,表单在数据源的 init 中获取它,并在您选择的记录上放置一个范围。所有其余的魔法都是具有绑定数据控件的正常 Ax 行为。

所以我希望这是你需要的。如果您还有其他问题,请告诉我。

于 2012-12-21T14:01:25.750 回答