|
25.04.2007, 17:41 | #1 |
Участник
|
Если вы поставите Tabax 0.3b8 и плагин AxPath, сможете открыть Tabax в AOT прям по ссылке из форума
Спасибо AndyD, Ивану и еще одному человеку, пожелавнему остаться неизвестным Последний раз редактировалось belugin; 25.04.2007 в 17:42. Причина: +credits |
|
26.04.2007, 18:16 | #2 |
Участник
|
Ускорение позиционирования по AxPath.
С разрешения Максима Белугина привожу часть переписки, чтобы четче осветить предложение :
DocSerzh При позиционировании записи в "\Forms\Tabax\Methods\goMenuItemForm" очень много времени занимает formRun.dataSource().findRecord(record). Предлагается использовать formRun.args().lookupField() и formRun.args().lookupValue() для позиционирования. belugin У меня сомнения по поводу formRun.args().lookupField() и formRun.args().lookupValue(). Эти поля теоретически могут быть использованы кодом формы, и поэтому в каких-то случаях их изменение может нарушить работу чего-то ... _____________________________________________________________ Провел исследование своих настроек и мозговой штурм. Приведу предлагаемый код - извините, что пояснения ниже. Вариант 1 X++: void goMenuItemForm(MenuItemType _itemType, MenuItemName _itemName, RecID _recID) { Args args=new Args(); FormRun formRun ; Common record; TableID tableID; // Dcs 04.04.2007 СБРFI-200703_02 KC FormDataSource fds ; // Dcs 04.04.2007 СБРFI-200703_02 KC ; args.menuItemType(_itemType); args.menuItemName(_itemName); formRun = new MenuFunction(_itemName, _itemType).create(args); formRun.run(); if (_recID && formRun.dataSourceCount()) { tableID = formRun.dataSource().cursor().TableId; //+ Dcs 04.04.2007 СБРFI-200703_02 KC // orig // record = SysDictTable::newTableId(tableID).makeRecord(); // select firstOnly record // where record.recID==_recID; // formRun.dataSource().findRecord(record); if( ! formRun.args().lookupField() ) { formRun.args().lookupField( fieldname2id( TableId, 'RecId') ); formRun.args().lookupValue( int2str( _recId ) ) ; fds = formRun.dataSource().cursor().dataSource(); fds.executeQuery(); } else { record = SysDictTable::newTableId(tableID).makeRecord(); select firstOnly record where record.recID==_recID; formRun.dataSource().findRecord(record); } //- Dcs 04.04.2007 СБРFI-200703_02 KC } formRun.detach(); } или c восстановлением lookupField ( в принципе, можно и целиком аргументы ) X++: void goMenuItemForm(MenuItemType _itemType, MenuItemName _itemName, RecID _recID) { Args args=new Args(); FormRun formRun ; Common record; TableID tableID; // Dcs 04.04.2007 СБРFI-200703_02 KC fieldId fldId ; FormDataSource fds ; // Dcs 04.04.2007 СБРFI-200703_02 KC ; args.menuItemType(_itemType); args.menuItemName(_itemName); formRun = new MenuFunction(_itemName, _itemType).create(args); formRun.run(); if (_recID && formRun.dataSourceCount()) { tableID = formRun.dataSource().cursor().TableId; //+ Dcs 04.04.2007 СБРFI-200703_02 KC // orig // record = SysDictTable::newTableId(tableID).makeRecord(); // select firstOnly record // where record.recID==_recID; // formRun.dataSource().findRecord(record); fldId = formRun.args().lookupField() ; formRun.args().lookupField( fieldname2id( TableId, 'RecId') ); formRun.args().lookupValue( int2str( _recId ) ) ; fds = formRun.dataSource().cursor().dataSource(); fds.executeQuery(); formRun.args().lookupField( fldId ) ; //- Dcs 04.04.2007 СБРFI-200703_02 KC } formRun.detach(); } Рассуждаем логически . После formRun.run(); все, что могло сломаться в форме - уже сломалось и без нашего вмешательства. Если args были заданы до run() и есть в коде упоминание на lookup методы и их анализ - можно восстанавливать args после позиционирования по lookupField. В предложенных вариантах : 1 - Если в обработчике menuItem были заданы args - позиционируемся по findRecord.В противном случае - по lookupField 2 - Позиционируеся по lookupField. Восстанавливаем lookupField после позиционирования (или все аргументы...) Узкое место - анализ lookupField в executeQuery... Перелопатил свою appl - не нашел таких критичесикх мест... В принципе,они отсекаются вариантом 1. Преимущества Позиционирование в SalesTable из конца в начало по lookupField идет меньше секунды, по findRecord - 25 .... С радостью приму критику, отмету заблуждения. Извините, если немного сумбурно. |
|
|
За это сообщение автора поблагодарили: belugin (8). |
27.04.2007, 01:38 | #3 |
Участник
|
Прежде всего, спасибо за то, что не остались просто " еще одному человеку, пожелавнему остаться неизвестным" Страна должна знать своих героев
Теперь по делу: А почему во втором способе восстанавливается только lookupField, а lookupValue остается с RecId? Думаю, на данном этапе первый вариант в самый раз. Но, как шаг для дальнейшего улучшения, второй вариант очень даже ничего. Почему бы Вам не поэкспериментировать какое-то время с первым вариантом, добавив вывод какого-то сообщения в случае, если наткнулись на форму, на которой указан lookupField? Мне кажется, особенно учитывая, что форма вызывается новая, и args формируется здесь же, что по ветке с findRecord идти никогда не будет Возможно и не прав, не проверял. Насколько я понял, Максим говорит о другом опасении. О том, что существуют формы, у которых логика завязана на использование значений lookupValue. Но, ИМХО, это в основном лукап-формы. В остальных (переход к основной таблице, к примеру) формах врядли значение этого поля анализируется. Завтра поищу по АОТ, чтобы утверждать наверняка. Последний раз редактировалось kashperuk; 27.04.2007 в 01:43. |
|
27.04.2007, 10:23 | #4 |
Участник
|
Цитата:
Цитата:
Цитата:
Проверил у себя [ сильно перелопаченный retail от коруса] : В основном Lookup используются в init'e для анализа включать фильтры , накладываемые на форме, или нет... Единственна критическая форма - Addresses , с ипользованием linkActivate в случае открытия из vendTable... К сожалению, нет сейчас appl под рукой - по памяти.... Цитата:
Сообщение от AndyD
А почему вы считаете, что по lookupField( ) по RecId будет искать правильно?
В случае с SalesTable будет работать корректно, потому что большему salesId будет соответствовать больший recId (пока не перевалили на отрицательные recId!). А, к примеру, InventTable. Там сортировка идет по itemId, и далеко не всегда большему itemId соответствует больший recId. И таких примеров по AOT можно привести массу . Цитата:
Цитата:
Сообщение от AndyD
Тогда надо формировать строку axpath опираясь не на recId, а на поля уникального индекса (если он есть, опять же).
А в случае recId корректнее все-таки поиск перебором. . |
|
27.04.2007, 10:58 | #5 |
Участник
|
Цитата:
При лукапе на сервер отправляется запрос вида X++: select * from TableName where recid >= recIdValue order by [- , ] Если порядок сортировки по полям не будет совпадать с порядком сортировки по recId, то запись отпозиционируется неверно
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: DocSerzh (1), gl00mie (3). |
27.04.2007, 11:03 | #6 |
Участник
|
Цитата:
Сообщение от AndyD
Нет. Не верно.
При лукапе на сервер отправляется запрос вида X++: select * from TableName where recid >= recIdValue order by [- , ] Если порядок сортировки по полям не будет совпадать с порядком сортировки по recId, то запись отпозиционируется неверно |
|
27.04.2007, 12:35 | #7 |
Участник
|
Цитата:
Сообщение от AndyD
При лукапе на сервер отправляется запрос вида
X++: select * from TableName where recid >= recIdValue order by [- , ] |
|
15.05.2007, 20:14 | #8 |
Пенсионер
|
Цитата:
Сообщение от belugin
Если вы поставите Tabax 0.3b8 и плагин AxPath, сможете открыть Tabax в AOT прям по ссылке из форума
Спасибо AndyD, Ивану и еще одному человеку, пожелавнему остаться неизвестным
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
15.05.2007, 20:17 | #9 |
Участник
|
Цитата:
Тут есть небольшое ограничение Открыта должна быть Аксапта, которая установлена в конфигурационной утилите, как по-умолчанию, причем открыта должна быть через Ax32.exe, а не через конфигурацию (.axc) У тебя как раз она и открывается. Но после открытия ничего не происходит. Если же попробуешь после открытия и ввода пароля повторно кликнуть по ссылке, то уже в этой открытой Аксапте откроется. Пока так. |
|
16.05.2007, 10:18 | #10 |
Участник
|
Цитата:
Сообщение от kashperuk
Тут есть небольшое ограничение
Открыта должна быть Аксапта, которая установлена в конфигурационной утилите, как по-умолчанию, причем открыта должна быть через Ax32.exe, а не через конфигурацию (.axc) У тебя как раз она и открывается. Но после открытия ничего не происходит. Если же попробуешь после открытия и ввода пароля повторно кликнуть по ссылке, то уже в этой открытой Аксапте откроется. Видимо, моя информация сильно устарела, или я что-то неправильно понял |
|
Теги |
tabax, taskbar, toolbar, инструменты, панель задач, панель инструментов, полезное, табакс, тулбар, управление окнами |
|
|