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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.03.2007, 13:55   #161  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Может кто-нибудь проверить на медленной машине, тормозит ли
Я по-прежнему не понимаю зачем тебе extendedBy.
Поскольку вики-движок неадекватно относится к конструкции ++, привожу кусок кода здесь

X++:
static void Test_PluginLoad(Args _args)
{
    Object      element;
    TabaxPlugin plugin;
    int         i;

    DictClass   tabaxPluginClass = new DictClass(classnum(TabaxPlugin));

    for( i=0; i<tabaxPluginClass.implementsCnt(); ++i )
    {
        plugin = new SysDictClass(tabaxPluginClass.implements(i)).makeObject();
        plugin.tabax(element);
    }

}
PS Обрати внимание, что реализация через интерфейс дает проверку на этапе компиляции (вместо runtime) и при такой реализации работает intellisence.
__________________
полезное на axForum, github, vk, coub.
Старый 22.03.2007, 14:08   #162  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
tabaxPluginClass.implementsCnt
Это интерфейсы, реализуемые классом
Старый 22.03.2007, 14:11   #163  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Это интерфейсы, реализуемые классом
вах. виноват.
__________________
полезное на axForum, github, vk, coub.
Старый 22.03.2007, 14:14   #164  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Это интерфейсы, реализуемые классом
тогда могу предложить глянуть на SysDictClass::getImplements()
но он также сводится к перебору всех классов
__________________
полезное на axForum, github, vk, coub.
Старый 26.03.2007, 12:29   #165  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Post 0.3. beta 3
скачать

