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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.05.2017, 16:16   #61  
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   #62  
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   #63  
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   #64  
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:02   #65  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
например, вот такой проектик.
Хороший проектик. Тут вопрос такой. В том что ты сделал: если задать сочетание Vend и MST это правильно что он молча это понимает и не ругается? Если допустимо, чтобы он ругался на такое сочетание. То для расширения черех SysExt надо пометить атрибутом новый класс. Типа

X++:
[CustVendSettlerKey(Module::Cust, #MSTKEY)]

clas MyNewSettler ...
Для того, чтобы сделать расширяемым надо сделать атрибут

X++:
class CustVendSettlerKeyAttribute extends SysAttribute implements SysExtensionIAttribute
{
    Module module;
    str mode;

    public void new(Module _module, str  _mode = '')
    {
        module = _module;
        mode = _mode;
    }

    public str parmCacheKey()
    {
        return [
        classStr(CustVendSettlerKeyAttribute), module, mode]
        ;

 
    }


    public boolean useSingleton()
    {
        return false;
    }
Снести все фабричные методы заменив на вызов фреймворка

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

Если несколько, то надо дальше как-то их дергать. Например если у нас какие-ниьудь протоколяторы - один в файл. другой в инфолог, третий в EventLog то можно им раздавать информацию параллельно.
Старый 01.06.2017, 00:32   #67  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от mazzy Посмотреть сообщение
какая потребность есть у людей в Аксапте:
= изменить или добавить функционал, который могут использовать пользователи
== пользователи работают с функционалом через menuItem
== menuItem вызывает классы через статический метод main (menuItem также используются для вызова форм)
== права доступа к функционалу Аксапты настраивается через menuItem

Вызывать класс напрямую вообще говоря моветон в Аксапте (хоть МС делает это сплошь и рядом в стандартном функционале, сволочи)
Если вызывать напрямую, то нужно запрограммировать закат солнца вручную чтобы учесть настроенные права.
Функционал аксапты можно и должно вызывать через menuItem.

что делает МС, чтобы удовлетворить потребность людей?
никакого сахара для работы с инфраструктурой аксапты
минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов
Есть частные случаи когда МС о нас подумала (ну или так случайно вышло), вот конкретный пример.
Есть станадртный класс BankDepositSlip у которого нет наследников но он помечен
X++:
[Microsoft.Dynamics.AX.Platform.Extensibility.ExportInterfaceAttribute,
System.ComponentModel.Composition.ExportMetadataAttribute('BankCreateDepositSlip', 'BankDepositSlip'),
System.ComponentModel.Composition.ExportAttribute('Dynamics.AX.Application.BankDepositSlip')]
В main берется parm() из menuItem'а
X++:
public static void main(Args args)
    {
        BankDepositSlip instance;

        if (args && args.record())
        {
            instance = BankDepositSlip::construct(args.record(), args.parm());

            if (instance.prompt())
            {
                instance.runOperation();
            }
        }
    }

 protected static BankDepositSlip construct(LedgerJournalTrans _ledgerJournalTrans, str _variationName = 'BankDepositSlip')
    {
        BankDepositSlip instance;

        SysPluginMetadataCollection meta = new SysPluginMetadataCollection();
        meta.SetManagedValue('BankCreateDepositSlip', _variationName);
        instance = SysPluginFactory::Instance('Dynamics.AX.Application', classstr(BankDepositSlip), meta);
        
        Debug::assert(instance != null);

        instance.initInstance(_ledgerJournalTrans);

        return instance;
    }
И чтобы расширить это мне было достаточно
а) создать наследник пометив его другим атрибутом
б) создать новый menuItem с новым параметром.
Не все так плохо как хотелось бы
За это сообщение автора поблагодарили: mazzy (2), sukhanchik (4), Ace of Database (2).
Старый 01.06.2017, 08:39   #68  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
В том что ты сделал: если задать сочетание Vend и MST это правильно что он молча это понимает и не ругается?
как я уже писал - этот проектик безумен настолько, насколько безумен исходный код, поставляемый майкрософтом.

да, можно передавать строковый тег.
но обычно стратегия определяется не menuItem, а datasource: если стоим на одной записи, то делаем одно, если на другой, то делаем другое, если вызываем из другой таблицы, то третье и так далее. а в менюИтемах задаются режимы обработки.

Цитата:
Сообщение от belugin Посмотреть сообщение
Если допустимо, чтобы он ругался на такое сочетание. То для расширения черех SysExt надо пометить атрибутом новый класс.
да. это было понятно.

собственно, как и раньше, имеем:
= эта штука работает на refleaction (со всеми вытекающими последствиями)
= вместо конструктора должен быть отдельный класс-запускач (дополнительно к адаптерам, хендлерам, хандлерам, хелперам добавляется еще и strategy)
= отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее

да, в platform update 7 они таки сделали.
  • new с параметрами
  • атрибут помечается строкой с разделителем ";", а не enum
  • в строке - позиционная запись параметров
  • в строке никаких дефолтных значений
  • в строке нет экранирующих символов чтобы экранировать ; в параметрах
  • никакого синтаксического сахара
  • строка похоже тупо проверяется на равенство - никаких регулярок, никаких критериев типа *?, никаких подстановок, никаких сравнений json-xml-структур.

Но:
= никакой параллельности или асинхронности в фреймворке не предполагается
= за уникальностью ключа должен следить сам программист
= ключ - строка, с позиционными значениями (почему не аксаптовский контейнер, не xml, не json, не другой сериализуемый объект? почему не использовать имя класса в качестве ключа?)
= вся стратегия определения ключа должна находится в одном месте - попытка сделать делегирование принятия решения о ключе приводит к возвращению к иерерхии конструкторов, только в отдельном классе.

Другими словами, все равно есть длинный список параметров с заданными позициями. но у них нет дефолтных значений. Та-дам!

А весь конструктор должен быть в одном методе. Со всеми пересечениями кода. Та-дам!

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

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

насколько эта байда проще-легче, чем просто код конструкторов?

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


Цитата:
Сообщение от belugin Посмотреть сообщение
Снести все фабричные методы заменив на вызов фреймворка
вот-вот! именно!

Цитата:
Сообщение от belugin Посмотреть сообщение
Можно завтра в обед попробовать вместе это сделать
можно. спасибо. только у нас щас должен быть engineering complete.
боюсь, что на этой неделе я только урывками во время компиляции.

но тема - интересная.
в идеале нужен проект на семействе классов с иерархией.

Цитата:
Сообщение от skuull Посмотреть сообщение
вот конкретный пример.
спасибо.

Цитата:
Сообщение от skuull Посмотреть сообщение
И чтобы расширить это мне было достаточно
а) создать наследник пометив его другим атрибутом
б) создать новый menuItem с новым параметром.
Не все так плохо как хотелось бы
нет, конечно ))))))

