在写一个自动生成销售订单行的小程序,大部分物料的数量都是预先定义好的,可以让用户定义一个BOM,直接根据BOM生成销售订单行就可以了,有一个物料需要从几个物料中选择,于是我想在创建之前弹出一个窗口,让用户选择,又想到了Dialog这个类,唯一的问题是,如果直接用
dialog.addField(TypeId(ItemId));
添加字段,不会过滤,那么全部的物料都出来了,实际上用户只需要从有限的几个物料中选择,所以要想办法过滤掉才对,于是想到了重载Lookup的做法。步骤如下:
1.创建一个类AlxInventTableDialogHelper
添加一个类变量Dialog,用于把Dialog变量传入类AlxInventTableDialogHelper,供在重载后的Lookup方法中调用。并添加一个方法,用来封装对Dialog变量的读写。
Dialog parmDialog(Dialog _dialog = dialog)
{
;
dialog = _dialog;
return dialog;
}
添加一个方法,重载lookup方法:
Code
public void fld1_1_lookup(DialogField _a)
{
SysTableLookup tableLookup;
Query q;
QueryBuildDataSource qbds;
FormRun fr = this.parmDialog().formRun();
object callingControl =fr.controlCallingMethod();
;
tableLookup = SysTableLookup::newParameters(tableNum(InventTable),callingControl);
tableLookup.addLookupfield(fieldNum(InventTable,itemId));
tableLookup.addLookupfield(fieldNum(InventTable,ItemName));
q = new Query();
qbds = q.addDataSource(tableNum(InventTable));
qbds.addRange(fieldNum(InventTable,ItemGroupId)).value('001');
tableLookup.parmCallingControl(callingControl);
tableLookup.parmQuery(q);
tableLookup.performFormLookup();
} 2.使用上面的类创建Dialog
Code
static void main(Args _args)
{
Dialog dialog = new Dialog();
SalesTable salesTable;
AlxInventTableDialogHelper dialogHelper;
;
//Init the class AlxInventTableDialogHelper
dialogHelper = new AlxInventTableDialogHelper();
dialogHelper.parmDialog(dialog);
//Add Dialog Field
dialog.addField(TypeId(ItemId));
dialog.doInit();
//Overloap the methods of DialogField
dialog.formRun().controlMethodOverload(true);
dialog.formRun().controlMethodOverloadObject(dialogHelper);
dialog.run();
} 效果如下:
这样就只会显示 001 组的物料了。