如何解决有没有办法对 Microsoft Dynamics 365 上的对话框字段进行自定义查找?
我的对话框字段有问题。我有按钮可以打开带有字段的对话框选项卡。它应该在该字段查找精确记录上显示(我想我需要通过一个字段值在那里选择)。现在我有这个代码:
DialogField Journal = dialog.addField(extendedTypestr(JournalId));
此对话行添加一个字段,其中包含该 EDT 上的所有值。我有 3 种期刊类型 - NEW、UPDATE、DELETE。现在在该字段查找中,它向我显示了所有 3 种期刊类型。我想进行显示确切类型的自定义查找,例如 - 如果我在类型为“NEW”的期刊上单击该按钮,那么它应该在查找时仅显示“NEW”类型的期刊类型。我听说有类似 dialog.addLookup 之类的东西。有人可以帮我吗?
解决方法
您已经添加了对话框字段(在 dialog()
方法中)。现在添加 dialogRunPost()
方法,该方法在表单 GUI 初始化之后 执行。此时,您可以获取对话框字段后面的底层 FormStringControl
。订阅 FormStringControl.OnLookup
事件允许您覆盖查找。
我没有一些可用的期刊数据,因此我为客户创建了一个类似的示例。我的示例对话框 (MyDialog
) 采用源客户 (customerCaller
) 并显示一个带有自定义查找的对话框,该对话框仅显示具有相同客户群的客户。
我的示例也是一个独立的、可运行的类,不是从表单中调用的。已添加注释以指示这会影响代码的位置。
完整示例
public class MyDialog extends Runbase
{
// fields
protected Args args;
protected CustTable customerCaller;
protected DialogField dfCustomerId;
// construct
public static MyDialog newArgs(Args _args)
{
MyDialog ret = new MyDialog();
ret.args = _args;
return ret;
}
// initialize
public boolean init()
{
boolean ret = super();
// validate and fetch caller
if (args.record() && args.record().TableId == tableNum(CustTable))
//if (args.caller() && args.caller().dataset() == tableNum(CustTable)) --> when called from form
{
customerCaller = args.record();
//customerCaller = args.caller().record();
}
else
{
throw error(Error::missingRecord('My Dialog'));
}
return ret;
}
// build dialog
public Object dialog()
{
Dialog ret = super();
// optional reference to visualize the input
ret.addText('Caller customer group = ' + customerCaller.CustGroup);
// add field
dfCustomerId = ret.addField(extendedTypeStr(CustAccount)); // default lookup = all CustTable.AccountNum values
return ret;
}
public void dialogPostRun(DialogRunbase dialog)
{
super(dialog);
// subscribe to lookup event
FormStringControl fscCustomerId = dfCustomerId.control();
fscCustomerId .OnLookup += eventhandler(this.customerId_OnLookup);
}
// custom lookup for customer id
protected void customerId_OnLookup(FormControl _sender,FormControlEventArgs _e)
{
// cancel default
FormControlCancelableSuperEventArgs eventArgs = _e;
eventArgs.CancelSuperCall();
// define lookup query (list all customers with same customer group as input customer)
Query query = new Query();
QueryBuildDataSource qbds = SysQuery::findOrCreateDataSource(query,tableNum(CustTable));
SysQuery::findOrCreateRange(qbds,fieldNum(CustTable,CustGroup)).value(SysQuery::value(customerCaller.CustGroup));
// do lookup
SysTableLookup lookup = SysTableLookup::newParameters(tableNum(CustTable),_sender);
lookup.parmQuery(query);
lookup.addLookupfield(fieldNum(CustTable,AccountNum),true);
lookup.addLookupfield(fieldNum(CustTable,CustGroup));
lookup.performFormLookup();
}
// run dialog
public static void main(Args _args)
{
// I am running this dialog directly (not from a form),generating some random input
CustTable customer;
select firstonly customer where customer.CustGroup != '';
_args.record(customer);
// end of random input
MyDialog md = MyDialog::newArgs(_args);
md.init();
if (md.prompt())
{
md.run();
}
}
}
结果
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。