подумайте еще.
для дальнейшего предметного обсуждения:
1. выберите пример с иерархическим семейством, а не плоским.
2. подумайте что будет, если в эту иерархию добавляет новые классы не один программист, а хотя бы два независимых программиста.
3. подумайте как предоставить эту расширенную функциональность пользователями.

и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно)
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 01.06.2017 в 09:01.
Старый 01.06.2017, 09:17   #69  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
на посошок в нескольких словах:

очередной абсолютно не подсахаренный уровень косвенности,
который [может быть] облегчает первоначальную разработку (ответсвенный: мс)
но сильно затрудняет изучение/добавление/изменение в дальнешем (ответственный: партнеры-заказчики)

собственно о различии в приоритетах.
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2017, 09:48   #70  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
...
= отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее
...
и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно)
...
Кстати, а почему бы не починить сбор перекрестных ссылок чтобы он нормально обрабатывал работу с атрибутами. по идее теперь есть связь между классами и атрибутами и система перекрестных ссылок при анализе может ее отловить и в удобном виде программисту показать.
Старый 01.06.2017, 10:14   #71  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
а почему бы не починить сбор перекрестных ссылок...
можно. можно много было чего сделать.
если всего-лишь начать думать о том, как "это" будут использовать люди.

ответ получен:
Цитата:
Сообщение от belugin Посмотреть сообщение
Дык фреймворк добавить проще чем менять компилятор. Я просто не вижу чтобы тут был какая-то большая проблема
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2017, 10:36   #72  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Да, спасибо. Думаю, что остальным тоже будет интересно:
Цитата:
Сообщение от mazzy Посмотреть сообщение
почему не использовать имя класса в качестве ключа?
Ответ глубоко в недрах фреймворка:
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 220
Размер:	25.0 Кб
ID:	11457

