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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2018, 12:50   #1  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
284 / 276 (10) ++++++
Регистрация: 27.02.2006
Адрес: Дания
D365FO: когда обновление ломает доработку
А давайте сюда собирать примеры, в каких случаях такие нужные ежемесячные обновления могут тихо сломать невинную доработку.

В другой ветке я уже приводил пример с лукапом, когда мы создаем обработчик события onLookup на контроле, а потом Майкрософт решает перекрыть метод lookup на том же котроле, и наш обрабочик становится мертвым кодом.

Только что напоролся на нечто другое:
Если к таблице А добавить поле и релейшн на таблицу Б, причем в таблице А уже есть некоторое поле и релейшен, указывающие на ту же таблицу Б в другом контексте, то вызов QueryBuildDataSource.relations(true) где угодно может привести к неожиданным результатам.
За это сообщение автора поблагодарили: Vadik (1), Pokersky09 (2), ax_mct (3), raz (1).
Старый 05.12.2018, 13:55   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,373 / 900 (33) +++++++
Регистрация: 22.07.2003
Адрес: МО
class LedgerJournalCheckPost
мы использовали CoC на LedgerJournalCheckPost.postTrans(), последнее обновление:
X++:
    [SysObsoleteAttribute('Method postTrans has been deprecated. Please use postTransV2 method instead.', false)]
    protected boolean postTrans(
теперь есть новый метод LedgerJournalCheckPost.postTransV2().

Вот вам бесшовный и неразрушающий.
За это сообщение автора поблагодарили: Ivanhoe (3), sukhanchik (3), Stitch_MS (3), trud (2).
Старый 05.12.2018, 14:53   #3  
sukhanchik is offline
sukhanchik
Moderator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,661 / 2169 (78) +++++++++
Регистрация: 13.06.2004
Адрес: Москва
Та же самая ситуация с примером, который использует Entiti.
Была Entiti под названием "X". Ее использовали в коде для целей загрузки некоего справочника (потому что исходный формат загрузки сильно отличался от предполагаемого, который был в стандарте). После обновления была выпущена Entiti под название "XV2", а предыдущая была объявлена устаревшей. Ну и собственно все. Код формально компилируется, но фактически - не работает.

В конкретно моем случае это была замена с EcoResProductEntity на EcoResProductV2Entity и замена класса EcoResProductEntityToCrossTableDataAdaptor на EcoResProductV2EntityToCrossTableDataAdaptor. Соответственно - сломался импорт номенклатур при переходе с 7.3 на 8.0. Учитывая, что этих версий Entiti в частности при загрузке клиентов / поставщиков уже минимум 3 штуки я видел - то подозреваю, что их использование в коде - могло бы также привести к необходимости корректировки этого кода.

Также хочу отметить, что (правда тут никто не обещал, что все останется как есть) в 8.1 с выходом русской локализации код по импорту выписки переписали на использование GER-настроек, в связи с этим физически русский код по импорту выписки в 8.0 и ранее отличается от того, что вышло в 8.1 (конечно русская функциональность была отключена, но это не мешало использовать существующий код для целей написания самописного импорта выписки на базе стандартного кода)
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 05.12.2018 в 14:55.
Старый 05.12.2018, 15:59   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,238 / 2432 (90) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
https://docs.microsoft.com/en-us/dyn...considerations

Цитата:
Some methods will be attributed as obsolete to signal that they will be fully deprecated in the future. Any compiler warning that is generated due to the calling or wrapping of an obsolete method should be investigated to ensure that the expected code path still exists. In some cases, Microsoft code will directly call the new method in place of the obsolete method. When this happens, the code built around the obsolete method will not execute when expected.
__________________
https://axcoder.github.io
Старый 05.12.2018, 16:15   #5  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,373 / 900 (33) +++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Дело в том, что в предыдущей версии нет и намека на предстоящие изменения.
X++:
    /// true if the journal was posted successfully; otherwise, false.
    /// </returns>
    protected boolean postTrans(
        LedgerVoucher               _ledgerVoucher,
А если клиент купил доработку, внедрил и должен мочь "забыть" о ней, но фиг вам. С иглы не слезть. Никогда нельзя доверять MS. Они всегда ломали и будут ломать. Маркетинг не совадает с реальностью. Клиент будет платить все время пока использует продукты MS, чего MS и хочет добиться обманывая всех своими сказками.
Старый 05.12.2018, 20:29   #6  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
513 / 242 (10) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Стоит взять пример с разработчиков DirectX, которые знали, что если кто-то выпускал игры для 6-й или 7 версии, то последующие версии не должны сломать функционал старых игр. Итог превзошел все ожидания. Интерфейсы менялись крайне редко, а если менялись, то по сути создавались новые, более совершенные или более полезные, обрастая новыми методами, либо измененными старыми. Старый же код продолжал жить, радуя поклонников ретро-игр.
__________________
Незаменимых людей нет. Но и в отпуск мы тебя не отпустим. © Начальник
Старый 24.12.2018, 12:35   #7  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
62 / 120 (5) +++++
Регистрация: 25.01.2007
Адрес: Kyiv
Цитата:
Сообщение от dech Посмотреть сообщение
Стоит взять пример с разработчиков DirectX, которые знали, что если кто-то выпускал игры для 6-й или 7 версии, то последующие версии не должны сломать функционал старых игр. Итог превзошел все ожидания. Интерфейсы менялись крайне редко, а если менялись, то по сути создавались новые, более совершенные или более полезные, обрастая новыми методами, либо измененными старыми. Старый же код продолжал жить, радуя поклонников ретро-игр.
Вот по этому же пути и пошли Data Entity. Ну те которые XV2, XV3, и т.д.
Как бы и старый код не должен ломаться и новые фичи будут доступны для новых разработок.
Но что-то пошло не так...
Решили использовать старые имена для public end points (OData)...
За это сообщение автора поблагодарили: trud (2).
Старый 27.01.2019, 15:14   #8  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
284 / 276 (10) ++++++
Регистрация: 27.02.2006
Адрес: Дания
Еще пример. Класс SubledgerJournalizerProjectExtension,

X++:
    protected ProjEmplTrans createProjHourTrans(Container _projectActualHeaderContainer, SourceDocumentLineItem _sourceDocumentLineItem, ...)
    {
        ProjEmplTrans   projEmplTrans;
        PSAComponentGroupAssignment psaComponentGroupAssignment;

        projEmplTrans.clear();
        
        #declareProjectActualHeaderContainerVariablesMacro
        #projectActualHeaderContainerMacro = _projectActualHeaderContainer;

        projEmplTrans.ProjId = actualProjectId;
        projEmplTrans.CategoryId = actualCategoryId;
        projEmplTrans.ActivityNumber = actualActivityNumber;
        projEmplTrans.LinePropertyId = actualLinePropertyId;
Два макроса в коде выглядят так:
X++:
    #localmacro.declareProjectActualHeaderContainerVariablesMacro
        RefRecId            actualSourceDocumentLine;
        DataAreaId          actualProjectDataAreaId;
        ProjId              actualProjectId;
        ProjCategoryId      actualCategoryId;
        smmActivityNumber   actualActivityNumber;
        ProjLinePropertyId  actualLinePropertyId;
        CurrencyCode        actualTransactionCostCurrency;
        CurrencyCode        actualTransactionSalesCurrency;
        CurrencyCode        accountingCurrency;
        ProjTaxGroup        actualTaxGroupId;
        ProjTaxItemGroup    actualTaxItemGroupId;
        DimensionDefault    actualDefaultDimension;
        Qty                 actualQuantity;
        AmountCur           actualTransactionCurrencyCostAmount;
        AmountMST           actualAccountingCurrencyCostAmount;
        AmountCur           actualTransactionCurrencySalesAmount;
        AmountMST           actualAccountingCurrencySalesAmount;
    #endmacro

    #localmacro.projectActualHeaderContainerMacro
        [
        actualSourceDocumentLine,
        actualProjectDataAreaId,
        actualProjectId,
        actualCategoryId,
        actualActivityNumber,
        actualLinePropertyId,
        actualTransactionCostCurrency,
        actualTransactionSalesCurrency,
        accountingCurrency,
        actualTaxGroupId,
        actualTaxItemGroupId,
        actualDefaultDimension,
        actualQuantity,
        actualTransactionCurrencyCostAmount,
        actualAccountingCurrencyCostAmount,
        actualTransactionCurrencySalesAmount,
        actualAccountingCurrencySalesAmount
        ]
    #endmacro
Т.е. в методе createProjHourTrans первый параметр _projectActualHeaderContainer -- это, по сути, 17 параметров. Если изменить макросы, то список параметров в createProjHourTrans вроде как не изменился, возможно не будет считаться за breaking change, и может по-тихому сломать расширение, изменяющее значение одного из элементов в контейнере.

И в этом классе такой метод не один.
Старый 28.01.2019, 02:51   #9  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,233 / 846 (33) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Еще пример. Класс SubledgerJournalizerProjectExtension,

Т.е. в методе createProjHourTrans первый параметр _projectActualHeaderContainer -- это, по сути, 17 параметров. Если изменить макросы, то список параметров в createProjHourTrans вроде как не изменился, возможно не будет считаться за breaking change, и может по-тихому сломать расширение, изменяющее значение одного из элементов в контейнере.

И в этом классе такой метод не один.
Интересно кто все эти программисты. Где все эти архитекторы и ревью кода.
В любом языке и на любой платформе так не пишут. Это как кучку в лифте наложить.
Максимум два часа времени создать сериализующийся класс для передачи эти параметров если очень надо упаковкой между клиентом и сервером.
А если все на сервере то вообще дебилы.
Старый 28.01.2019, 09:54   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
678 / 810 (29) +++++++
Регистрация: 07.06.2003
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Интересно кто все эти программисты. Где все эти архитекторы и ревью кода.
Я тут узнал, что в индийской культуре не принятно возражать старшим. так что если код писался "уважаемыми" людьми, то ревью тут не поможет
Старый 28.01.2019, 11:26   #11  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,761 / 2292 (84) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от trud Посмотреть сообщение
Я тут узнал, что в индийской культуре не принятно возражать старшим. так что если код писался "уважаемыми" людьми, то ревью тут не поможет
Это австриец Michael Gall писал. Или по крайней мере концепцию создавал. Очень приятный и талантливый парень, кстати. Ну и вполне заслуженно блестящую карьеру сделал.
Старый 28.01.2019, 16:43   #12  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,233 / 846 (33) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от EVGL Посмотреть сообщение
Это австриец Michael Gall писал. Или по крайней мере концепцию создавал. Очень приятный и талантливый парень, кстати. Ну и вполне заслуженно блестящую карьеру сделал.
Ну с PHD в Computer science не поспоришь.
https://www.linkedin.com/in/migall/

Но передавать динамическую кучку таким образом как-то не по программистски совсем.
Даже если без расширений, а просто в одной команде это уже проблемное место.
Бывают компромиссы но здесь просто недостаток опыта в программировании вообще.
Старый 28.01.2019, 16:55   #13  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,395 / 4538 (156) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Ну с PHD в Computer science не поспоришь.
https://www.linkedin.com/in/migall/

Но передавать динамическую кучку таким образом как-то не по программистски совсем.
Даже если без расширений, а просто в одной команде это уже проблемное место.
Бывают компромиссы но здесь просто недостаток опыта в программировании вообще.
<SARCASM> Как я уже много раз говорил - Allocations and Source Document Infrastructure - это такая специальная функциональность, в которой криво все начиная с исходных требований и кончая мелкими нюансами кодинга. Вероятно, авторы как раз стремились подтвердить теорию о том, что бредовые исходные требования не могут быть преодолены с помощью хитроумных технологий программирования, и в любом случае породят кривой код - какие паттерны проектирования не применяй.
</SARCASM>
За это сообщение автора поблагодарили: vmoskalenko (2), ax_mct (3), Vadik (1), AlGol (2).
Старый 31.01.2019, 18:07   #14  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,373 / 900 (33) +++++++
Регистрация: 22.07.2003
Адрес: МО
https://www.linkedin.com/pulse/musin...s-jacob-roder/
За это сообщение автора поблагодарили: ax_mct (5).
Старый 01.02.2019, 02:02   #15  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
2,233 / 846 (33) +++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Не уверен что по теме так как вроде бы здесь все на примерах и эта статья шире
Небольшое summary

Цитата:
Providing there's no deferral, the production update is executed a week after the sandbox update.

The customer wasn't able to test, though, during the week - some key stakeholders were out of the office.

We responded to the email to inform Microsoft we needed to defer, and never heard back.

We waited up until the deadline, still didn't hear back, so we reached out to ASfP (Advanced Support for Partners).

They told us to create a severity A support ticket requesting the deferral, which we did. Support said they'd tell the team and they'd follow up with us.

The update happened anyways.
И вот это
Цитата:
To our customer, though, we look like idiots that can't figure out what we're doing.

Последний раз редактировалось ax_mct; 01.02.2019 в 02:05.
Теги
d365fo

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
cleverax: D365FO: Using Bar codes, External codes and GTIN in Warehouse app to identify an item. Blog bot DAX Blogs 0 03.02.2018 21:13
cleverax: D365FO: Manual inbound load rating Blog bot DAX Blogs 0 03.02.2018 21:13
patrickmouwen: Dynamics 365 CRM and ERP interaction Blog bot DAX Blogs 0 29.12.2017 03:11
Изменение книги покупок\продаж, журнал учета счетов фактур - когда выйдет обновление? Elenko DAX: Функционал 32 24.12.2014 10:52
Обновление detail-таблицы DreamCreator DAX: Программирование 1 05.04.2005 15:57
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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