05.11.2009, 10:32 | #1 |
Сам.AX
|
Нет доступа к свойству ConfigurationKey (ax2009sp1)
Добрый день.
Столкнулись с проблемой, когда попытлись изменить конфигурационные ключи на таблицы. Свойство ConfigurationKey закрыто для редактирования. Права администратора. В чем может быть причина. Спасибо. ax2009 sp1
__________________
Возьми свет! |
|
05.11.2009, 10:50 | #2 |
Боец
|
Это вроде простой глюк IDE. Перезаходить в DAX пробовали?
|
|
05.11.2009, 11:02 | #3 |
Сам.AX
|
Пробовал. Даже АОС на всякий случай перезапускал. Нет доступа. Что интересно.. на поля таблиц свойсво активно, а на саму таблицу неактивно.
__________________
Возьми свет! |
|
05.11.2009, 11:10 | #4 |
Участник
|
Лицензия
А есть ли лицензия на данный конфигурационный ключ?
__________________
Sergey Nefedov |
|
05.11.2009, 11:16 | #5 |
Сам.AX
|
__________________
Возьми свет! |
|
05.11.2009, 11:17 | #6 |
Участник
|
Тоже самое поведение наблюдаю у себя. Причём проявляется только у таблиц созданных на слое, где разработка уже недоступна. Что это? защита конфигурации? Тогда она легко обходится правкой xpo перед загрузкой
|
|
05.11.2009, 11:26 | #7 |
Сам.AX
|
Неа. Проблема то в том, что на GLS слое значение свойства таблицы CRSERussia (это правильно), на нашем USR слое стоит старый ключ CRSECIS и не меняется никак.
__________________
Возьми свет! |
|
05.11.2009, 11:30 | #8 |
Участник
|
Ну так я про это и говорю. Таблица принадлежит слою GLS. А править ConfigurationKey вы хотите на USR. И вот почему-то в AX2009 такое делать запретили. . Но через xpo всё попрежнему заливается
Последний раз редактировалось S.Kuskov; 05.11.2009 в 11:33. |
|
05.11.2009, 11:35 | #9 |
Сам.AX
|
Это достоверная информация?
__________________
Возьми свет! |
|
05.11.2009, 11:47 | #10 |
Участник
|
Видимо это св-во для таблиц сделали readOnly, сам проверил на DAX 2009 sp1, тоже нельзя менять данное св-во.
Поэтому придется это делать как-нибудь по другому, либо, как предложил S.Kuskov, поправить в файлике проекта св-во configurationKey с CRSECIS на CRSERussia у данной таблички и залить проект, либо job'ом (примерный код ниже): X++: static void change_configurationKey(Args _args) { TreeNode d = SysDictTable::newTableId(tableNum(RassetTable)).treeNode(); str newKey = configurationKeyStr(AIF); ; d.AOTsetProperties(Global::setProperty(d.AOTgetProperties(), 'ConfigurationKey', newKey)); d.AOTsave(); d.AOTcompile(); }
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: gl00mie (5), S.Kuskov (1), Alexx7 (1). |
05.11.2009, 11:48 | #11 |
Участник
|
Запретили, так как иначе смысла в конфигурационных ключах большого нет - даже не покупая лицензии на модуль, можно (при наличии лицензии на разработку) изменить конфигурационные ключи на всех элементах этого модуля и пользоваться им, не отчисляя за это деньги Майкрософт.
P.S. Это мое личное предположение |
|
05.11.2009, 12:06 | #12 |
Боец
|
Цитата:
Сообщение от kashperuk
Запретили, так как иначе смысла в конфигурационных ключах большого нет - даже не покупая лицензии на модуль, можно (при наличии лицензии на разработку) изменить конфигурационные ключи на всех элементах этого модуля и пользоваться им, не отчисляя за это деньги Майкрософт.
P.S. Это мое личное предположение Подозреваю, что следующий код предоставит доступ к модулю RAsset без необходимости в лицензировании X++: static void clearRAssetLicense(Args _args) { TreeNode treeNode; str properties; ; #Properties treeNode = TreeNode::findNode(@"\Data Dictionary\Configuration Keys\RAsset"); if (treeNode) { properties = treeNode.AOTgetProperties(); properties = setProperty(properties, #PropertyLicensecode, ""); treeNode.AOTsetProperties(properties); treeNode.AOTsave(); } } |
|
05.11.2009, 12:20 | #13 |
Участник
|
Цитата:
Точно так же, как в другом программном обеспечении есть дырки, через которые пираты взламывают их. Доля тех, кто знает об этом и воспользуется - довольно мала. И видимо она меньше, чем усилия, которые придется потратить на борьбу с этим. |
|
04.01.2011, 04:33 | #14 |
Участник
|
На базе приведенного примера сделал джобик, который позволяет "поднять" конфигурационный ключ на таблицах с нижележащего слоя, если на текущем слое он после обновления или еще каких действий получился "неправильный". В режиме проверки (если на вопрос "изменять конф. ключи" ответить "Нет") только выводит информацию о найденных расхождениях. Если прописываемый ключ оказался выключенным, а прежний - включенным, выводится предупреждение и запрашивается дополнительное подтверждение. Но в любом случае до синхронизации изменения не вступят в силу.
X++: #macrolib.Properties static void ChangeConfigurationKey(Args _args) { UtilElements ueCurrLayer; UtilElements uePrevLayer; CheckFix modeCheckFix; Counter nChanged; Counter nFound; boolean tryChangeConfigKey4Table(UtilElements _ue, UtilEntryLevel _prevLayer) { SysInfoAction infoAction; TreeNode tnCurr; TreeNode tnPrev; configurationkeyid currKeyId; configurationkeyid prevKeyId; str currKeyName; str prevKeyName; str warnMsg; boolean isConfirmed; boolean ret; ; setprefix( strfmt( "@SYS55826", _ue.name ) ); if (_ue.utilLevel <= _prevLayer) { throw error( Error::wrongUseOfFunction( funcname() ) ); } tnCurr = xUtilElements::getNode( _ue ); if (tnCurr) { tnPrev = tnCurr.getNodeInLayer( _prevLayer, false ); } if (tnPrev) { currKeyName = findProperty( tnCurr.AOTgetProperties(), #PropertyConfigurationkey ); prevKeyName = findProperty( tnPrev.AOTgetProperties(), #PropertyConfigurationkey ); if (currKeyName != prevKeyName) { infoAction = new SysInfoAction_Properties( tnCurr.treeNodePath() ); info( strfmt( @"Конф.ключ на %1 (%2) отличается от %3 (%4)", tnCurr.applObjectLayer(), currKeyName, _prevLayer, prevKeyName ), '', infoAction ); currKeyId = configurationkeyname2id( currKeyName ); prevKeyId = configurationkeyname2id( prevKeyName ); isConfirmed = modeCheckFix == CheckFix::Fix; if ( !isConfigurationKeyEnabled( prevKeyId ) && isConfigurationKeyEnabled( currKeyId ) ) { warnMsg = strfmt( @"Конфигурационный ключ %1 выключен, изменения могут привести к потере данных", prevKeyName ); if (modeCheckFix == CheckFix::Fix) { isConfirmed = Box::yesNo( warnMsg + @". Все равно изменить?", DialogButton::No, "@SYS866" ) == DialogButton::Yes; } else { warning( warnMsg ); } } if (isConfirmed) { tnCurr.AOTsetProperties( setProperty( tnCurr.AOTgetProperties(), #PropertyConfigurationkey, prevKeyName ) ); tnCurr.AOTsave(); tnCurr.AOTcompile(); info( prevKeyName ? strfmt( @"Ключ изменен на %1", prevKeyName ) : @"Ключ удален" ); ret = true; } } } return ret; } ; setprefix( @"Перебивка конфигурационных ключей на таблицах" ); switch (Box::yesNoCancel( @"Изменять конфигурационные ключи?", DialogButton::No )) { case DialogButton::Yes : modeCheckFix = CheckFix::Fix; break; case DialogButton::Cancel : error( "@SYS18738" ); return; default : break; } while select ueCurrLayer where ueCurrLayer.utilLevel == currentAOLayer() && ueCurrLayer.recordType == UtilElementType::Table { select firstonly reverse utilLevel, RecId from uePrevLayer order by utilLevel where uePrevLayer.name == ueCurrLayer.name && uePrevLayer.recordType == ueCurrLayer.recordType && uePrevLayer.utilLevel < ueCurrLayer.utilLevel ; if (uePrevLayer) { nFound++; if (tryChangeConfigKey4Table( ueCurrLayer, uePrevLayer.utilLevel )) { nChanged++; } } } info( strfmt( @"Обработано таблиц: %1, изменено %2", nFound, nChanged ) ); } |
|
04.01.2011, 12:08 | #15 |
Боец
|
Товарищи!
Пригласите кто gl00mie в гости, выпейте с ним за новый год, а то он своими новогодними джобиками кому-нибудь мозг сломает... |
|
|
За это сообщение автора поблагодарили: sukhanchik (1). |
04.01.2011, 15:33 | #16 |
Гость
|
|
|
Теги |
ax2009, законченный пример, конфигурационный ключ, таблица |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|