07.04.2011, 11:00 | #1 |
Developer
|
Фича с findRecord() в лукап-форме ContactPersonLookup
Здравствуйте. Поделюсь фичей. 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(); ... } 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); } } } } |
|
|
За это сообщение автора поблагодарили: Максимка (1). |