|
26.01.2022, 16:52 | #1 |
Участник
|
В D365FO семейство классов RAssetProposal очень "занятно" распаковывает параметры в unpack(), из-за чего не так просто добавлять в это семейство новые параметры для сохранения в pack()/unpack().
Коллега недавно наткнулся на проблему, пытаясь применить к этому семейству рекомендации по расширению наследников RunBase. В рекомендациях говорится, что в pack() вашего класса-расширения нужно написать примерено так: X++: public container pack() { container packedClass = next pack(); return SysPackExtensions::appendExtension(packedClass, classStr(MySysUserLogCleanup_Extension), this.myPack()); } X++: public boolean unpack(container _packedClass) { boolean result = next unpack(_packedClass); if (result) { container myState = SysPackExtensions::findExtension(_packedClass, classStr(MySysUserLogCleanup_Extension)); result = this.myUnpack(myState); //Also unpack the extension } return result; } Вот как бы вы работали с queryRun в pack/unpack? Обычно это выглядит так: X++: public container pack() { return [#CurrentVersion, #CurrentList, queryRun.pack()]; } X++: public boolean unpack(container _packedClass) { Version version = RunBase::getVersion(_packedClass); boolean ret = true; switch (version) { case #CurrentVersion : container packedQuery; [version, #CurrentList, packedQuery] = _packedClass; if (SysQuery::isPackedOk(packedQuery)) // ... X++: [version, #CurrentList, packedQuery] = _packedClass; X++: return [#CurrentVersion, #CurrentList, queryRun.pack()]; Но локализаторы же хитрее всех, поэтому они считают, что их запакованный queryRun всегда идет последним, и пишут вот что: X++: public boolean unpack(container packedClass) { Integer version = conPeek(packedClass,1); container packedQuery = conPeek(packedClass, conLen(packedClass)); |
|
|
За это сообщение автора поблагодарили: ax_mct (5), S.Kuskov (5), dech (10), Pandasama (2). |
27.01.2022, 03:00 | #2 |
Banned
|
Цитата:
Спасибо за опыт! Делаю вывод что в топку их инструкцию так любое их обновление unpack может вызвать подобный сценарий ошибки. Часв два времени сделать свою таблицу и отладить код для хранения своего контейнера. То есть: CoC на pack/unpack но без изменений того что кладется и вынимается. Собственная таблица для хранения своего дополнительного контейнера. Напрягает что в любом будущем автоматическом накате изменений может быть такая ошибка. Сейчас OK, а скажем через год добавят диалоговый параметр и плохо напишут код в unpack. Думаю что это самый классический случай когда будущее изменение вендора может сломать приложение без ошибок компиляции. Кто будет виноват. Мы. Из-за нашего расширения ошибка - да. Подстава. |
|