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

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

я говорил, что МС мог бы сделать более универсальный механизм, который учитывает инфраструктуру Аксапты. И мог бы насыпать синтаксического сахара. А также привел примеры того, как это делают другие.

Цитата:
Сообщение от belugin Посмотреть сообщение
Программировать? Для расширения - просто пометить атрибутом, для того места, которое надо расширить - вызов метода. Если нужен новый тип данных для ключа, добавить атрибут для него.
Прекрасно. Только мы говорили про вызывать. Ты довел мысль только до расширения.
доведи свою мысль до вызова функцонала класса, пожалуйста.

можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные.

как ? как дать пользователю пользователю? как проверить права?
как обеспечить, чтобы это расширение работало и в пакетных заданиях.

для определенности, давай сформулирую условие на старо-программистком:
= создать класс-потомок от CustVendAutoSettlement_Cust_RU (см. скриншот)
= ovverride метод dialog*
= ovverride метод query
= новый функционал должен работать как в пакетном задании, так и при непосредственном запуске пользователем
= новый функционал должен быть доступен только некоторым пользователям (желательно, чтобы система доступа была построена на стандартных правах аксапты)

=============
говоришь, кто-то указал, что это final класс?
ничего-ничего, на проекте можно [было] убрать это слово.
давай будем считать, что этого слова там нет.
=============


Цитата:
Сообщение от belugin Посмотреть сообщение
И это правильно - у нее четкое предназначение.
И какое же на твой взгляд?
А какое предназначение было у конструкторов, которых не будет?


Цитата:
Сообщение от belugin Посмотреть сообщение
Расскажи чем оно так сильно портит жизнь партнеру?
Макс, легко.
Обещаю, я сделаю это, после того, как ты покажешь как решить типовую задачу на типовом внедрении - как предоставить пользователю возможность запуска расширенного функционала тривиального семейства из 7-8 классов "просто пометив атрибутом".
Изображения
 
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 30.05.2017 в 23:01.
Старый 31.05.2017, 10:31   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
я предлагал? покажи мне это место, пожалуйста.
- "Вызывать класс напрямую - это моветон"
- "Info.add" это вызов класса
=> просто писать info.add это моветон.
Я прошу показать бон тон.

Цитата:
можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные.

как ? как дать пользователю пользователю? как проверить права?
как обеспечить, чтобы это расширение работало и в пакетных заданиях.
Вариант 1. Унаследоваться и перекрыть необходимые методы. В случае, если проверка прав не проходит, вызывать методы предка. Case при создании заменить на SysExtension.

Вариант 2: Использовать SysIConditionalExtension

Цитата:
говоришь, кто-то указал, что это final класс?
Не говорю - это часть другой дискуссии - запирать код или нет. Это оотогональное решение.

Цитата:
И какое же на твой взгляд?
А какое предназначение было у конструкторов, которых не будет?
1) Выше ссылка на пост Вани о том как использовать конструкторы.
2) Без конструкторов легко как и практически во всех компонентный моделях (метод init - те же самые RunBase получают параметры не из конструктора)
Старый 31.05.2017, 11:15   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
- "Вызывать класс напрямую - это моветон"
- "Info.add" это вызов класса
=> просто писать info.add это моветон.
Я прошу показать бон тон.
Макс, я в прошлый раз промолчал. Но раз ты настаиваешь...

info.add - это вызов метода класса через глобальную переменную infolog.
в аксапте есть три общеизвестных глобальных предопределенных переменных - infolog, session, appl.
ты точно хочешь продолжать защищать технологию атрибутов именно на этом примере?

если хочешь продолжать, то обрати внимание, что метод info.add по идее должен был бы быть protected + нужно было бы объявлять friend классы (error, warning, info) для доступа к add. но в аксапте нет friend.
Поэтому используется соглашение, что разработчики НЕ вызывают info.add, а должны пользоваться статическими методами Global::error, Global::warning, Global::info.

Поэтому приведенный тобой пример предельно НЕ типичен для обычной работы обычных людей...

Макс, я повторю вопрос - ты точно настаиваешь на этом примере в качестве обоснования технологи атрибутов?

=====================
А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию
new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType::Display).run(args)

К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже.

