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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.07.2004, 18:15   #1  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
Позиционирование курсора на конкретной записи в Data Source на форме
ответ содержащийся в базе знаний жутко тормозит
(в таблице ~100 000 записей)
однако "перезод к основной таблице" работает практически мгновенно и устанавливает курсор на нужную позицию
Старый 19.07.2004, 19:11   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Насколько я знаю, findRecord() позиционирует запись по RecId. Попробуйте включить индекс по RecId в свойствах таблицы.
__________________
Андрей.
Старый 20.07.2004, 10:58   #3  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Насчет индекса поддерживаю. Переход к основной таблице правда использует другой механизм. Для его активизации в Args необходимо заполнить два параметра:
PHP код:
 element.args().lookupField(fieldnum(table,fieldId));
element.args().lookupValue(fieldValue); 
, а после нужно не забыть вызвать метод reseach() на источнике данных или выполнить executeQuery().
Старый 20.07.2004, 16:02   #4  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
Цитата:
Изначально опубликовано Dron AKA andy
Насколько я знаю, findRecord() позиционирует запись по RecId. Попробуйте включить индекс по RecId в свойствах таблицы.
PHP код:
public void removeFilter()
{
    
InventTable cursor;
    ;

    
cursor.RecId InventTable.RecId;

    
super();

    
this.query().dataSourceNo(1).sortClear();
    
this.query().dataSourceNo(1).addSortIndex(indexnum(InventTableRecIdIdx));
    
this.research();

    
this.findRecord(cursor);

всё равно проходит по всем записям
где я облажался?
Старый 20.07.2004, 16:53   #5  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Имелось ввиду физически создать индекс по RecId. В свойствах таблицы InventTable установить для св-ва CreateRecIdIndex значение Yes. Ничего сортировать не надо.
Старый 20.07.2004, 17:16   #6  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
Цитата:
Изначально опубликовано dn
Имелось ввиду физически создать индекс по RecId. В свойствах таблицы InventTable установить для св-ва CreateRecIdIndex значение Yes. Ничего сортировать не надо.
ок

св-во CreateRecIdIndex итак Yes

код:
PHP код:
public void removeFilter()
{
    
InventTable cursor;
    ;
    
cursor.RecId InventTable.RecId;

    
super();

    
this.findRecord(cursor);

пробегает по всем записям до текущей
а в таблице ~80 000 (InventTable) записей это занимает ~2 минуты
(однако "пеход к основной таблице" происходит мгновенно (по полю ItemId))
вообще необходим такой функционал:
"В справочнике номенклатуры
Необходимо реализовать возможность такого снятия фильтра по номенклатуре (результат поиска, к примеру), при котором текущая номенклатура, на которой стоит указатель, оставалась текущей и активной после снятия фильтра"
Старый 20.07.2004, 18:18   #7  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
ну, типа, хелп
HELP!!!
Старый 20.07.2004, 18:28   #8  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Попробуй так:

public void removeFilter()
{
InventTable cursor;
;
record.RecId = inventTable.RecId;
element.args().lookupField(fieldnum(InventTable,ItemId));
element.args().lookupValue(inventTable.itemId);

super();
this.research();
this.findRecord(cursor);
}
Старый 20.07.2004, 18:48   #9  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
не спасло
Старый 20.07.2004, 19:00   #10  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Если сделаете поиск по findrecord() в AOD, найдете кучу примеров его использования. Но присваиваний RecId Вы там не увидите

вот пример - короче некуда

\Forms\BMRunSimple\runStatusChanged()

PHP код:
void runStatusChanged()
{
    
BMRunTable  oldrunTable;

    
oldRunTable.data(runTable);
    
runTable_ds.research();
    
runTable_ds.findRecord(oldRunTable);

Старый 20.07.2004, 19:09   #11  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Вот работающий пример, наподобие "перехода к основной таблице" :
PHP код:
void clicked()
{
    
super();
    
element.args().lookupField(fieldNum(InventTableItemId));
    
element.args().lookupValue(InventTable.ItemId);
    
InventTable_DS.executeQuery();

__________________
Андрей.
Старый 20.07.2004, 19:10   #12  
funnut is offline
funnut
Участник
 
17 / 10 (1) +
Регистрация: 08.07.2004
Адрес: mscw
Цитата:
Изначально опубликовано Vadik
Если сделаете поиск по findrecord() в AOD, найдете кучу примеров его использования. Но присваиваний RecId Вы там не увидите

вот пример - короче некуда

\Forms\BMRunSimple\runStatusChanged()

PHP код:
void runStatusChanged()
{
    
BMRunTable  oldrunTable;

    
oldRunTable.data(runTable);
    
runTable_ds.research();
    
runTable_ds.findRecord(oldRunTable);

это тоже самое только друкими словами

проблема в findRecord (runTable_ds.findRecord(oldRunTable)
который пробегает все позиции до искомой
Старый 20.07.2004, 20:55   #13  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Есть два варианта.

Первый:
PHP код:
void clicked()
{
    
InventTrans InventTransDB InventTrans::findTransId("л00000268");
    
InventTrans InventTransDS;
    ;
    
super();

    
InventTransDS InventTrans_ds.getFirst(0false);

    while (
InventTransDS.RecId != InventTransDB.RecId &&
           
InventTransDS) {
        
InventTransDS InventTrans_ds.getNext();
    }

    if (
InventTransDS)
        
InventTrans_ds.findRecord(InventTransDB);
    else {
        
InventTrans_ds.create(true);
        
InventTrans_ds.cursor().data(InventTransDB);
        
InventTrans_ds.setCurrent();
    }

Здесь сначала происходит поиск среди записей, уже загруженных в displayCache. Если нужной записи не находится, в FormDataSource создается новая строка и заполняется данными из необходимой записи.

Плюс подхода в том, что видны записи, уже имеющиеся в displayCache, а к ним добавляется только нужная запись. Минус - если просмотреть dataSource до конца, в displayCache появится две одинаковых записи, и, соответственно, в Grid тоже будет две одинаковых записи, что вводит в заблуждение.

Второй вариант:
PHP код:
void clicked()
{
    
InventTrans InventTransDB InventTrans::findTransId("л00000268");
    ;
    
super();

    
select InventTrans where InventTrans.RecId == InventTransDB.RecId;

Плюсы подхода в отсутствии минусов предыдущего. Минусы - целиком перезаписывается displayCache. Причем в него заносится только одна запись.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 20.07.2004, 21:03   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Третий вариант (почти такой же, как предложил Dron AKA andy):
PHP код:
element.args().lookupField(fieldNum(InventTransInventTransId));
element.args().lookupValue("л00000268");
InventTrans_ds.linkActive(); 
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 21.07.2004, 10:29   #15  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Третий вариант не работает.
Можно вот так:

PHP код:
void clicked()
{
    
InventTrans     inventTransLocal;

    
super();

    
inventTransLocal InventTRans::findTransId("Ëî00629043");
    
inventTrans_ds.query().dataSourceTable(tablenum(InventTrans)).addDynalink(fieldnum(InventTransInventTransId), inventTransLocalfieldnum(InventTransInventTransId));
    
InventTrans_ds.linkActive();

__________________
С уважением, Игорь Ласийчук.
Старый 21.07.2004, 12:11   #16  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано Garic
Третий вариант не работает.
А Вы пробовали?
Вложения
Тип файла: xpo testform2.xpo (11.8 Кб, 391 просмотров)
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 21.07.2004, 12:30   #17  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
To Maxim:
А есть ли какие-то плюсы у твоего варианта с linkActive() по сравнению с моим?
__________________
Андрей.
Старый 21.07.2004, 12:37   #18  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Честно говоря, разницы не заметил
Похоже, что из одного вызвается другое.

Просто мне показалось, что для связанных форм linkActive обычно всегда вызвается ядром, а не executeQuery.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 21.07.2004, 12:48   #19  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Цитата:
Изначально опубликовано Maxim Gorbunov

А Вы пробовали?
Пробовал.
Оказывается твой вариант не работает если у датасорса StartPosition = Last, что и было в моём случае.
Оно находит запись и сразу же отматывает назад.
Фича
__________________
С уважением, Игорь Ласийчук.
Старый 21.07.2004, 12:54   #20  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
О! Dron AKA andy, вот ответ на твой вопрос. Твой вариант работает во обоих случаях.

То есть, используйте executeQuery()!
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Теги
ax3.0, курсор, позиционирование, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Change data on a data source on a Form Blog bot DAX Blogs 0 04.09.2008 15:05
Инициализация записи из курсора в форме andy239 DAX: Программирование 5 16.08.2005 15:00
Что сделать, чтобы связанные Data Source обновились? Maxim Gorbunov DAX: Программирование 4 11.04.2005 17:40
Использование View как Data Source или Нормализация Базы Знаний в Axapta rohlenko DAX: Программирование 15 17.02.2005 14:00
Позиционирование курсора на конкретной записи в DataSource на форме Anton Sk. DAX: База знаний и проекты 1 19.07.2004 17:14

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

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

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