1

Wizard>wizardを使用してAxe2012でウィザードを作成し、Custtablelistpageフォームからこのウィザードを呼び出しています...今、CustAccountのようなこのウィザードにいくつかのコントロールを配置し、選択したレコードからこのコントロールの値を初期化する必要があります。 Custtablelistpageフォーム....Argsクラスを使用してこれを実行しようとしていますが、機能していません。いくつかの解決策を提案してください。

ツール>ウィザード>ウィザードを使用してAX2012で1つのウィザードを作成してから、このウィザードのメニュー項目をcusttablelistpageのどこかに配置してください。その後、ウィザードのウェルカムタブに「顧客アカウント」という名前のフィールドを1つ入力してください。ここで、custtablelistpage形式で表示されているレコードがある場合は、それを選択してください。私の仕事は、custtablelistpageに置いたメニュー項目ボタンをクリックしたときに、選択したレコードのアカウント番号をウィザードに表示することです。

実際、私はいくつかのコードを作成しましたが、これは通常の形式では完全に正常に機能しています。しかし、それはウィザードでは機能せず、ウィザードのコントロールで初期化する値を取得していません。

4

1 に答える 1

3

わかりました、これを試すのに時間がかかりました。解決策が 2 つあります。

  • バインドされていないコントロールを使用してそれを行い、選択したレコードを渡すことができます
  • または、ウィザード フォームでデータソースを使用して、選択した値をフィルター処理することもできます。

まず、単純なバインドされていないコントロールを使用して試してみましょう。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();
    }
}

したがって、ここで実際に行うことは、ウィザード クラスに格納されている選択されたレコードを取得することです。次に、値を割り当てたいコントロールが実際に値を入れるのに適切なコントロールであるかどうかを確認します。

これは機能していますが、2番目の方法をお勧めします。それは、フォームでデータソースを使用し、このように選択したレコードに範囲を設定することです。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 でそれを取得し、選択したレコードに範囲を設定します。残りのすべての魔法は、バインドされたデータ コントロールを使用した通常の Axe の動作です。

だから私はこれがあなたが必要としていたものであることを願っています. ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-12-21T14:01:25.750 に答える