Новое (по сравнению с 0.2.x):
  • Работает в Ax4 (картинки лежат в подпапке tabax.ax4 их надо переписать в "C:\Program Files\Microsoft Dynamics AX\40\Client\Share\Include\tabax")
  • Можно переводить интерфейс (уже переведен на русский и испанский (by Manel Querol (Mkz) from http://www.TrucosAx.com))
  • управление окнами
  • настройка ширины табов (максимальное значение, минимальное и "все табы одного размера")
  • Зачатки Plugin SDK (отдельный XPOшник)
  • Иван Кашперук доработал функциональность открытия поля, теперь оно открывает и поле таблицы
  • Авторазмер: табакс не дает себя уменьшить или увеличить

Предлагаю всем подумать на тему "что надо от табакса плагинам"...

Последний раз редактировалось belugin; 26.03.2007 в 12:32.
За это сообщение автора поблагодарили: PavelX (1).
Старый 25.04.2007, 17:41   #166  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если вы поставите Tabax 0.3b8 и плагин AxPath, сможете открыть Tabax в AOT прям по ссылке из форума

Спасибо AndyD, Ивану и еще одному человеку, пожелавнему остаться неизвестным

Последний раз редактировалось belugin; 25.04.2007 в 17:42. Причина: +credits
Старый 26.04.2007, 18:16   #167  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
Ускорение позиционирования по 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();
}
Вариант 2
или 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   #168  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от DocSerzh Посмотреть сообщение
С радостью приму критику, отмету заблуждения.
Прежде всего, спасибо за то, что не остались просто " еще одному человеку, пожелавнему остаться неизвестным" Страна должна знать своих героев

Теперь по делу:
А почему во втором способе восстанавливается только lookupField, а lookupValue остается с RecId?

Думаю, на данном этапе первый вариант в самый раз.
Но, как шаг для дальнейшего улучшения, второй вариант очень даже ничего.
Почему бы Вам не поэкспериментировать какое-то время с первым вариантом, добавив вывод какого-то сообщения в случае, если наткнулись на форму, на которой указан lookupField?
Мне кажется, особенно учитывая, что форма вызывается новая, и args формируется здесь же, что по ветке с findRecord идти никогда не будет
Возможно и не прав, не проверял.
Насколько я понял, Максим говорит о другом опасении. О том, что существуют формы, у которых логика завязана на использование значений lookupValue. Но, ИМХО, это в основном лукап-формы. В остальных (переход к основной таблице, к примеру) формах врядли значение этого поля анализируется. Завтра поищу по АОТ, чтобы утверждать наверняка.

Последний раз редактировалось kashperuk; 27.04.2007 в 01:43.
Старый 27.04.2007, 08:33   #169  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А почему вы считаете, что по lookupField( ) по RecId будет искать правильно?

В случае с SalesTable будет работать корректно, потому что большему salesId будет соответствовать больший recId (пока не перевалили на отрицательные recId!).
А, к примеру, InventTable. Там сортировка идет по itemId, и далеко не всегда большему itemId соответствует больший recId. И таких примеров по AOT можно привести массу.

PS Хотя и с SalesTable не факт. Так как номер заказа формируется при создании новой записи , а recId присваивается при сохранении в базу данных, то вполне может оказаться, что кто-то начал создавать заказ позже, а сохранил раньше.
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 27.04.2007 в 09:05.
Старый 27.04.2007, 09:34   #170  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от AndyD Посмотреть сообщение
А почему вы считаете, что по lookupField( ) по RecId будет искать правильно?
Можно усложнить - найти индекс по которому отсортирован дс, проверить уникальный ли он, проверить состоит ли он из 1 поля и только в ежэтом случае лукапить. Иначе скатываться к тормозному варианту
Старый 27.04.2007, 09:43   #171  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Тогда надо формировать строку axpath опираясь не на recId, а на поля уникального индекса (если он есть, опять же).
А в случае recId корректнее все-таки поиск перебором.
__________________
Axapta v.3.0 sp5 kr2
Старый 27.04.2007, 09:51   #172  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Lightbulb
Цитата:
Тогда надо формировать строку axpath опираясь не на recId, а на поля уникального индекса (если он есть, опять же).
А в случае recId корректнее все-таки поиск перебором.
Я имел ввиду следующее: если индекс по которому отсортирован дс уникален и состоит из 1 поля, то:
  • выбрать запись по RecID селектом
  • лукапнуть ее в дс по индексу
Старый 27.04.2007, 10:09   #173  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
записал в туду пожелания и ошибки
Старый 27.04.2007, 10:23   #174  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Прежде всего, спасибо за то, что не остались просто " еще одному человеку, пожелавнему остаться неизвестным" Страна должна знать своих героев
.
Как то неудачно засветился с комментариями...хм
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Теперь по делу:
А почему во втором способе восстанавливается только lookupField, а lookupValue остается с RecId?
.
После executeQuery lookupValue сбрасывается (или после super() в нем, перекрытом).

Цитата:
Сообщение от kashperuk Посмотреть сообщение
Мне кажется, особенно учитывая, что форма вызывается новая, и args формируется здесь же, что по ветке с findRecord идти никогда не будет
.
Честно говоря, я тоже так думаю - просто не могу представить себе обработчик формы (логику обработчика), который при запуске использует позиционирование по lookup методам. Единственный - это механизм JumpRef - но в данном коде мы ему не мешаем..

Цитата:
Сообщение от kashperuk Посмотреть сообщение
Завтра поищу по АОТ, чтобы утверждать наверняка.
.
Проверил у себя [ сильно перелопаченный retail от коруса] :
В основном Lookup используются в init'e для анализа включать фильтры , накладываемые на форме, или нет...
Единственна критическая форма - Addresses , с ипользованием linkActivate в случае открытия из vendTable...
К сожалению, нет сейчас appl под рукой - по памяти....

Цитата:
Сообщение от AndyD Посмотреть сообщение
А почему вы считаете, что по lookupField( ) по RecId будет искать правильно?
В случае с SalesTable будет работать корректно, потому что большему salesId будет соответствовать больший recId (пока не перевалили на отрицательные recId!).
А, к примеру, InventTable. Там сортировка идет по itemId, и далеко не всегда большему itemId соответствует больший recId. И таких примеров по AOT можно привести массу
.
Насколько я понимаю, позиционирование идет самим движком, уже в выбранном и отсортированном ds [?]..Не вижу причин [но проверю обязательно - есть такая большая DB с отрицательными recId] почему бы ему (движку) искать не корректно... или имелось ввиду время позиционирования?

Цитата:
Сообщение от kashperuk Посмотреть сообщение
Можно усложнить - найти индекс по которому отсортирован дс, проверить уникальный ли он, проверить состоит ли он из 1 поля и только в ежэтом случае лукапить. Иначе скатываться к тормозному варианту
.
Эксперементировал на эту тему до знакомства с tabax...Положительных результатов не получил - как то странно работают объекты AOT, отвечающие за анализ PrimaryKey и уникальность индекса.. ( нет appl под рукой - иначе бы запостил результаты и код job'a, который меня смутил)... Поэтому и остановился на варианте ,используемом в tabax.
Цитата:
Сообщение от AndyD
Тогда надо формировать строку axpath опираясь не на recId, а на поля уникального индекса (если он есть, опять же).
А в случае recId корректнее все-таки поиск перебором.
.
В случае НЕуникальности RecId?
Старый 27.04.2007, 10:39   #175  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Есть вот такие штуки:

SysDictTable/getIndexIdsOfUniqueOneFieldIndexes

Global/record2DynaKey
Старый 27.04.2007, 10:44   #176  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Гы. Работает. Обе ссылочки открыли код нормально.
Правда вторая повтыкала еще секунд 5 или чуть больше перед активацией окна. Не сразу таймер короче сработал.
Старый 27.04.2007, 10:51   #177  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
:)
Цитата:
Сообщение от belugin Посмотреть сообщение
Интересно, не знал.Спасибо. Действительно, много времени потратил впустую...
Старый 27.04.2007, 10:58   #178  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DocSerzh Посмотреть сообщение
Насколько я понимаю, позиционирование идет самим движком, уже в выбранном и отсортированном ds [?]..Не вижу причин [но проверю обязательно - есть такая большая DB с отрицательными recId] почему бы ему (движку) искать не корректно... или имелось ввиду время позиционирования?
Нет. Не верно.
При лукапе на сервер отправляется запрос вида
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   #179  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
Цитата:
Сообщение от AndyD Посмотреть сообщение
Нет. Не верно.
При лукапе на сервер отправляется запрос вида
X++:
select *
from TableName
where recid >= recIdValue
order by [- ,     ]
После этого курсор на форме позиционируется на первую полученную запись.
Если порядок сортировки по полям не будет совпадать с порядком сортировки по recId, то запись отпозиционируется неверно
Спасибо за проверку, нет возможности сечас проверить самому...
Старый 27.04.2007, 12:35   #180  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
При лукапе на сервер отправляется запрос вида
X++:
select * from TableName where recid >= recIdValue
order by [- ,     ]
После этого курсор на форме позиционируется на первую полученную запись.Если порядок сортировки по полям не будет совпадать с порядком сортировки по recId, то запись отпозиционируется неверно
Кстати, да. Я «по просьбам трудящихся» переделал сортировку в формах закупок и заказов - сделал сортировку по ожидаемой дате поставки, в результате jumpRef из журнала накладных стал попадать не туда
Теги
tabax, taskbar, toolbar, инструменты, панель задач, панель инструментов, полезное, табакс, тулбар, управление окнами

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
[ANN] Sidax 0.3.6 - многоцелевая боковая панель для Axapta belugin DAX: База знаний и проекты 104 30.06.2008 11:32
axaptafreak: Tabax: tabbed Axapta interface !!!! Blog bot DAX Blogs 0 10.11.2006 01:14
Панель задач в Аксапте wb DAX: Программирование 14 18.04.2006 17:13
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:17.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.