21.12.2005, 11:22 | #1 |
Участник
|
Позиционирование на конкретную запись датасета
Требуется после обновления формы спозиционировать курсор на конкретную запись датасета. Использую следующий код
PHP код:
Метод findRecord дает нужный результат, но в отличии от перехода к основной таблице работает намного медленнее чем переход к основной таблице. Подскажите, пожалуйста, как решить данную проблему |
|
21.12.2005, 13:10 | #2 |
Moderator
|
Цитата:
Сообщение от Lucky13
... в поле Field несколько значений Value ...
...хотя при переходе к основной таблице курсор позиционируется на нужную запись по значениям не одного, а двух полей ...
__________________
Андрей. |
|
21.12.2005, 13:24 | #3 |
Участник
|
Пример:
Если стоять на строке заказа и перейти к таблицы партий, то, если есть несколько записей с одинаковым номером партии и разными ItemId, произойдет переход на нужную партию (эта строка будет вверху) и курсор будет стоять на строке, соответствующей выбранному ItemId. В принципе логично, т.к. в InventBatch уникальный индекс по двум полям (InventBatchId и ItemId), но сделать подобное позиционирование не получается. Выше указанный способ позиционирует либо по номеру партии, либо по ItemId, а вместе не получается. |
|
21.12.2005, 13:44 | #4 |
Участник
|
Неправильно вы думаете.
Посмотрите метод run() формы InventBatch - вам станет понятно.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: belugin (2). |
21.12.2005, 14:14 | #5 |
Участник
|
Axapta хитрая.
Вот что происходит при переходе к основной таблице (принцип которого у вас используется в коде). 1. На сервере открывается курсор для такого запроса X++: select * frrom Table where Table.Field >= Value ... Value - значение поля с которого произошел переход (или точнее LookupValue() в args() формы) В буфер на клиенте выбирается некоторое количество записей (зависит от таблицы). 2. Курсор позиционируется на первой записи. При перемещении назад по датасету (нажав PgUp, Up или вызвав сооответствующий метод) на сервере открывается курсор для такого запроса X++: select * frrom Table where Table.Key1 < Value ... Строки в буфер на клиенте добавляются в обратном порядке. Дальше при перемещении вперед или назад по датасоурсу, если не получены все строки с сервера, фетчится соответствующий открытый курсор. При таком алгоритме работы Axpata'ы, если включить сортировку на табличной форме не по ключу перехода, то будет неправильно позиционироваться курсор после открытия формы В форме InventBatch фактически выполняется перемещение по датасорсу ч/з ds.Next(), пока не найден нужный ItemId (InventBatch отпозиционирован движком по приведенному алгоритму).
__________________
Axapta v.3.0 sp5 kr2 |
|
21.12.2005, 16:00 | #6 |
Участник
|
А не подскажите что это за класс InventDimJumpRefEngine_RU. Что он делает и как им пользоваться?
|
|
21.12.2005, 16:46 | #7 |
Moderator
|
Он делает именно то, что обозначено в его названии. Это семейство классов - движок для реализации перехода к основной таблице на полях складской аналитики. Как им пользоваться - можно посмотреть на приведенной выше форме InventBatch или на других формах складских аналитик.
__________________
Андрей. |
|
21.12.2005, 18:28 | #8 |
NavAx
|
Лучше им не пользоваться или доделать. Если у вас много записей в табличке (что нормально для inventBatch), то форма может открываться минутами (у нас было до 5-ти минут). Из-за этого позиционирования.
__________________
С уважением, Игорь Ласийчук. |
|
21.12.2005, 19:26 | #9 |
NavAx
|
InventDimJumpRefEngine_RU - findRecord
Код: while (cursor.RecId && cursor.RecId != prev.RecId && cursor.(this.curFilterField()) != this.callerFilter()) { prev = cursor.data(); dataSource.next(); } До этого было не лучше - использовался findRecord. Лучше уж просто фильтры ставить.
__________________
С уважением, Игорь Ласийчук. |
|
Теги |
findrecord, inventbatch, lookupfield, lookupvalue, переход к основной таблице |
|
|