Цитата:
Сообщение от belugin Посмотреть сообщение
Вариант 1. Унаследоваться и перекрыть необходимые методы. В случае, если проверка прав не проходит, вызывать методы предка. Case при создании заменить на SysExtension.

Вариант 2: Использовать SysIConditionalExtension
Макс, а можно проектик? Все участники тебе спасибо скажут. Особенно те, кто интересуется акс7, но у них еще нет возможности попробовать аксапту вживую.

Ты же сам сказал, что это "просто проставить атрибуты"


Цитата:
Сообщение от belugin Посмотреть сообщение
Не говорю - это часть другой дискуссии - запирать код или нет. Это оотогональное решение.
Согласен. Поэтому никаких ограничений на final и protected - да, их придется учитывать разработчикам на клиенте и заказчике. Но, согласен, это отдельная ветка обсуждения. Поэтому в этой ветке пропускаем.


Цитата:
Сообщение от belugin Посмотреть сообщение
1) Выше ссылка на пост Вани о том как использовать конструкторы.
2) Без конструкторов легко как и практически во всех компонентный моделях (метод init - те же самые RunBase получают параметры не из конструктора)
Мы все читать умеем. И все про конструкторы прочитали. С момента выхода статьи прошло несколько лет, поэтому время было.

Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ.

Также обрати внимание, что ты отвечаешь про конструкторы.
людям же нужно добавить функциональность, которую могут использовать пользователи.

Нет, Макс, это не одно и то же.
Нет, участники, это не придирка с словам и правописанию.

Итак, формулировка:
Цитата:
Сообщение от mazzy Посмотреть сообщение
Просто продемонстрируйте проектик с добавленной функциональностью, которую могут использовать пользователи со специальными правами,
в которой используется мощнейшая технология атрибутов и SysExtensionAppClassFactory::getClassFromSysAttribute.

Ведь это ж "просто пометить атрибутом".
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 31.05.2017 в 11:28.
Старый 31.05.2017, 15:08   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Мы все читать умеем. И все про конструкторы прочитали. С момента выхода статьи прошло несколько лет, поэтому время было.

Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов.
Приведенная ссылка
http://kashperuk.blogspot.co.uk/2017...extension.html
является статьей двухмесячной давности.

Основная описанная проблема - игнорирование аргументов с dictClass.makeObject().
SysExtension framework will instantiate a new instance of the corresponding class (dictClass.makeObject()), which ignores the constructor arguments.


Предложенное решение - передавать обьект третьим параметром.
In order to account for the constructor arguments we need to use an Instantiation strategy, which can then be passed in as the 3rd argument when calling SysExtensionAppClassFactory.

Если посмотреть на сигнатуру SysExtensionAppClassFactory::getClassFromSysAttribute
https://msdn.microsoft.com/en-us/lib...attribute.aspx
то этот третий параметр существует как
[SysExtAppClassDefaultInstantiation _defaultInstantiation])
Если проблема работы с многоуровневой иерархией решается то решается она через class SysExtAppClassDefaultInstantiation implements SysExtensionIInstantiationStrategy

И вот эта самая Instantiation Strategy как-то и призвана решить все проблемы.

X++:
public class BaseClassWithArgInConstructor
{
    //...
    public static BaseClassWithArgInConstructor construct(NoYesUnchanged _factoryType, str _argument)
    {
        NoYesUnchangedFactoryAttribute attr = new NoYesUnchangedFactoryAttribute(_factoryType);
        BaseClassWithArgInConstructor instance = SysExtensionAppClassFactory::getClassFromSysAttribute(
            classStr(BaseClassWithArgInConstructor), attr, [B]InstantiationStrategyForClassWithArg::construct(_argument)[/B]);
 
        return instance;
    }
}.
Старый 31.05.2017, 15:45   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Приведенная ссылка
http://kashperuk.blogspot.co.uk/2017...extension.html
является статьей двухмесячной давности.
Да. Приведенная по ссылке статья является статьей двухмесячной давности.
Извините.

Цитата:
Сообщение от ax_mct Посмотреть сообщение
Если проблема работы с многоуровневой иерархией решается то решается она через class SysExtAppClassDefaultInstantiation implements SysExtensionIInstantiationStrategy
Ребяты, вы опять и снова пытаетесь тыкамть меня носом в то, что это работает.
Ок. Верю.

