28.08.2013, 07:20 | #1 |
Возьми свет!!!
|
Баг или не баг?
ax 2009 метод dictEnum.index2Symbol не работает если какому то значение enum назначить значение в разрыв. т.е. было 1,2,3,4 добавили новое со значением 100. Метод перестает работать и выдает что то по китайски.
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|
28.08.2013, 07:50 | #2 |
Участник
|
Используйте value2Symbol. Ведь вы по значению хотите определять. А то что index2Symbol не работает для такого случая, это вполне логично ведь 100 элемента нет, есть значение 100.
__________________
Sergey Nefedov |
|
28.08.2013, 08:39 | #3 |
Возьми свет!!!
|
index2Symbol используется в системе(gls слой).. например на форме заполенения подписей в складских журналах. Править код gls?
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|
28.08.2013, 08:50 | #4 |
Участник
|
Вообще да, а что это делать запрещено? Не ошибается тот, кто ничего не делает.
И в 2012 в методах определения должностных лиц по складским журналам используется index2Symbol, тоже приходилось править. Класс InventJournalPrintForm_RU метод run, в 2х местах (это dax2012) X++: ...
//dsName = dictEnum.index2Symbol(report.reportType());
dsName = dictEnum.value2Symbol(report.reportType());
...
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Murlin (1). |
28.08.2013, 11:56 | #5 |
Участник
|
Кажется в Колумбусе было даже правило, чтобы не задеть случаем какой сервис-пак, в стандартные енумы добавлять значения, начиная с 32 позиции. Так что используйте value2symbol() как Сергей сказал.
__________________
// no comments |
|
28.08.2013, 12:05 | #6 |
Возьми свет!!!
|
Цитата:
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! Последний раз редактировалось Murlin; 28.08.2013 в 12:11. |
|
29.08.2013, 08:57 | #7 |
Участник
|
енумы иногда хранятся в табличных полях, так что с очередным SP пришлось бы данные перебивать, а это не так тривиально, как заменить вызов одного метода на другой.
|
|
29.08.2013, 09:22 | #8 |
Участник
|
|
|
29.08.2013, 18:34 | #9 |
Возьми свет!!!
|
А какой смысл, все равно надо будет при занесении сравнивать те классы даже системные которые в принципе никакой модификации не подвергались при обычном ходе вещей.. Лучше уж и правда апгрейд скрипты написать... Или заносить новые энамы сравнением и назначением нового номера... Я чета не знаю где в системы бы вместо енама использовалось число.
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! Последний раз редактировалось Murlin; 29.08.2013 в 18:38. |
|
29.08.2013, 18:40 | #10 |
Возьми свет!!!
|
Цитата:
SP - или энам занести переназначив значение, или не переназначать но каждый раз учитывать те изменения которые внесены в классы или функции там во многих местах... а вдруг забудет занесет случайно... опять выискивать ошибку исправлять и тп. Новый enum новое значение. Как то так... Его все равно не было.
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! Последний раз редактировалось Murlin; 29.08.2013 в 18:50. |
|
29.08.2013, 18:59 | #11 |
Возьми свет!!!
|
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|
29.08.2013, 19:53 | #12 |
Участник
|
Хорошая у вас подпись. Верная
|
|
29.08.2013, 20:03 | #13 |
Возьми свет!!!
|
Наверное. Но вопрос открыт или кто то что то делает неправильно, или это баг требующий правки по всей системе. Просто поиском по AOT я нашел штук 10-20 вызовов этого метода. Все остальное про апгрейд скрипты несуществующих записей я не понял.
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|
29.08.2013, 20:30 | #14 |
Administrator
|
Цитата:
Что же касается апгрейд-скриптов - то речь идет о следующей ситуации: имеем АХ сервис-пак N. В этом приложении имеется енум со значениями 1,2,3,4. Выпускается сервис-пак N+1. В нем Микрософт добавил новое значение, допустим 5. Но Вы в своей модификации тоже добавили значение 5. Возникает конфликт - т.к. в БД хранится число 5 и БД заведомо не знает - это 5 для функционала от Микрософта или 5 для функционала Вашего. Требуется выполнение некоторых действий (=написание апгрейд скриптов), которые "разведут" в Вашей БД число 5 от Микрософта и число 5 от Вашей модификации. Поэтому было принято негласное соглашение. Микрософт добавляет номера енумов по порядку (1,2,3,4,5), а партнеры / клиенты - делают некоторый резерв по номерам и начинают нумеровать с 32-го, 100-го или еще какого-то большого номера. К сожалению, в 2012-й эта практика была нарушена и уже внутри Микрософта появились вот такие вот "дырки" вида 1,2,3,4,100. Тем не менее - использование номеров енума не по порядку - есть нормальное явление, а номера енумов прописываются как было верно подмечено в БД и релейшнах. А местами еще (к сожалению) используются знаки сравнения "больше" и "меньше" применительно к значениям енумов.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
30.08.2013, 01:05 | #15 |
Участник
|
Так ведь их мало написать (и по возможности обеспечить идемпотентность, что в данном случае непросто) - их ещё надо выполнить, а это гарантированный простой рабочей системы, если у вас база не игрушечная; не везде лишние простои приветствуются. В тех же сохраненных запросах пользвотели могут забить число вместо метки, а сохраненные запросы могут использоваться для пакетных заданий или отчетов; в кубах и вообще любой внешней системе, которая читает БД Аксапты напрямую, также используют числовые значения полей-енумов.
|
|
30.08.2013, 06:30 | #16 |
Возьми свет!!!
|
Цитата:
Сообщение от sukhanchik
Это не баг, как было выше сказано. В тех местах, которые Вы нашли - необходимо убедиться, что в в качестве аргумента передается именно значение, а не номер по порядку в цикле, в котором перебираются все значения енума. Если передается значение - то это баг (причем только в этом месте, а не в ядре), если передается номер по порядку в цикле - то это не баг - это нормальное поведение работы в системе.
Что же касается апгрейд-скриптов - то речь идет о следующей ситуации: имеем АХ сервис-пак N. В этом приложении имеется енум со значениями 1,2,3,4. Выпускается сервис-пак N+1. В нем Микрософт добавил новое значение, допустим 5. Но Вы в своей модификации тоже добавили значение 5. Возникает конфликт - т.к. в БД хранится число 5 и БД заведомо не знает - это 5 для функционала от Микрософта или 5 для функционала Вашего. Требуется выполнение некоторых действий (=написание апгрейд скриптов), которые "разведут" в Вашей БД число 5 от Микрософта и число 5 от Вашей модификации. Какие апгрейд скрипты, какие запросы какие RLS. Передается именно значение
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! Последний раз редактировалось Murlin; 30.08.2013 в 06:34. |
|
30.08.2013, 06:33 | #17 |
Возьми свет!!!
|
Цитата:
Сообщение от sukhanchik
К сожалению, в 2012-й эта практика была нарушена и уже внутри Микрософта появились вот такие вот "дырки" вида 1,2,3,4,100. Тем не менее - использование номеров енума не по порядку - есть нормальное явление, а номера енумов прописываются как было верно подмечено в БД и релейшнах. А местами еще (к сожалению) используются знаки сравнения "больше" и "меньше" применительно к значениям енумов.
Выигрыша никакого не вижу совсем. Но с другой стороны код вида, select a where a.b<C: && a.b>C::B Работать не будет, но и зачем такой код нужен, по мойму и так и так будет скан таблицы, и с перечислением и без. Зачем майкрософт пишет такой код?
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! Последний раз редактировалось Murlin; 30.08.2013 в 06:53. |
|
30.08.2013, 08:10 | #18 |
Administrator
|
Цитата:
Сообщение от Murlin
Допустим при переносе SP я вместо майкрософтовского 5 сделаю 6... Подниму на Usr слой с этим значением, после этого останется поправить только новые relationы(тем более что relation даже визуально проще найти ошибку)
Какие апгрейд скрипты, какие запросы какие RLS. Передается именно значение Ну вот был у Вас SP N, Вы подготовили приложение (переделали все relation-ы) с SP N+1 (заменили все 5 на 6 и т.д.). А теперь Вам надо обновить рабочую (!) БД. И очевидно, что в процессе обновления люди работать в рабочей системе не смогут. Вопрос: сколько по времени может длиться Ваше обновление? А если система работает в режиме 24х7? Если нет - то ночью могут запускаться какие-то тяжелые процессы каких-нибудь расчетов / пересчетов. И дело тут не в отдельно взятых енумах. Базу не начинают с нуля при обновлении сервис-пака. Чтобы грамотно все обновить - нужно составить список таблиц и полей в них - где это значение (5) могло бы использоваться, чтобы его там перебить на новое значение (6). Можно конечно остановить базу и начать искать. Но для сокращения времени простоя рабочей базы и пишутся скрипты по заранее составленному списку мест. Причем в зависимости от объема данных и скрипты могут выполняться далеко не мгновенно. А как уже было сказано - эти места могут быть и завуалированы (например, в BLOB-поле, в котором хранится запакованный Query), Т.е. еще раз повторюсь - проблема не столько в программном коде, который выгружается в XPO - сколько в обновлении данных и сокращении времени простоя рабочей БД.
__________________
Возможно сделать все. Вопрос времени |
|
30.08.2013, 08:33 | #19 |
Участник
|
Обычно в случае конфликта системного кода и собственного меняют собственный, а не наоборот. Можно конечно и системный переопределить но ... остлеживание коллизий при каждом следующем обновлений, несовместимость с другими модификациями ...
Востанавливать на очень старую версию приложения. |
|
30.08.2013, 09:25 | #20 |
Возьми свет!!!
|
Цитата:
Сообщение от S.Kuskov
Обычно в случае конфликта системного кода и собственного меняют собственный, а не наоборот. Можно конечно и системный переопределить но ... остлеживание коллизий при каждом следующем обновлений, несовместимость с другими модификациями ...
Востанавливать на очень старую версию приложения.
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|