AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2011, 11:00   #1  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Фича с 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();

    ...
}
Соответственно, если 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);
        }
    }
}
}
Теперь задержки нет.
За это сообщение автора поблагодарили: Максимка (1).
Теги
законченный пример, ошибка, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно связать таблицы в форме? Как показать параметры партии? mazzy DAX: Программирование 10 27.10.2010 15:56
Передать параметр лукап форме? zemius DAX: Программирование 9 21.08.2009 12:28
Как убрать фильтр в лукап форме. jonny DAX: Программирование 4 20.08.2009 17:06
Как сделать хитрый лукап miklenew DAX: Программирование 11 08.10.2007 17:28
лукап-форма с доп. фильтром patron DAX: Программирование 10 30.03.2007 12:19

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:02.