Есть ли способ выполнить пользовательский поиск в поле диалога в Microsoft Dynamics 365?

#dialog #lookup #microsoft-dynamics #x #dynamics-365

#диалоговое окно #поиск #microsoft-dynamics #x #dynamics-365

Вопрос:

У меня проблемы с моим полем диалога. У меня есть кнопка, которая открывает вкладку диалога с полем. Предполагалось, что в этом поле поиска будут отображаться точные записи (я думаю, мне нужно выбрать там по одному значению поля). Прямо сейчас у меня есть этот код:

  DialogField Journal = dialog.addField(extendedTypeStr(JournalId));
 

В этой строке диалога добавляется поле со всеми значениями в этом EDT. У меня есть 3 типа журналов — НОВЫЙ, ОБНОВИТЬ, УДАЛИТЬ. Прямо сейчас при поиске в этом поле он показывает мне все 3 типа журналов. Я хочу создать пользовательский поиск, который показывает точный тип, например, если я нажму эту кнопку в журнале с типом «НОВЫЙ», тогда при поиске должен отображаться только «НОВЫЙ» тип типов журналов. Я слышал, что есть что-то вроде dialog.addLookup или что-то в этом роде. Кто-нибудь может мне помочь?

Ответ №1:

Вы уже добавили свое диалоговое поле (в dialog() методе). Теперь добавьте dialogRunPost() метод, который выполняется после инициализации графического интерфейса формы. На этом этапе вы можете получить базовую FormStringControl информацию за полем диалога. Подписка на FormStringControl.OnLookup событие позволяет переопределить поиск.

У меня не было доступных данных журнала, поэтому я создал аналогичный пример с клиентами. В моем примере dialog ( MyDialog ) принимает исходный customer ( 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() amp;amp; args.record().TableId == tableNum(CustTable))
      //if (args.caller() amp;amp; 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();
        }
    }

}
 

Результат

пример вывода