28.03.2011, 01:02 | #41 |
Участник
|
Цитата:
Цитата:
5. При необходимости начать заполнять новое поле в зависимости от других полей во всех местах, где идет создание записей в таблице, достаточно поменять один класс - не надо менять десятки мест в приложении, где об этом поле раньше никто не знал (опять же принцип DRY, снижение стоимости сопровождения). 6. Это, по-моему, очень важно: методы initFromXX могут давать разный результат в зависимости от последовательности их вызова! При реализации AxBC-класса вам вам волей-неволей приходится продумать единую систему приоритезации зависимостей полей. Это сложнее, но зато уменьшает вероятность того, что вроде бы один и тот же код будет работать иначе в разных местах приложения просто из-за разного порядка вызова методов initFromXX. Цитата:
Цитата:
Цитата:
|
|
|
За это сообщение автора поблагодарили: mazzy (10), Logger (10), DmitrySt (1), konopello (3), wojzeh (1). |
28.03.2011, 01:16 | #42 |
Участник
|
Я тут в блогах увидел интересную сравнительную таблицу для выбора оптимального метода хранения и отборки товара на складе в зависимости от ряда параметров:
Так вот, чтобы ответить на поставленный вопрос:нужно, как вариант, составить подобную таблицу для выбора оптимального API/подхода по работе с теми же журналами в зависимости от различных параметров. Но это очень непростая задача, мне кажется, в рамках простого обсуждения в одной ветке форума ее не решить. |
|
28.03.2011, 01:34 | #43 |
Участник
|
Спасибо. Круть.
Цитата:
Сообщение от gl00mie
При реализации AxBC-класса вам вам волей-неволей приходится продумать единую систему приоритезации зависимостей полей. Это сложнее, но зато уменьшает вероятность того, что вроде бы один и тот же код будет работать иначе в разных местах приложения просто из-за разного порядка вызова методов initFromXX.
Цитата:
Сообщение от gl00mie
то в долгосрочной перспективе предпочтительным видится подход с использованием AxBC-классов. Он сложнее в реализации, требует фиговой тучи промежуточного кода (который, впрочем, можно во многом сгенерить мастером), требует выворачивания на изнанку привычной логики работы методов initFromXX (там изменили одно поле - и каскадом поменялась куча других, тут надо описывать изменение каждого отдельного "другого" поля в зависимости от возможных изменений кучи "исходных" полей). Но в общем и в целом он существенно снижает стоимость поддержки приложения.
Наизнанку, стало быть... А ведь, правда... Спасибо за хорошее слово... Цитата:
Сообщение от gl00mie
Более того, опять хотел бы вернуться к процитированному фрагменту из "What's New - Technical in Microsoft Dynamics AX 2012 for Development": в следующей версии штатно будет реализована возможность редактировать данные в Excel - то, о чем мечтает, по моим впечатлениям, 95% пользователей Аксапты, особенно работающих с финансами.
Тогда годная задумка... Цитата:
Сообщение от gl00mie
Эта возможность напрямую будет зависеть от наличия и корректности реализации AxBC-классов, так что их реализация и использование сейчас - это еще и большой задел на будущее. Но, разумеется, в определенных условиях (таблица используется лишь в нескольких местах приложения, либо нужно сделать простое решение, а на разработку AxBC-классов никто не выделит бюджет, либо все уже слишком запущено, и на рефакторинг всего существующего кода никто не выделит бюджет) придется использовать лучшее из имеющегося либо создавать "простые" initFromXX-методы.
А есть методика сопряжения старого (initFrom) и нового (axBC) подхода? Или они принципиально несопряжимы? Т.е. можно ли использовать initFrom из axBC-классов? и наоборот, можно ли использовать axBC из InitFrom? какие ограничения? при каких условиях это допустимо, а при каких нет? |
|
28.03.2011, 12:13 | #44 |
Участник
|
Цитата:
APIs in the Standard Application http://msdn.microsoft.com/en-US/library/aa873132.aspx Application Integration Framework Overview http://msdn.microsoft.com/en-us/library/bb496535.aspx Также в книгах: "Inside Microsoft Dynamics AX 4.0" Part II Chapter 9, "Inside Microsoft Dynamics AX 2009" Part III Chapter 17.
__________________
Мой профиль |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (6). |
28.04.2011, 12:20 | #45 |
NavAx
|
Эх, интересное обсуждение прошло мимо в угаре работы...
Вставлю свои 5 копеек и попробую ответить на этот вопрос: Цитата:
Т.е. можно ли использовать initFrom из axBC-классов? и наоборот, можно ли использовать axBC из InitFrom?
какие ограничения? при каких условиях это допустимо, а при каких нет? Далее. Расписывая прелести axBC, gloomie не счел достойным упомянуть, что при реализации конкретной необходимой функциональности, стройное дерево зависимостей инициализации полей, одну ветку из которого нарисовал mazzy, зачастую начинает обретать петли. Так бывает, когда задача ставится таким образом, что для окончательного определения значений конкретного поля, приходится сделать один "оборот" по такой петле, порой, даже насильственно перезаписывая уже единожды заполненное поле. А раз так - то прозрачная схема метода setTableFields уже становится не такой уж и прозрачной, Так, забавна ситуация, когда в пришедшей по AIF записи какое-либо из полей заполнено неправильно (т.е. значение-то корректное, но в сочетании с другими полями - нет). Существующая реализация AIF такое поле уже перезаписать штатной обработкой не сможет, setField, вызываемый в процессе обработки записи, не будет записывать уже единожды записанное поле.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
|
За это сообщение автора поблагодарили: mazzy (5), Logger (3). |
28.04.2011, 12:29 | #46 |
Участник
|
Цитата:
Какие рекомендации по использованию? я так понимаю, что стиль initFrom можно объявлять legacy и по возможности использовать axBC. так? Можно ли попросить соображения в стиле: при таких то случаях лучше делать так?... |
|
28.04.2011, 13:09 | #47 |
NavAx
|
Цитата:
Сообщение от mazzy
я так понимаю, что стиль initFrom можно объявлять legacy и по возможности использовать axBC. так?
Можно ли попросить соображения в стиле: при таких то случаях лучше делать так?... 2. Что же касается реальной разработки, то тут варианта 2: 2.1 "Чистый новый проект" - делаем все на новых классах, за initFromxxx - бьем по рукам, параллельно допиливаем axBC (может быть, используя initFromXXX, правда, очень сомневаюсь, что оно там пригодится, заполнение полей делается несколько по-другому), т.к. из-за использования в стандарте старых подходов, чего-то будет неминуемо не хватать. На выходе - имеем допиленный API и сразу "искаропки" работающий AIF, заказчик, решивший внедрить ESB, или прикрутить свой Web-магазин счастлив. 2.2 Проект, в котором много собранного/собирающегося из кучи уже внедренных решений. Ну, что тут сказать - знающий, да содрогнется. В этой бочке меда уже есть изрядная толика дёгтя. Конечно, смотря что собиралось. Но если туда добавится еще ложка - вряд ли ей станет сильно хуже. Останавливать желающего поиметь experience это не должно. Но если есть хотя бы отдаленная перспектива взаимодействия через XML с внешними системами, переносимые доработки должны быть подвергнуты тщательному исследованию на предмет переделки на API axBC. У меня уже был опыт адаптации уже запущенного решения для нормальной работы с AIF, и я скажу, удовольствие это сильно ниже среднего, учитывая, "удобство" отладки при потреблении Web-сервисов AX внешними системами. Т.е. напилено было много чисто "по старому", и для внесения всего этого в новую схему, хотя бы в деле простого создания/редактирования записей, пришлось много потрудиться. В целом, Цитата:
Сообщение от gloomie
в долгосрочной перспективе предпочтительным видится подход с использованием AxBC-классов
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
|
За это сообщение автора поблагодарили: mazzy (5), fed (5). |
28.04.2011, 21:30 | #48 |
Участник
|
Цитата:
Сообщение от Maximin
при реализации конкретной необходимой функциональности, стройное дерево зависимостей инициализации полей, одну ветку из которого нарисовал mazzy, зачастую начинает обретать петли. Так бывает, когда задача ставится таким образом, что для окончательного определения значений конкретного поля, приходится сделать один "оборот" по такой петле, порой, даже насильственно перезаписывая уже единожды заполненное поле.
Цитата:
Сообщение от Maximin
Так, забавна ситуация, когда в пришедшей по AIF записи какое-либо из полей заполнено неправильно (т.е. значение-то корректное, но в сочетании с другими полями - нет). Существующая реализация AIF такое поле уже перезаписать штатной обработкой не сможет, setField, вызываемый в процессе обработки записи, не будет записывать уже единожды записанное поле.
Не везде такой подход применим, конечно, например, какая-нить настройка фиксированной аналитики в проверке аналитик для счетов ГК, из-за которой молча могут перезатираться аналитики в проводках по этим счетам, в эту идеологию явно не вписываются. |
|
29.04.2011, 13:24 | #49 |
NavAx
|
Цитата:
Сообщение от gl00mie
По-моему, это совершенно правильное поведение: если внешняя или внутренняя программная логика сочла нужным установить определенное значение поля, то нечего его перезаписывать, "решая" за эту программную логику, как правильно. Ошибка, если она и возникнет, должна, по-моему, решаться по факту на уровне этой программной логики.
Внешняя система не может или не должна знать некоторые из параметров, требуемые для полностью корректного заполнения всех полей записи. В самом деле, например, если у вас b2b взаимодействие, то должен ли ваш клиент/поставщик знать, к примеру, его группу цен? Ему главное - чтобы его заказ пришел к вам, а если ваша система будет по любому чиху отвергать его заказ, нетерпимо относясь к несколько неверно заполненному запросу, вы потеряете клиента. Так что система пр работе с внешними запросами должна допускать некий "люфт" в данных - их некоторую неполноту, автоматически исключая/корректируя внешние данные. Не будете же вы отвергать создание нового заказа из Web-магазина, из-за того, что формат адреса или телефона не соответствует заданному? Что касается "петель", то реальный пример как раз и был связан с тем, что извне пришло пустое значение, и требовалось его переопределить, причем, в зависимости от других значений по умолчанию. А после переопределения, оно само начинало влиять на эти другие значения. Что-то вроде той же ценовой группы и группы скидок, завязанной из-за специфической схемы ценообразования на те же ценовые группы (для некоторых ценовых групп скидки были неприменимы). Сами понимаете, что вытаскивать "наружу" ценоообразование Аксапты мало того что сложно технически, но еще, зачастую, и крайне нежелательно по маркетинговым соображениям.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
29.04.2011, 15:25 | #50 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Сообщение от Maximin
Что касается "петель", то реальный пример как раз и был связан с тем, что извне пришло пустое значение, и требовалось его переопределить, причем, в зависимости от других значений по умолчанию. А после переопределения, оно само начинало влиять на эти другие значения. Что-то вроде той же ценовой группы и группы скидок, завязанной из-за специфической схемы ценообразования на те же ценовые группы (для некоторых ценовых групп скидки были неприменимы). Сами понимаете, что вытаскивать "наружу" ценоообразование Аксапты мало того что сложно технически, но еще, зачастую, и крайне нежелательно по маркетинговым соображениям.
|
|
Теги |
ax-классы, axbc, как правильно |
|
|