|
![]() |
#1 |
Участник
|
Цитата:
Что за подмена "прямо на лету" и почему этого нельзя сделать с таблицами? |
|
![]() |
#2 |
Участник
|
Спасибо за информацию, но кое с чем не могу согласиться.
Цитата:
Цитата:
Цитата:
X++: public void modifiedField(fieldId _fieldId) { AxSalesTable AxSalesTable; Object formDataSource; super(_fieldId); if (this.isFormDataSource()) { if (formDataSourceHasMethod(this.dataSource(),classstr(AxSalesTable))) { formDataSource = this.dataSource(); AxSalesTable = formDataSource.AxSalesTable(); } } else { AxSalesTable = this.AxSalesTable(); } if (AxSalesTable) { AxSalesTable.setFieldAsTouched(_fieldId); AxSalesTable.modify(); } } Последний раз редактировалось gl00mie; 27.03.2011 в 13:19. Причина: дополнение |
|
![]() |
#3 |
Участник
|
Цитата:
X++: if (this.valueMappingOutbound()) { return this.axCustAccount(salesLine.CustAccount); } else { return salesLine.CustAccount; } Цитата:
Цитата:
Сообщение от gl00mie
![]() Опять же не могу согласиться. Если кто пробовал добавлять свои или модифицировать штатные обработчики modifiedField(), скажем, для шапки или строк заказов и ожидал увидеть в одноименном стандартном методе привычный switch(_fieldId), то его - опять же со времен 3.0 - ждал "сюрприз":
Последний раз редактировалось erudit; 27.03.2011 в 14:10. |
|
![]() |
#4 |
Участник
|
Цитата:
Цитата:
Присоединюсь к Zabr и спрошу - а может где-нибудь есть документация для чего ax-классы сделаны и как с ним работать? может я чего пропустил? вот что есть на форуме Цитата:
Сообщение от Blog bot
![]() · AxBC (Ax) classes that provide an object API on top of the database tables referenced in the query.
Источник: http://blogs.msdn.com/dsiebold/archi...f-top-ten.aspx Цитата:
Сообщение от Blog bot
![]() Источник: http://feeds.feedburner.com/~r/Insid...lbase-api.html
============== The goal for creating Ax classes was to have an API available when creating and updating records in Dynamics AX tables. The design goals of the AxInternalBase API were as follows:
а также Как часто вы кастомизируете стандартные сервисы номенклатур. (!) axStart: InfoPath with default AIF web services (!) dax-lessons: 3 Clicks to generate AXBC code dax-ideas: Creating a SalesOrder through .net applications or BC classes parm-метод для AxBC-класса Кастом поля и AIF Preston.Larimer: Item import from CSV file made easy (Kinda) а также по тегу axbc и тегу aif ========================= и по прежнему остается вопрос: В чем преимущество ax-классов перед непосредственной работой с таблицами? в ходе обсуждения выявлены следующие вкусности axbc-классов: 1. удобство для программиста для использования во внешних системах 2. автоматическая "подмена кода" в некоторых заранее прописанных местах 3. инструменты для генерации классов-оберток. только в чем преимущество внутри Аксапты то? Например, для работы с журналами внутри Аксапты есть: = и непосредственная работа с таблицами через initFrom* и переопределение (overload) системных методов = и классы JournalTableData, JournalTransData, journalStactic. = и куча классов типа LedgerJournalTransUpdate* и даже локализаторское семейство LedgerJournalCreate* = и классы LedgerJournalTransType в зачаточном состоянии (причем LedgerJournalTableType отсутствует) = и axLedgerJournal* Чуть проще для SalesTable. Есть: = и непосредственная работа с таблицами через initFrom* и переопределение (overload) системных методов = и SalesType* = и axSalesTable В чем преимущество каждого из подходов? Когда и какой применять? |
|
![]() |
#5 |
Участник
|
К сожалению, подтвердить свои слова публично доступной документацией не могу. Я много лет работаю с AIF, также общался с людьми из Микрософта которые создавали Axd-framework и AxBC-классы, на основе этого и мои выводы, но возможно я чего-то тоже не знаю.
|
|
![]() |
#6 |
Участник
|
Цитата:
Цитата:
5. При необходимости начать заполнять новое поле в зависимости от других полей во всех местах, где идет создание записей в таблице, достаточно поменять один класс - не надо менять десятки мест в приложении, где об этом поле раньше никто не знал (опять же принцип DRY, снижение стоимости сопровождения). 6. Это, по-моему, очень важно: методы initFromXX могут давать разный результат в зависимости от последовательности их вызова! При реализации AxBC-класса вам вам волей-неволей приходится продумать единую систему приоритезации зависимостей полей. Это сложнее, но зато уменьшает вероятность того, что вроде бы один и тот же код будет работать иначе в разных местах приложения просто из-за разного порядка вызова методов initFromXX. Цитата:
Цитата:
Цитата:
![]() ![]() |
|
|
За это сообщение автора поблагодарили: mazzy (10), Logger (10), DmitrySt (1), konopello (3), wojzeh (1). |
![]() |
#7 |
Участник
|
Цитата:
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). |
![]() |
#8 |
Участник
|
Я тут в блогах увидел интересную сравнительную таблицу для выбора оптимального метода хранения и отборки товара на складе в зависимости от ряда параметров:
![]() Так вот, чтобы ответить на поставленный вопрос:нужно, как вариант, составить подобную таблицу для выбора оптимального API/подхода по работе с теми же журналами в зависимости от различных параметров. Но это очень непростая задача, мне кажется, в рамках простого обсуждения в одной ветке форума ее не решить. |
|
![]() |
#9 |
NavAx
|
Эх, интересное обсуждение прошло мимо в угаре работы...
![]() Вставлю свои 5 копеек и попробую ответить на этот вопрос: Цитата:
Т.е. можно ли использовать initFrom из axBC-классов? и наоборот, можно ли использовать axBC из InitFrom?
какие ограничения? при каких условиях это допустимо, а при каких нет? Далее. Расписывая прелести axBC, gloomie не счел достойным упомянуть, что при реализации конкретной необходимой функциональности, стройное дерево зависимостей инициализации полей, одну ветку из которого нарисовал mazzy, зачастую начинает обретать петли. Так бывает, когда задача ставится таким образом, что для окончательного определения значений конкретного поля, приходится сделать один "оборот" по такой петле, порой, даже насильственно перезаписывая уже единожды заполненное поле. А раз так - то прозрачная схема метода setTableFields уже становится не такой уж и прозрачной, ![]()
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... ![]() |
|
|
За это сообщение автора поблагодарили: mazzy (5), Logger (3). |
![]() |
#10 |
Участник
|
Цитата:
Какие рекомендации по использованию? я так понимаю, что стиль initFrom можно объявлять legacy и по возможности использовать axBC. так? Можно ли попросить соображения в стиле: при таких то случаях лучше делать так?... |
|
![]() |
#11 |
Участник
|
Цитата:
Сообщение от Maximin
![]() при реализации конкретной необходимой функциональности, стройное дерево зависимостей инициализации полей, одну ветку из которого нарисовал mazzy, зачастую начинает обретать петли. Так бывает, когда задача ставится таким образом, что для окончательного определения значений конкретного поля, приходится сделать один "оборот" по такой петле, порой, даже насильственно перезаписывая уже единожды заполненное поле.
Цитата:
Сообщение от Maximin
![]() Так, забавна ситуация, когда в пришедшей по AIF записи какое-либо из полей заполнено неправильно (т.е. значение-то корректное, но в сочетании с другими полями - нет). Существующая реализация AIF такое поле уже перезаписать штатной обработкой не сможет, setField, вызываемый в процессе обработки записи, не будет записывать уже единожды записанное поле.
Не везде такой подход применим, конечно, например, какая-нить настройка фиксированной аналитики в проверке аналитик для счетов ГК, из-за которой молча могут перезатираться аналитики в проводках по этим счетам, в эту идеологию явно не вписываются. |
|
![]() |
#12 |
NavAx
|
Цитата:
Сообщение от mazzy
я так понимаю, что стиль initFrom можно объявлять legacy и по возможности использовать axBC. так?
Можно ли попросить соображения в стиле: при таких то случаях лучше делать так?... 2. Что же касается реальной разработки, то тут варианта 2: 2.1 "Чистый новый проект" - делаем все на новых классах, за initFromxxx - бьем по рукам, параллельно допиливаем axBC (может быть, используя initFromXXX, правда, очень сомневаюсь, что оно там пригодится, заполнение полей делается несколько по-другому), т.к. из-за использования в стандарте старых подходов, чего-то будет неминуемо не хватать. На выходе - имеем допиленный API и сразу "искаропки" работающий AIF, заказчик, решивший внедрить ESB, или прикрутить свой Web-магазин счастлив. 2.2 Проект, в котором много собранного/собирающегося из кучи уже внедренных решений. Ну, что тут сказать - знающий, да содрогнется. В этой бочке меда уже есть изрядная толика дёгтя. Конечно, смотря что собиралось. Но если туда добавится еще ложка - вряд ли ей станет сильно хуже. ![]() ![]() В целом, Цитата:
Сообщение от gloomie
в долгосрочной перспективе предпочтительным видится подход с использованием AxBC-классов
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... ![]() |
|
|
За это сообщение автора поблагодарили: mazzy (5), fed (5). |
![]() |
#13 |
NavAx
|
Цитата:
Сообщение от gl00mie
По-моему, это совершенно правильное поведение: если внешняя или внутренняя программная логика сочла нужным установить определенное значение поля, то нечего его перезаписывать, "решая" за эту программную логику, как правильно. Ошибка, если она и возникнет, должна, по-моему, решаться по факту на уровне этой программной логики.
Внешняя система не может или не должна знать некоторые из параметров, требуемые для полностью корректного заполнения всех полей записи. В самом деле, например, если у вас b2b взаимодействие, то должен ли ваш клиент/поставщик знать, к примеру, его группу цен? Ему главное - чтобы его заказ пришел к вам, а если ваша система будет по любому чиху отвергать его заказ, нетерпимо относясь к несколько неверно заполненному запросу, вы потеряете клиента. Так что система пр работе с внешними запросами должна допускать некий "люфт" в данных - их некоторую неполноту, автоматически исключая/корректируя внешние данные. Не будете же вы отвергать создание нового заказа из Web-магазина, из-за того, что формат адреса или телефона не соответствует заданному? Что касается "петель", то реальный пример как раз и был связан с тем, что извне пришло пустое значение, и требовалось его переопределить, причем, в зависимости от других значений по умолчанию. А после переопределения, оно само начинало влиять на эти другие значения. Что-то вроде той же ценовой группы и группы скидок, завязанной из-за специфической схемы ценообразования на те же ценовые группы (для некоторых ценовых групп скидки были неприменимы). Сами понимаете, что вытаскивать "наружу" ценоообразование Аксапты мало того что сложно технически, но еще, зачастую, и крайне нежелательно по маркетинговым соображениям.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... ![]() |
|
![]() |
#14 |
Участник
|
Цитата:
Цитата:
![]() Цитата:
Цитата:
Сообщение от Maximin
![]() Что касается "петель", то реальный пример как раз и был связан с тем, что извне пришло пустое значение, и требовалось его переопределить, причем, в зависимости от других значений по умолчанию. А после переопределения, оно само начинало влиять на эти другие значения. Что-то вроде той же ценовой группы и группы скидок, завязанной из-за специфической схемы ценообразования на те же ценовые группы (для некоторых ценовых групп скидки были неприменимы). Сами понимаете, что вытаскивать "наружу" ценоообразование Аксапты мало того что сложно технически, но еще, зачастую, и крайне нежелательно по маркетинговым соображениям.
|
|
Теги |
ax-классы, axbc, как правильно |
|
|