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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.08.2013, 09:29   #21  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Вы сейчас рассуждаете только с одной стороны - со стороны программного кода.
Ну вот был у Вас SP N, Вы подготовили приложение (переделали все relation-ы) с SP N+1 (заменили все 5 на 6 и т.д.).
простоя рабочей БД.
Ok. Предположим я использовал 5 для связки со своими какими то записями, вышло обновление где enum назначена цифра 5, но это новая сущность новое понятие, новые записи. Какой смысл заносить его со старым значением 5. Зачем залазить в blob, rls и сохраненные запросы, если никаких настроек на эту сущность еще в принципе не существовало. Единственный минус тут в том что код a.b > c::a && a.b < c::d работать не будет. (По мойму вот это
a.b > c::a && a.b < c::d нужно сделать антиBP.)
Я вот не могу понять...
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!

Последний раз редактировалось Murlin; 30.08.2013 в 09:35.
Старый 30.08.2013, 11:13   #22  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Murlin Посмотреть сообщение
Ok. Предположим я использовал 5 для связки со своими какими то записями, вышло обновление где enum назначена цифра 5, но это новая сущность новое понятие, новые записи. Какой смысл заносить его со старым значением 5. Зачем залазить в blob, rls и сохраненные запросы, если никаких настроек на эту сущность еще в принципе не существовало. Единственный минус тут в том что код a.b > c::a && a.b < c::d работать не будет. (По мойму вот это
a.b > c::a && a.b < c::d нужно сделать антиBP.)
Я вот не могу понять...
При обновлении енуму не назначается цифра 5, а в этот енум добавляется элемент со значением 5, меткой и еще парой свойств. Правило гласит, что элементы не могут иметь одинаковые значения. Но иметь разрывы нумерации элементов - вполне допустимо. И этим пользуются. Что тут непонятного?
__________________
// no comments
Старый 30.08.2013, 12:36   #23  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от dech Посмотреть сообщение
При обновлении енуму не назначается цифра 5, а в этот енум добавляется элемент со значением 5, меткой и еще парой свойств. Правило гласит, что элементы не могут иметь одинаковые значения. Но иметь разрывы нумерации элементов - вполне допустимо. И этим пользуются. Что тут непонятного?
При сравнении слоев создавать элемент с таким же именем но другой цифрой, той же меткой и такими же свойствами но с цифрой 6 на usr слое, никаких апгрейд скриптов не нужно. Не существуют записи или сохраненные запросы с таким значением в этом поле соответствующем enum'у, если c SP пришло новое значение enum'а которого до этого на нижних слоях не было. Значения enum'а не несут никакого смысла.
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!

Последний раз редактировалось Murlin; 30.08.2013 в 12:40.
Старый 30.08.2013, 14:06   #24  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Ок, пусть с 5 останется ваш элемент, новый вы вместо 5 переделаете в 6. что имеем
1). Надо пойти и найти все новые релейшены и там то же исправить 5 на 6, причем старые релейшены оставить 5. Это повторять при каждом СП
2). Как уже говорили диапазоны енумов могут начать работать некорректно
3). Некоторые внешние программы/сервисы/партнерские решения напрямую лазяющие в бд видя цифру 5 будут думать что это новое значение из сервиспака а не ваше творчество. У вас с большой вероятностью доступа к их исходному коду не будет
4) Пришедшие после вас/просто коллеги будут три дня охреневать с матюгами какого всё это так сделано. Документирование подобных извращений не спасет ни от матюгов ни от вопросов

В итоге мозг вы взорвете и себе и свои коллегам/последователям на ровном месте, попутно подставив своего работодателя на дополнительные затраты по поддержке хитровывернутых замыслов

