默认的情况下,AX的Lookup窗体只能返回一个值,赋值给调用Lookup的控件,那么如何返回多个值那?这种情况还是蛮常见的,比如从客户表中选择数据,Lookup窗体中可以显示多个值,比如客户编码,客户名称,客户地址等,如果每次只返回一个值赋值给客户编码,显然不太好,因为用户可能还要同时看到客户名称和客户地址的值。
正如那位网友提到的,这个问题要分成两种类型来解决:
1.通过调用SysLookupTable类构造的Lookup窗体
2.通过直接调用Lookup Form(比如CustTableLookup),构造的Lookup窗体。
这两种方式返回多个值的方法是相同的(当然这是俺能想到的方法,可能还会有更多好方法),需要重载FormRun对象的closeSelect方法,在该方法中调用原窗体中特定的方法,给待赋值的控件赋值,类似于如下代码:
public void closeSelect(str _selectString)
{
if(formhasMethod(callerForm,identifierstr(SetOtherValues)))
callerForm.SetOtherValues(element.dataSource(1).cursor());
super(_selectString);
}
其中的SetOtherValues为在调用Lookup窗体的Form上定义的方法,类似于如下代码:{
if(formhasMethod(callerForm,identifierstr(SetOtherValues)))
callerForm.SetOtherValues(element.dataSource(1).cursor());
super(_selectString);
}
void SetOtherValues(Common table)
{
CustTable lookupCustTable;
;
lookupCustTable = table;
if(table.TableId == tableNum(custTable))
{
custName.text(lookupCustTable.Name);
address.text(lookupCustTable.Address);
}
}
这个对于第二种类型的Lookup 窗体来说是很容易实现的,因为在AOT上有现成的Form,只要重载一下它的closeSelect方法就可以了。{
CustTable lookupCustTable;
;
lookupCustTable = table;
if(table.TableId == tableNum(custTable))
{
custName.text(lookupCustTable.Name);
address.text(lookupCustTable.Address);
}
}
对于第一种类型的Lookup窗体,问题可能会有些绕。因为第一种情况下,Lookup窗体是通过代码创建的,而X++没有事件机制,就没办法将原窗体的方法绑定到Lookup窗体的关闭事件上,不过可以变通实现,首先创建一个名为SysLookupTable的窗体,重载该窗体的closeSelect方法,在这个方法中写入上述代码,然后继承类SysLookupTable,重载其newParameter,Contructor和formRun方法,在formRun方法中new form时,将SysLookupTable做为参数传入,这样实际被实例化的是SysLookupTable这个窗体,这样当Lookup窗体关闭时就会自动调用SysLookupTable窗体中被重载的closeSelect方法,从而调用原窗体的方法,虽然绕的弯不小,不过总算可以实现,其实Runbase中的Dialog不也是这样玩的吗?
这里是根据上面的描述做的一个示例,用户在客户编码处选择后会直接将客户名称和客户地址赋值到对应的控件上。
感谢MBSCN网友jtlyr!