Monday, 9 April 2012

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(<string value>);
 // 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

No comments:

Post a Comment