formsaxaptax++argsdynamics-ax-2012-r2

How to pass more than one record between two forms?


I want to pass more than one record between two forms. The user opens Form-A, selects multiple records and then clicks a button that opens Form-B. In Form-B there are two (or more) StringEdit controls and they should display values from the selected records.

I know how to pass only one record, to do that I use the following code in a method of Form-B:

if (element.args().parmEnumType() == enumNum(NoYes) 
 && element.args().parmEnum() == NoYes::Yes)
{
    myTable = element.args().record();
    stringEdit.text(myTable.Field);
}

How should I change my code so that I can set the text of another StringEdit control to the field value of the next record that the user selected?


Solution

  • To do this, you can use an args to pass the records, which you will need to prepare in your Form-A, as below (taking the SalesTable as example);

    int         recordsCount;
    SalesTable  salesTable;
    container   con;
    Args        args = newArgs();
    
    // gets the total records selected
    recordsCount = salesTable_ds.recordsMarked().lastIndex();
    salesTable = salesTable_ds.getFirst(1);
    while(salesTable)
    {
        // storing recid of selected record in container
        con = conIns(con,1, salesTable.RecId);
        salesTable = SampleTable_ds.getNext(); // moves to next record
    }   
    // passing container converted to string 
    args.parm(con2Str(con,','));
    

    Then on your Form-B, you will need to override the init() method to read the args you created,

    In order to retrieve passed arguments in the recipient from. Override the init() method of new form as shown

    public void init()
    {
        container   con;
        int         i;
        super();       
        // string to container
        con = str2con(element.args().parm(),'','');    
        // for sorting
        for(i = 1;i<= conLen(con) ;i++)
        {
            salesTable_ds.query().dataSourceTable(Tablenum(SalesTable)).addRange(fieldNum(SalesTable,RecId)).value(SysQuery::value(conPeek(con,i)));
        }
    } 
    

    Hope it helps.

    Taken from Ax-Forum