Да, похоже изначально в качестве ключа предполагалось просто имя класса.
Да, поддерживаются N-элементов. Пока реализовано для случая N=1.
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2017, 10:41   #73  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
да, можно передавать строковый тег.
но обычно стратегия определяется не menuItem, а datasource:
Ты сам выбрал этот пример. Можно и datasource - какая разница какого типа ключ - можно сделать и имя таблицы и ID.

Цитата:
собственно, как и раньше, имеем:
= эта штука работает на refleaction (со всеми вытекающими последствиями)
= вместо конструктора должен быть отдельный класс-запускач (дополнительно к адаптерам, хендлерам, хандлерам, хелперам добавляется еще и strategy)
Не нужно. Класс запускач и так у тебя был мы перерабатываем только создание.
Stragegy не обязательно. У тебя нет параметров в конструкторе (не путать с методом construct). Если параметры есть, достаточно добавить метод init(параметры).

Цитата:
= отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее
Да, сложнее. Как и сложнее при наследовании вообще и при любой косвенности. Но если знать про такой паттерн достаточно смотреть перекрестные ссылки по атрибуту или иерархию классов.

Цитата:
Но:
= никакой параллельности или асинхронности в фреймворке не предполагается
Зачем она там?

Цитата:
= за уникальностью ключа должен следить сам программист
Так же как и в case - в 7 добавили проверку, но не для intrinsic finctions.

Цитата:
= ключ - строка, с позиционными значениями (почему не аксаптовский контейнер, не xml, не json, не другой сериализуемый объект? почему не использовать имя класса в качестве ключа?)
Имя класса, это строка вообще ты про SysPlugin а я про SysExtension. В последнем ключ это фактически что угодно что можно запихать в контейнер.

Цитата:
= вся стратегия определения ключа должна находится в одном месте - попытка сделать делегирование принятия решения о ключе приводит к возвращению к иерерхии конструкторов, только в отдельном классе.
Для других паттернов - тругие решения, которые тут приводили - например экстеншены для конструкторов.

Цитата:
Другими словами, все равно есть длинный список параметров с заданными позициями. но у них нет дефолтных значений. Та-дам!
Это не параметры это ключ.

Цитата:
А весь конструктор должен быть в одном методе. Со всеми пересечениями кода. Та-дам!
Нет конструктор находится в каждом классе (не путать с методом construct). Что такое пересечения кода, я не знаю.

Цитата:
самое интересное, что эта штука не решает проблему подключения кода от разных производителей.
особенно, если разные производители добавлят классы с разными строками-ключами в середину иерархии. или добавят одинаковые ключи для разных классов.
Это решается так же как и любое пересечение имен в Ax - префиксами.

Цитата:
вопрос - какой? как? какова методика добавления класса в иерархию с атрибутами?
Я ж тебе пример привел.

Цитата:
подумайте еще.
для дальнейшего предметного обсуждения:
1. выберите пример с иерархическим семейством, а не плоским.
2. подумайте что будет, если в эту иерархию добавляет новые классы не один программист, а хотя бы два независимых программиста.
3. подумайте как предоставить эту расширенную функциональность пользователями.
4. Подумайте какие из перечисленных проблем новые для норвого механизма, а какие были и с кейзом.

Цитата:
и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно)
Перекрестные ссылки не отвалились, надо просто смотреть другие ссылики
Старый 01.06.2017, 10:52   #74  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Да, спасибо. Думаю, что остальным тоже будет интересно:


Ответ глубоко в недрах фреймворка:


Да, похоже изначально в качестве ключа предполагалось просто имя класса.
Да, поддерживаются N-элементов. Пока реализовано для случая N=1.

_baseCLassName это имя базового класса или интерфейса


X++:
 /// <summary>
    /// Searches for extensions for elements.
    /// </summary>
    /// <returns>
    /// The search result that contains elements that match the search attribute instance[.
    /// </returns>
    public SysExtensionCacheValue search()
То есть это не ключ а найденные классы
Старый 01.06.2017, 11:09   #75  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Ты сам выбрал этот пример.
да. disclimer написан для тех, у кого уже есть подобные технологии. я извиняюсь за безумную реализацию. я просто расширил то, что есть в МС-коде. извините за этот бред.

да, примером можно продолжать пользоваться.

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

