Здравствуйте. Поделюсь фичей. AX2009 RU5.
Есть лукап-форма ContactPersonLookup. Вызывается из нескольких мест, например, из заказов на продажу/покупку. Вызывается с помощью методов lookupХХХContactPerson() таблицы ContactPerson. При вызове заполняется args.lookupValue() но НЕ заполняется args.lookupField(). Поиск текущего значения ContactPersonId (случай с лукапом на полу-введнное значение пропустим) производится в методе run() формы ContactPersonLookup с помощью findRecord(), к тому же для каждой просматриваемой записи вызывается ContactPerson.postLoad(). Если список контактных лиц в лукапе большой и искомое значение где-то в конце, то получаем большую задержку от нескольких секунд до нескольких минут (!)
Воркэраунд: нужно проинициализировать args.lookupField() и избавится от findRecord().
args.lookupField() правильнее заполнять в методах ContactPerson.lookupХХХContactPerson() рядом с заполнением args.lookupValue(). Но для простоты фикса я заполняю в методе init() формы ContactPersonLookup:
X++:
void init()
{
QueryBuildRange buildParmNum;
;
if (!(custAccount || vendAccount || busRelAccount || partyId))
{
if (! element.args() ||
! element.args().caller() ||
element.args().caller().handle() != classnum(FormStringControl))
{
throw error("@SYS22539");
}
}
// VALY -->
if (element.args() && element.args().lookupValue() && !element.args().lookupField())
{
element.args().lookupField(fieldnum(ContactPerson, ContactPersonId));
}
// VALY <--
super();
...
}
Соответственно, если args.lookupValue() и args.lookupField() заполнены, то нет необходимости для вызова findRecord(). В методе run() формы ContactPersonLookup добавил проверку:
X++:
public void run()
{
...
super();
if (filterLookup)
{
contactPerson_ds.research();
contactPerson_Name.filter(callingNameControl.text());
}
else
// VALY -->
if (!element.args() || !element.args().lookupValue() || !element.args().lookupField())
// VALY <--
{
if (callingNameControl && !callingNameControl.hasChanged() && element.args().lookupValue())
{
contactPersonId = element.args().lookupValue();
element.args().lookupField(fieldnum(ContactPerson, ContactPersonId));
contactPersonCurrent = ContactPerson::find(contactPersonId);
if (contactPersonCurrent)
{
contactPerson_ds.findRecord(contactPersonCurrent);
}
}
}
}
Теперь задержки нет.