Если в стандарте ошибка, то надо ее зарегистрировать в мс и/или исправить самим. Как уже неоднократно писали дырки в енумах это абсолютно нормально. То что и в стандарте кое где про это забыли - ну такова жизнь, что еще сказать
Старый 30.08.2013, 14:35   #25  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Допустим мы вводим на слое usr в enum LedgerTransType со следующим по порядку значением. Наш код чего-то разносит, и в LegerTrans попадает некоторое количество записей с value 5. Если мы ставим сервис пак, в котором добавлено другое значение с тем же value, то нам надо перелопатить LedgerTrans и присвоить его полю новое значение. Елси мы этого не сделаем, то сисмеа будет интерпретировать это значение поля как значение из сервиспака, а не со слоя usr.

При этом:
- требуется сравнение кода
- требуется написание апгрейд скрипта
- требуется не забыть запустить апгрейд скрипт на всех базах аксапты (с соответствующей остановкой работы, при этом поле может быть непроиндексировано, так что на больших таблицах апдейт может занять существенное время)

Если начинать свои идентификаторы с, допустим, 100, то надо просто обновить приложение и всё
Старый 30.08.2013, 14:56   #26  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
ИМХО, топикастер не знает, что значения енумов в БД хранятся в виде целых чисел, и только в аксапте отображаются нужным тестом. Иначе не могу себе объяснить его упорство.
За это сообщение автора поблагодарили: belugin (3).
Старый 30.08.2013, 19:09   #27  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от belugin Посмотреть сообщение
Допустим мы вводим на слое usr в enum LedgerTransType со следующим по порядку значением. Наш код чего-то разносит, и в LegerTrans попадает некоторое количество записей с value 5. Если мы ставим сервис пак, в котором добавлено другое значение с тем же value, то нам надо перелопатить LedgerTrans и присвоить его полю новое значение. Елси мы этого не сделаем, то сисмеа будет интерпретировать это значение поля как значение из сервиспака, а не со слоя usr.
Зачем? Нет у вас записей в LedgerTrans с новым значением 5, вернее они есть но это старое значение 5 а не новое 5. Вам нужно сделать новое 5 числом 6.
Relation да придется исправить, но вам придется в ином случае исправлять методы Index2Symbol, и помнить про этот баг..
Я знаю что это тип int, который хранится в БД. 7 лет в аксапте достаточный срок чтобы это узнать Но само значение 5 не несет никакого абсолютно смысла, даже инициализация полей записи производиться ч/з enum, а не через его значение.
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!

Последний раз редактировалось Murlin; 30.08.2013 в 19:11.
Старый 30.08.2013, 19:50   #28  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Murlin Посмотреть сообщение
Зачем? Нет у вас записей в LedgerTrans с новым значением 5, вернее они есть но это старое значение 5 а не новое 5.
К сожалению, 5=5, поэтому система не может отличить старую пятерку от новой и придется писать апгрейд скрипт. Вы можете поставить простой эксперимент, для проверки этого равенства
Старый 02.09.2013, 17:14   #29  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от belugin Посмотреть сообщение
К сожалению, 5=5, поэтому система не может отличить старую пятерку от новой и придется писать апгрейд скрипт. Вы можете поставить простой эксперимент, для проверки этого равенства
По мойму мы вошли в цикл...
Это новая сущность какое значение 5 или 138 она будет иметь значения не имеет, кроме того что есть в relation.
Зачем нужны апгрейд скрипты? Что конкретно будет ими обновляться? Значения в таблице 5 на 6? Зачем? Новой сущности можно дать номер 6 и ничего не изменится, никаких скриптов запускать не надо.
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!
Старый 02.09.2013, 17:36   #30  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Есть ранее введенный элемент слое USR, у которого значение 5
Есть новое значение на слое SYP у которого значение 5
Для первого элемента уже введены данные со значением 5.
Я не могу поменять для нового элемента с SYP значения с 5 на 6.

Хотя в принципе, могу это перекрыть, но
- это будет отдельное изменение, за которым надо ухаживать
- надо будет при каждом апгрейде обходить все релейшены, где эта штука упомянута по value, и прочие данные

