有没有办法对 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();
        }
    }

}

结果

example output

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...