zoukankan      html  css  js  c++  java
  • AX开发中在Form之间传递参数

    AX开发中在Form之间传递参数是必不可少的,很多初学者可能对如何传参数有疑惑。下面这篇文章通过例子详细的解释了如何实现。

    原文来自: https://mfmujahidmim.wordpress.com/2013/02/25/passing-parameters-between-forms-in-ax/

       

    Raziq AX's Blog

    A technical blog…………

    Menu

    passing parameters between forms in AX

    In dynamics AX, working with forms, there are times when you need to pass some information from current form to the opened form, so the question arrived is that what’s the best way to open the new form and pass information.

    Answer: It depends upon the information that is needed in the new form; there is Args class that plays an important role to pass the information. Let’s take a look on some of the important methods of that class

    Args class (Argument)

    “The Args class is used to pass arguments such as a name, a caller, and parameters between application objects”

    Some important methods are

    Caller
     
    Gets or sets the instance of the object that created this instance of the Args class.
    name
     
    Gets and sets the name of the application object to call.
    parm
     
    Gets or sets a string that specifies miscellaneous information for the called object.
    parmEnum Gets or sets the enumeration value of the enumeration type that is specified in the parmEnumType method.
    parmEnmType
     
    Gets or sets the ID value of any enumeration type.
    ParmObject
     
    Gets or sets an instance of any object to pass to the called object.
     
    record
     
    Gets and sets the record from the table on which the caller object is working.
    There are four methods that can be used to pass extra information to the new class:
    1. The parm method – to pass strings
    2. The parmEnum and parmEnumType method – to pass enumeration values
    3. The parmObject method – to pass an object of any type.

    Examples:

    1.      If you need a data from the parent form main data source for the current record, so you don’t need to do anything in parent, just create a display menu item and give the form name that needs to be opened, create a menuItem button and assign the newly created menu item.
    Override the Init method on opened form
    And you get the parent dataset records as
    element.args().record()
    2.      Need to pass any object/string/Enum

    Use the same approach for creating the button

    Parent form
    void clicked()
    {
    Args args;
    FormRun formRun;super();args = new Args(formstr(FormName));
     // To pass any string value
    args.parm(<stringlue>);
     // To pass any object
    args.parmObject(<object>);
     // To pass any Enum
           args.parmEnum( EnumValue);
    args.parmEnumType( EnumNum( <EnumName>) );
     formRun = classFactory.FormRunClass(args);
    formRun.init();
    formRun.run();
    formRun.wait();
    formRun.detach();
    parenttable_ds.refresh(); // Refreshing parent table DataSourceTable
    parenttable_ds.executeQuery(); // Refreshing Parent DataSourceTable
    }
    Child Form
    void init()
    {
    args = element.args();
        // get string parameter
    < string> = args.parm();
        // get object parameter
        <object> = args.parmObject();
        // get enum parameter
    if( element.args().parmEnumType() == EnumNum( <EnumName>) )
    {
    < enum contol/variable>  =( element.args().parmEnum() );
    }
    }3.      There are many parameters that you need to pass to the child form.
                   In that scenario, you need to create an extra class (parameter/contract class), you can first set the parameters in the init method for that class, use the parmObject for setting and gets the object on the child form
    =======================================================================================

    Argument Passing between Forms in Dynamics Ax 2009

    Here a sample code to pass argument to one form to another form and using of Args() class.
    Steps:
    1) Create two Forms named FormA and FormB
    2)Use the EmplTable as the Datasource of both forms
    3)Design FormA with one Grid and add 4 data fields to the Grid(EmplId,DEL_Name,Grade,EmplStatus…..)
    4)Assign the datasource for the grid and the data fields
    5)Add a Button in FormA
    6)Override the Clicked() method and write the below code:
    void Clicked()
    {
    Args    _args;
    FormRun _formRun;
    EmplId   _empId;
    ;
    _empId = EmplTable.EmplId;  // Selected employee id in the Grid is assigned to the variable which is pass to the next form
    _args = new Args(); // creating a object for args class
    _args.name(formstr(VA_FormB));  // Form Menuitem
    _args.caller(this);  // Form Caller(Current Form is mentioned as this)
    _args.parm(_empId); // Employee Number is passed to next form[but parm() is not a best practise]
    _args.record(EmplTable); // Table name is passed
    _formRun = ClassFactory.formRunClass(_args); //new FormRun(_args);   // Creating object for FormRun
    _formRun.init();   // Form Initialization for Load
    _formRun.run();  // Form Run for process
    _formRun.wait(); // Form Wait for Display
    }
    7) Open the Second Form – FormB
    8) Add one Grid Control and set the Data Source is EmplTable
    9) Add 4 data fields as same in the Form A
    10)Now Override the Init() of Form
    public void init()
    {
    parmid      _parmId;
    EmplTable   _EmplTable;
    //     DictTable   _dictTable;    FormBuildDataSource   _ds;    FormBuildGridControl frmGrid; // These are for dynamicForm creation so leave it
    _parmId =  element.args().parm(); // Getting the argument value from the Caller
    //info(int2str(element.args().record().TableId));
    if(!element.args().caller())   // Check the form is called by caller or directly, if directly it throw error
    throw error(“Cant Run Directly”);
    if(element.args().record().TableId == tablenum(EmplTable))   // check if the sent Table and the Current form table are equal or not
    {
    //        _EmplTable = element.args().record();  // Assign the Received Table name to Local Variable
    //_dictTable = new DictTable(element.args().record().TableId);  // leave it , is used for Dynamic Form Creation
    //_ds = form.addDataSource(_dictTable.name());  // leave it , is used for Dynamic Form Creation
    //_ds.table(_dictTable.id());   // leave it , is used for Dynamic Form Creation
    //frmGrid = form.addControl(FormControlType::Grid, “Grid”);   // leave it , is used for Dynamic Form Creation
    //frmGrid.dataSource(_ds.name());   // leave it , is used for Dynamic Form Creation
    //info(strfmt(“%1     %2″,_EmplTable.EmplId,_EmplTable.DEL_Name));
    //frmGrid.addDataField(_ds.id(),fieldnum(EmplTable, DEL_Name));  // leave it , is used for Dynamic Form Creation
    //        EmplTable_EmplId.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation
    //        EmplTable_EmplId.dataField(fieldnum(EmplTable,EmplID));   // leave it , is used for Dynamic Form Creation
    //        EmplTable_DEL_Name.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation
    //        EmplTable_DEL_Name.dataField(fieldnum(EmplTable,EmplId));  // leave it , is used for Dynamic Form Creation
    //        EmplTable_DEL_Email.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation
    //        EmplTable_DEL_Email.dataField(fieldnum(EmplTable,EmplId));   // leave it , is used for Dynamic Form Creation
    super();  // Form Initialization
    }
    else
    {
    info(“DataSet Not Received”);  // throw error
    }
    }
    11)Override the Init() of the DataSource
    public void init()
    {
    switch(element.args().dataset())// get the table id sent by caller
    {
    case tablenum(EmplTable):  // check the table if matches with this tableid
    {
    _EmplID  =   element.args().parm();  // get the argument value
    query   = new Query();            queryBuildRangeProj =                                          query.addDataSource(tablenum(EmplTable)).addRange(fieldnum(EmplTable,EmplId));          // query build for the form to display
    queryBuildRangeProj.value(_emplId); // Criteria for the form
    EmplTable_ds.query(query); // execution of the query
    break;
    }
    }
    super(); //datasource  initialization on the form based on the criteria
    }
    12) Save it, and create two menu items for each.
    13) It is important to change the runon property of the FormB as CalledFrom.
    14)Run the FormA and select an Employee Record and click the button.
    15)The FormB opens with the Related information of the Selected Employee on form.
     
    ===========================================================================

    Passing values between forms

     
     

    For passing parameters from one form to another a special class Args is usually used.

    Example:

    The code of button click event of FormA which calls FormB and passes some parameters to that form.

    void clicked()
    {
        // Args class is usually used in Axapta for passing parameters between forms
        Args            args;
        FormRun         formRun;
        // Our custom made class for passing complex set of parameters
        FormBParams     formBParams = new FormBParams();
        Array           items = new Array( Types::String );
        int         i;
        ;
    
        args = new args();
    
        // Our values which we want to pass to FormB
        // If we want pass just simple string we can use 'parm' method of 'Args' class
        args.parm( strValue.text() );
        // We also can pass enum value to FormB
        args.parmEnum( NoYesEnumValue.selection() );
        args.parmEnumType( EnumNum( NoYes ) );
        // and also can pass a cursor pointing to some record (in our case it is EmplTable )
        args.record( EmplTable );
    
        // If we want pass more complex set of parameters we can develop our own class
        // just for passing our parameters.
        formBParams.parmSomeDate( someDate.dateValue() );
        formBParams.parmSomeTime( someTime.value() );
        for( i=0; i<ListBox.items(); i++ )
        {
            items.value( i+1,  ListBox.getText( i ) );
        }
        formBParams.parmItems( items );
        // Pass our object to FormB
        args.parmObject( formBParams );
    
        // Run FormB
        args.name( formstr( FormB ) );
        formRun = classFactory.formRunClass( Args );
        formRun.init();
        formrun.run();
        formrun.wait();
    
        if( formrun.closedOk() )
        {
            answerFromFormB.text( args.parm() );
        }
        super();
    }

    The code of init method of FormB

    public void init()
    {
        EmplTable       emplTableRecord;
        FormBParams     formBParams;
        Array           items;
        int             i;
        ;
        super();
    
        // Check for passed arguments
        if( element.args() )
        {
            // get string parameter
            strValue.text( element.args().parm() );
    
            // get enum parameter
            if( element.args().parmEnumType() == EnumNum( NoYes ) )
            {
                NoYesEnumValue.selection( element.args().parmEnum() );
            }
            // get object parameter
            if( element.args().parmObject() )
            {
                formBParams = element.args().parmObject();
                items       = formBParams.parmItems();
                for( i=1; i<=items.lastIndex(); i++ )
                {
                    ListBox.add( items.value(i) );
                }
                someDate.dateValue( formBParams.parmSomeDate() );
                someTime.value( formBParams.parmSomeTime() );
            }
            // get record parameter
            if( element.args().record() && element.args().record().TableId == TableNum( EmplTable ) )
            {
                emplTableRecord =  element.args().record();
                emplName.text( emplTableRecord.Name );
            }
        }
    }

    The code of ok button click event of FromB

    void clicked()
    {
        super();
        element.args().parm( strAnswer.text() );
        element.closeOk();
    }

    The above code is cut out from a demo which you can download here.

    ===========================================================================

    For passing parameters from one form to another a special class Args is usually used.

    Example:

    The code of button click event of FormA which calls FormB and passes some parameters to that form.

    void clicked()
    {
        // Args class is usually used in Axapta for passing parameters between forms
        Args            args;
        FormRun         formRun;
        // Our custom made class for passing complex set of parameters
        FormBParams     formBParams = new FormBParams();
        Array           items = new Array( Types::String );
        int         i;
        ;
    
        args = new args();
    
        // Our values which we want to pass to FormB
        // If we want pass just simple string we can use 'parm' method of 'Args' class
        args.parm( strValue.text() );
        // We also can pass enum value to FormB
        args.parmEnum( NoYesEnumValue.selection() );
        args.parmEnumType( EnumNum( NoYes ) );
        // and also can pass a cursor pointing to some record (in our case it is EmplTable )
        args.record( EmplTable );
    
        // If we want pass more complex set of parameters we can develop our own class
        // just for passing our parameters.
        formBParams.parmSomeDate( someDate.dateValue() );
        formBParams.parmSomeTime( someTime.value() );
        for( i=0; i<ListBox.items(); i++ )
        {
            items.value( i+1,  ListBox.getText( i ) );
        }
        formBParams.parmItems( items );
        // Pass our object to FormB
        args.parmObject( formBParams );
    
        // Run FormB
        args.name( formstr( FormB ) );
        formRun = classFactory.formRunClass( Args );
        formRun.init();
        formrun.run();
        formrun.wait();
    
        if( formrun.closedOk() )
        {
            answerFromFormB.text( args.parm() );
        }
        super();
    }

    The code of init method of FormB

    public void init()
    {
        EmplTable       emplTableRecord;
        FormBParams     formBParams;
        Array           items;
        int             i;
        ;
        super();
    
        // Check for passed arguments
        if( element.args() )
        {
            // get string parameter
            strValue.text( element.args().parm() );
    
            // get enum parameter
            if( element.args().parmEnumType() == EnumNum( NoYes ) )
            {
                NoYesEnumValue.selection( element.args().parmEnum() );
            }
            // get object parameter
            if( element.args().parmObject() )
            {
                formBParams = element.args().parmObject();
                items       = formBParams.parmItems();
                for( i=1; i<=items.lastIndex(); i++ )
                {
                    ListBox.add( items.value(i) );
                }
                someDate.dateValue( formBParams.parmSomeDate() );
                someTime.value( formBParams.parmSomeTime() );
            }
            // get record parameter
            if( element.args().record() && element.args().record().TableId == TableNum( EmplTable ) )
            {
                emplTableRecord =  element.args().record();
                emplName.text( emplTableRecord.Name );
            }
        }
    }

    The code of ok button click event of FromB

    void clicked()
    {
        super();
        element.args().parm( strAnswer.text() );
        element.closeOk();
    }
  • 相关阅读:
    联机交易场景持续拓展,巨杉数据库中标吉林省农信
    巨杉数据库与深度操作系统合作共建基础软件技术生态
    SequoiaDB报告创建线程失败的解决办法
    巨杉数据库中标张家口银行、保定银行,华北地区布局再升级
    扩展国产数据库生态,巨杉技术社区与恩墨学院建立全面合作
    巨杉Tech | SequoiaDB虚机镜像正式上线
    跨越数据库发展鸿沟,谈分布式数据库技术趋势
    喜讯 | 国际智慧城市大会巨杉喜获两项大奖
    巨杉数据库再夺“广州独角兽”称号
    巨杉Tech | 使用 SequoiaDB 分布式数据库搭建JIRA流程管理系统
  • 原文地址:https://www.cnblogs.com/KobeZhang/p/6944681.html
Copyright © 2011-2022 走看看