#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();
}
}
}
Результат