如何在两个表单之间传递多个记录?

时间:2015-04-10 07:40:08

标签: forms axapta x++ args dynamics-ax-2012-r2

我想在两个表单之间传递多个记录。用户打开Form-A,选择多个记录,然后单击打开Form-B的按钮。 在Form-B中有两个(或更多)StringEdit控件,它们应显示所选记录的值。

我知道如何只传递一条记录,为此我在Form-B的方法中使用以下代码:

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

我应该如何更改代码,以便将另一个StringEdit控件的文本设置为用户选择的下一条记录的字段值?

2 个答案:

答案 0 :(得分:6)

为此,您可以使用args传递您需要在Form-A中准备的记录,如下所示(以SalesTable为例);

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,','));

然后在你的Form-B上,你需要覆盖init()方法来阅读你创建的args,

为了从收件人中检索传递的参数。覆盖新表单的init()方法,如图所示

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)));
    }
} 

希望它有所帮助。

取自Ax-Forum

答案 1 :(得分:3)

这通常意味着在Form-A中循环选定的记录并更改Form-B中的查询。

循环选定记录的惯用方法涉及for循环以及数据源的getFirstgetNext方法:

SalesLine sl;
FormDataSourcs ds = _salesLine.dataSource();
for (sl = ds.getFirst(true) ? ds.getFirst(true) : ds.cursor(); sl; sl = ds.getNext())
{       
    //Do your thing, add a query range
}

这里可能会使用MultiSelectionHelper类,因为它可以做到:

public void init()
{
    MultiSelectionHelper ms;
    super();       
    if (element.args() && element.args().caller() && element.args().record())
    {
        this.query().dataSourceTable(tableNum(SalesLine)).clearDynalinks();
        ms = MultiSelectionHelper::createFromCaller(element.args().caller());        
        ms.createQueryRanges(this.query().dataSourceTable(tablenum(SalesLine)), fieldstr(SalesLine, InventTransId));
    }
}