Последний раз редактировалось belugin; 02.09.2013 в 17:51.
Старый 02.09.2013, 18:16   #31  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Murlin Посмотреть сообщение
Зачем нужны апгрейд скрипты? Что конкретно будет ими обновляться? Значения в таблице 5 на 6? Зачем? Новой сущности можно дать номер 6 и ничего не изменится, никаких скриптов запускать не надо.
А исторических данных, где уже использовалось значение 5 применительно к определенной логике - нет? Если нет - то и апгрейд скриптов не нужно. А если есть - то как быть?
__________________
Возможно сделать все. Вопрос времени
Старый 03.09.2013, 08:03   #32  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от belugin Посмотреть сообщение
Есть ранее введенный элемент слое USR, у которого значение 5
Есть новое значение на слое SYP у которого значение 5
Для первого элемента уже введены данные со значением 5.
Я не могу поменять для нового элемента с SYP значения с 5 на 6.

Хотя в принципе, могу это перекрыть, но
- это будет отдельное изменение, за которым надо ухаживать
- надо будет при каждом апгрейде обходить все релейшены, где эта штука упомянута по value, и прочие данные
Так и так и так вам следить или за изменениями в коде, или за relationнами.
Что проще и что удобнее поддерживать, что удобнее заметить, исправить и тп.
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!
Старый 03.09.2013, 08:03   #33  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А исторических данных, где уже использовалось значение 5 применительно к определенной логике - нет? Если нет - то и апгрейд скриптов не нужно. А если есть - то как быть?
В аксапте вроде нету предопределенных записей как в 1Ске, откудова они возьмутся
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!
Старый 03.09.2013, 08:17   #34  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Murlin Посмотреть сообщение
Так и так и так вам следить или за изменениями в коде, или за relationнами.
Что проще и что удобнее поддерживать, что удобнее заметить, исправить и тп.
Угу. И за изменениями в данных. Например, демоданные уже на такое не закачаешь .
По всему комплексу проще работать в своем диапазоне.
Старый 03.09.2013, 10:03   #35  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Murlin Посмотреть сообщение
В аксапте вроде нету предопределенных записей как в 1Ске, откудова они возьмутся
Ээээ а у Вас нет рабочей Аксапты? Вот в ней и все записи и есть предопределенные
__________________
Возможно сделать все. Вопрос времени
Старый 03.09.2013, 10:19   #36  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А если есть - то как быть?
В этой ветке Murlin предлагает в случае конфликта своего элемента перечисления и нового системного, вместо обновления старых значений в БД, переопределить номер нового системного элемента перечисления.

Почему так делать опасно уже здесь написали, но видимо недостаточно убедительно

Последний раз редактировалось S.Kuskov; 03.09.2013 в 10:21.
Старый 03.09.2013, 11:10   #37  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В этой ветке Murlin предлагает в случае конфликта своего элемента перечисления и нового системного вместо обновления старых значений в БД, переопределить номер нового системного элемента перечисления.

Почему так делать опасно уже здесь написали, но видимо недостаточно убедительно
Ааа.... возможно я не так понял. Тогда да, апгрейд-скрипты конечно не нужны и проблемы только в коде. Хотя останется 2 проблемы:
1. Ситуация со знаками > и < (я про это писал) при сравнении значений енумов
2. Ситуация, когда вместо перечисления конкретных значений енума - указывается отрицание оставшихся значений. Ну, к примеру, можно написать:
X++:
switch (x)
{
      case 1,2,3:
..................
      default: 
}
А можно написать так:
X++:
if (x !=4)
Но это все проблемы именно анализа кода, а не данных.
Предопределенные данные могут возникать тогда, когда эти данные выпускает сам МС. Например, шаблоны отчетов для генератора финотчетности (ГФО). Тут конечно нельзя так просто отбросить именно МС-овские енумы.

Также тут надо понимать масштабы обновлений. Одно дело сервис-пак, который вообще могут не ставить, а только вытащить отдельные нужные куски.
Другое дело - апгрейд на новую версию. В новой версии - значения енумов скорее всего сохранятся. И там уже так просто не перебьешь.
И еще момент - с т.з. сравнения элементов в АОТе - удобнее, когда мало объектов, которые расположены на слое от МСа и на своем слое. В этом плане - проще не МСный код править (для исправления значения енума), а свой, чтобы не увеличивать количество объектов, расположенных на нескольких слоях.