Вы утверждаете что "просто". Ок. Можно проектик?
__________________
полезное на axForum, github, vk, coub.
Старый 31.05.2017, 16:16   #6  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
Ребяты, вы опять и снова пытаетесь тыкамть меня носом в то, что это работает.
Ок. Верю.

Вы утверждаете что "просто". Ок. Можно проектик?
Чур не я. Очень надеюсь что выше AX2012R3 не полезу.
Но если в рамках темы то бишь AX2012 то не вижу смысла заморачиваться c этим фреймворком.

Если AX7 то это лучше к Ване. У него там даже код есть.
Проект: https://1drv.ms/f/s!ApLM1du7Goflnpl_RQlhOuzEW6fL-A

Вот его продолжение про Instantiation strategy.

using an instantiation strategy in combination with the SysExtensionIAttribute attribute was not supported.
We have updated the SysExtension framework in Platform Update 5, so now you can rip the benefits of both worlds, using an instantiation strategy and implementing the SysExtensionIAttribute interface on the attribute.

Development tutorial: SysExtension framework with SysExtensionIAttribute and an Instantiation strategy
http://kashperuk.blogspot.co.uk/2017...ension_31.html

Последний раз редактировалось ax_mct; 31.05.2017 в 16:20.
За это сообщение автора поблагодарили: Logger (1).
Старый 31.05.2017, 16:22   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Очень надеюсь что выше AX2012R3 не полезу.
а... это вы теоретически...

я уже говорил, что
Цитата:
Сообщение от mazzy Посмотреть сообщение
А патентованная технология замечательная. Да-да.
Повторю - замечательная патентованная технология.
__________________
полезное на axForum, github, vk, coub.
Старый 31.05.2017, 18:57   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Поэтому используется соглашение, что разработчики НЕ вызывают info.add, а должны пользоваться статическими методами Global::error, Global::warning, Global::info.
ok, меняем пример на global::info

Цитата:
А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию
new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType:isplay).run(args)
Ты предлагаешь это для добавления каждого сообщения в инфолог?

Цитата:
К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже.
Мне кажется, что ты немного обще свормулировал - мы не говорим про ВСЕ вызовы. Мы говорим в данном случае про вызовы из UI. В каком виде там внутри будут работать маленькие классы с деталями реализации не важно с точки зрения security.

Цитата:
Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ.
Тут вообще на важно иерархия или нет. Важно каким образом определяется элемент этой иерархии - если этот способ легко положить лукап по ключу, то SysExtension справится.

Цитата:
Также обрати внимание, что ты отвечаешь про конструкторы.
людям же нужно добавить функциональность, которую могут использовать пользователи.
SysExtension это способ добавить такую функциональность.
Старый 31.05.2017, 19:33   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
способ опосредованный и не оптимальный. отвечу.
также напомню, что хотелось бы увидеть от тебя проект )

Цитата:
Сообщение от belugin Посмотреть сообщение
способ легко положить лукап по ключу
ты щас очень важный вещь сказал - надо подумать.

а что будет, если ключ не уникальный?
фреймворк создаст несколько инстансев с разными классами, но с одинаковым ключом? и как он будет работать с этими инстансами? типа параллельно? может, это в сторону асинхронной работы? бред, конечно. но вдруг? кто следит за уникальностью? и что делает с неуникальными ключами?

надо подумать. и в код посмотреть. и подумать.
на остальное отвечу позже.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 31.05.2017 в 19:36.
Старый 31.05.2017, 20:05   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
а что будет, если ключ не уникальный?
Это зависит по идее от логики того. что расширяется. Если ему нужно что-то одно, то должен быть exception так как ситуация неоднозначная.

Если несколько, то надо дальше как-то их дергать. Например если у нас какие-ниьудь протоколяторы - один в файл. другой в инфолог, третий в EventLog то можно им раздавать информацию параллельно.
Теги
sysextension framework, sysoperation framework, как правильно, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
dynamicsax-fico: Invoice search AX2012 vs. AX7 (Part 2) Blog bot DAX Blogs 0 01.04.2016 10:11
DAX2009 аналог friend классов. Как сделать? Raven Melancholic DAX: Программирование 9 07.11.2015 23:50
emeadaxsupport: Inventory closing differences between AX4.0 and AX2012 using weighted average costing method Blog bot DAX Blogs 0 27.12.2012 19:11

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

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

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