Цитата:
Сообщение от belugin Посмотреть сообщение
Можно и datasource - какая разница какого типа ключ - можно сделать и имя таблицы и ID.
именно!
ключевое слово "сделать".
если нужно "сделать", то зачем нужен какой-то левый ключ?
давайте будем "сделать" сразу имя класса? и атрибутов писать не нужно.

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

класс запускач нужен только для запуска класса из Visual Studio.
MenuItem можно сделать стартовым объектом в VS. Но в этом месте бага - параметры menuItem при старте из VS не учитываются. Сотрудники МС не используют этот сценарий ))))

Цитата:
Сообщение от belugin Посмотреть сообщение
мы перерабатываем только создание.
Да.

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

В фреймворке один стратегия должна знать обо всех классах иерархии.

Цитата:
Сообщение от belugin Посмотреть сообщение
У тебя нет параметров в конструкторе (не путать с методом construct). Если параметры есть, достаточно добавить метод init(параметры).
ты снова прав для случая без параметров.
но как часто используется именно этот сценарий?

Цитата:
Сообщение от belugin Посмотреть сообщение
Да, сложнее. Как и сложнее при наследовании вообще и при любой косвенности. Но если знать про такой паттерн достаточно смотреть перекрестные ссылки по атрибуту или иерархию классов.
Макс, му-ха-ха (2 раза)
Сейчас в аск7 82 класса-потомка от SysExtensionIAttribute
выбери любой из них, который реализует несколько уровней иерархии.
Покажи как это просто.

Ты говоришь "просто добавить атрибуты".
Ты говоришь "просто смотреть"
Сделай проектик. Покажи как это просто.

вот на конструкторах по старому я сделал минут за 15 со скриншотами и написанием поста. Раз это так просто, наверняка займет меньше времени.


Цитата:
Сообщение от belugin Посмотреть сообщение
Зачем она там?
И в самом деле! Чего это я? Видать Котлинов всяких наелся...

Цитата:
Сообщение от belugin Посмотреть сообщение
Имя класса, это строка вообще ты про SysPlugin а я про SysExtension. В последнем ключ это фактически что угодно что можно запихать в контейнер.
Я смотрю актуальную аксапту. 7.2.1785.0
Да-да. Я вижу это "что угодно". Строка с ; Это пипец и детский сад какой-то.

Цитата:
Сообщение от belugin Посмотреть сообщение
Для других паттернов - тругие решения, которые тут приводили - например экстеншены для конструкторов.
Угу-угу. Именно! Другие.

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

Цитата:
Сообщение от belugin Посмотреть сообщение
Нет конструктор находится в каждом классе (не путать с методом construct). Что такое пересечения кода, я не знаю.
Именно.

Цитата:
Сообщение от belugin Посмотреть сообщение
Это решается так же как и любое пересечение имен в Ax - префиксами.
Кем и как? Бгггг!!

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


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


Цитата:
Сообщение от belugin Посмотреть сообщение
Перекрестные ссылки не отвалились, надо просто смотреть другие ссылики
Именно.


Ребяты, такое ощущение, что вы продолжаете доказывать что фреймворк работает в принципе. Да все читающие эту ветку верят что работает. Если вспомнить, исходный вопрос ветки был: "Какая цель создания экземпляров классов через расширенные атрибуты? Чем не устраивает старый дедовский способ construct?"

Ребяты, прошу вас, не надо примеров "я создал пример из трех классов, я добавил атрибуты". такие примеры ничего не показывают.

Давайте рассматривать нормальный промышленный случай:
= есть семейство классов с несколькими уровнями иерархии
= есть несколько программистов
= которые добавляют/изменяют функционал этого семейства (одновременно или последовательно). в пределе это программисты разных партнеров, которые делают разные типовые решения. а некий программист заказчика ставит эти пересекающиеся типовые решения [из разных моделей]. (в целях упрощения, для данной ветки можно предположить, что модель одна, чтобы рассмотреть только механизм инстанцирования класса)
= как облегчить работу этих людей?

вы говорите ключи-атрибуты.
Ок, пусть.

Как должны выглядеть эти ключи, чтобы разные люди могли добавлять классы-потомки и не мешать друг-другу?
Как должны выглядеть эти ключи, чтобы в принципе была возможность рефакторинга? (да, я знаю что МС не рефакторит, но у партнеров и у заказчика то могут работать нормальные люди)
Зачем вообще нужны специальные ключи вместо имен классов?
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 01.06.2017 в 11:14.
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 01.06.2017, 11:12   #76  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
_baseCLassName это имя базового класса или интерфейса
Именно!
Внутри оно работает с именами классов. Ключ ТУПО преобразуется к именам. В текущей реализации Platform 7 ключ не имеет никакой семантики. Скрипач (отдельный ключ) не обязателен.