Так что если не смотреть вперед на обновление версий - то, в общем-то вариант, когда при конфликте значений берется значение не от МС - вполне жизнеспособен.
__________________
Возможно сделать все. Вопрос времени
Старый 03.09.2013, 11:21   #38  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
2. Ситуация, когда вместо перечисления конкретных значений енума - указывается отрицание оставшихся значений.
Эмм... не понял вас. Я вижу проблему при любом использовании числового значения элемента перечисления вместо его имени.
Старый 03.09.2013, 12:40   #39  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Эмм... не понял вас. Я вижу проблему при любом использовании числового значения элемента перечисления вместо его имени.
Не... я тут имел в виду общую проблему, которая в принципе возникает при любом добавлении нового элемента енума. Это не относится к числовому представлению.

Пример (АХ 2009):
Тип партнера договора (RContractPartnerType). Штатно этот енум имеет 2 значения: Клиент и Поставщик (будем считать, что у нас нет слоя с зарплатой, где еще добавляется сотрудник).
В коде, который относится к обработке клиентских договоров можно встретить 2 варианта:
1.
X++:
if (rcontractTable.RContractPartnerType == RContractPartnerType::Cust)
и
2.
X++:
if (rcontractTable.RContractPartnerType != RContractPartnerType::Vend)
как вариант вот так:
X++:
if (rcontractTable.RContractPartnerType == RContractPartnerType::Cust)
{
}
else
{
}
Теперь представим себе, что мы добавляем новое значение в енум RContractPartnerType.

В зависимости от предназначения этого нового элемента - вышеуказанные конструкции нам придется подправить или возможно вообще видоизменить (например, if ... else преобразовать в switch)

Речь о явно заданных числовых значениях здесь конечно не идет. Данный пример я привел в качестве аргумента тому, что при добавлении нового значения енума придется лопатить существующий код, а вот вопрос - у кого этого кода может быть больше - у МСа в его выпущенном обновлении или в моих собственных разработках - вот этот вопрос и открыт.
Но в пользу моих доработок конечно говорит возможность не трогать мои исторические данные, в отличие от кода от МС. Хотя и закладывает мину для будущего обновления версии (если оно будет).
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 03.09.2013, 14:33   #40  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Это конечно да, но такое я бы назвал хардкодом.
Обязательно надо использовать switch-case. А по возможности разбить на подклассы, если нам это будет удобно.
X++:
static SalesFormLetter  construct(DocumentStatus    document,
                                  boolean           getParmId = true)
{
    switch(document)
    {
        case DocumentStatus::Confirmation       :   return new SalesFormLetter_Confirm           (getParmId);
        case DocumentStatus::PickingList        :   return SalesFormLetter_PickingList::construct(getParmId);
        case DocumentStatus::PackingSlip        :   return new SalesFormLetter_PackingSlip       (getParmId);
        case DocumentStatus::ProjectPackingSlip :   return new SalesFormLetter_PackingSlipProject(getParmId);
        case DocumentStatus::Invoice            :   return new SalesFormLetter_Invoice           (getParmId);
        case DocumentStatus::ProjectInvoice     :   return new SalesFormLetter_InvoiceProject    (getParmId);

        default : throw error(strfmt("@SYS19306",funcname()));
    }

    throw error(strfmt("@SYS19306",funcname()));
}
__________________
// no comments

Последний раз редактировалось dech; 03.09.2013 в 14:38.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отображение аналитик в гриде складских журналов. Баг? _scorp_ DAX: Программирование 2 25.10.2012 11:48
Баг при печати налогового кода petr DAX: Программирование 0 25.03.2009 16:33
Баг SysDataImport Logger DAX: База знаний и проекты 2 16.07.2008 15:16
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26
Баг в суммовой разнице? maxx DAX: Функционал 3 23.10.2003 18:06

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:04.