Цитата:
Сообщение от belugin Посмотреть сообщение
То есть это не ключ а найденные классы
да-да. именно во множественном числе.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 01.06.2017 в 11:20.
Старый 01.06.2017, 12:15   #77  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
...
Зачем вообще нужны специальные ключи вместо имен классов?
Каждый берет по вопросу. Чур это мой И я только мессенджер.

1. Ключ как внешнее имя
2. Можно менять в рантайме
3. Можно по условиям

By decoupling the base class from derived classes using instances of such attributes, a developer does not modify computer program code defining the base class when adding customized extensions to that base class.

The attributes can be specified at run time to specify or to alter the run time behavior of the application.
This framework also allows the application to conditionally instantiate an element based on its attributes.

Object extensions using attributes to decouple base classes from derived classes
http://patents.justia.com/patent/9026989
Старый 01.06.2017, 12:20   #78  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ax_mct Посмотреть сообщение
2. Можно менять в рантайме
именно!
и статическая компиляция со статическим анализом превращается...

вот именно!
__________________
полезное на axForum, github, vk, coub.
Старый 01.06.2017, 13:18   #79  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Именно!
Внутри оно работает с именами классов. Ключ ТУПО преобразуется к именам. В текущей реализации Platform 7 ключ не имеет никакой семантики. Скрипач (отдельный ключ) не обязателен.
_baseClass это имя базового класса а не ключа. Ключ, должен идентифицировать потомка этого базового класса.

Цитата:
да-да. именно во множественном числе.
Угу потому что выбранный тобой метод нужен в случае если требуется ровно один класс. Соответственно он требует у стратегии найти классы и если их больне одного то ругается. Если надо несколько, то getClassInstanceListFromSysAttribute
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 01.06.2017, 13:42   #80  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
_baseClass это имя базового класса а не ключа. Ключ, должен идентифицировать потомка этого базового класса.
Угу-угу.
и это не отменяет "Ключ ТУПО преобразуется к именам. В текущей реализации Platform 7 ключ не имеет никакой семантики."

Цитата:
Сообщение от belugin Посмотреть сообщение
Угу потому что выбранный тобой метод нужен в случае если требуется ровно один класс. Соответственно он требует у стратегии найти классы и если их больне одного то ругается. Если надо несколько, то getClassInstanceListFromSysAttribute
Макс, ты снова рассказываешь что это работает. Спасибо тебе за это.
Я же снова и снова возвращаюсь к трудоемкости и к исходному вопросу "Какая цель создания экземпляров классов через расширенные атрибуты? Чем не устраивает старый дедовский способ construct?"

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

Мы уже поняли, что МС хочет сделать свои классы read only.
И хочет вынести фазу инстанцирования куда-то в сторонку.
Ок, должен возникнуть класс-запускач. Но ведь можно было не ломать систему конструкторов, а реализовать их в отдельном семействе классов. Также есть масса других способов.
Ок, должен возникнуть контроль созданных, но не прошедших инициализацию объектов.

Я говорил о том, что за уникальностью атрибутов фреймворк не следит - ответственность лежит на программисте (причем не на МС-программисте).
Я говорил о том, что в фреймворке далеко не везде идет работа с неуникальными атрибутами и классами - гораздо чаще фреймворк будет выкидывать исключение в runtime. И это тоже проблема программиста (причем не МС-программиста).

Вообще фреймворк очень многое переводит в рантайм, делая аксапты очередной php-фреймворк. Может быть, некоторые будут очень рады. Но эти некоторые тут же потребуют и другие инструменты, обязательно присущие рантаймовым фреймворкам. Без обязательных инструментов этот фреймворк полная фигня, которая не стоит денег, которые за него просят.

Я хочу донести мысль, что задачу "сделать классы read only" можно было решать разными способами. Но МС выбрал способ, который минимизирует трудозатраты только тех, кто создает новую функциональность. Полностью проигнорировав интересы остальных... Лично я очень хотел бы, чтобы учитывались интересы всех заинтересованных сторон.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 01.06.2017 в 14:43.
Теги
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, время: 09:00.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.