02.04.2009, 17:50 | #1 |
Участник
|
Принадлежность АОТ объекта к лицензированному модулю. (Программно)
Всем здравствуйте,
если кто-нибудь сталкивался с задачей: как можно программно определить имеется-ли лицензия на опрделенный объект в AOT (принадлежность к модулю, на который имеется лицензия). Буду очень признателен за совет. |
|
02.04.2009, 18:10 | #2 |
Administrator
|
Модуль - понятие - больше интерфейсное, нежели программное. Откройте форму Подотчетные лица из модуля Расчеты с Поставщиками. Откройте форму Сотрудник из модуля CRM. Откройте форму Сотрудник из модуля Управление персоналом.
Все это - одна и таже таблица EmplTable. Вопрос - у Вас есть есть лицензия на модуль Расчеты с поставщиками, но нет лицензии на CRM - у Вас есть лицензия на таблицу EmplTable? И к какому модулю она принадлежит? Тем не менее - существует следующая информация: Есть лицензия (License Code), к ней привязаны конфигурационные ключи (Configuration Keys). К таблицам (в т.ч. к полям) и пунктам меню обычно привязываются конфигурационные ключи. Соответственно - если он включен - доступ к функциональности есть (в частности - есть физически таблица и поле в БД).
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2), Dima_Dima (1). |
02.04.2009, 18:18 | #3 |
Участник
|
Цитата:
Да можно, но не ко всем объектам. Есть объекты, у которые в свойствах есть ссылка на конфигурационный ключ. Для таких объектов все просто - надо посмотреть в свойство. Это все объекты внутри ветки Data Dictionary, это menuItems, menu и т.п. Но есть объекты, которые не зависят от конфигурации/лицензии. Это классы, формы(!), отчеты(!), query и т.п. для таких объектов можно попытаться найти какую-то закономерность по перекрестным ссылкам. У меня получалось привязать классы/формы/отчеты к лицензии в 70% случаев по перекерестным ссылкам в ax4.0 Но в общем случае это не решаемая задача. |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
02.04.2009, 18:19 | #4 |
Участник
|
Цитата:
Сообщение от sukhanchik
Тем не менее - существует следующая информация:
Есть лицензия (License Code), к ней привязаны конфигурационные ключи (Configuration Keys). К таблицам (в т.ч. к полям) и пунктам меню обычно привязываются конфигурационные ключи. Соответственно - если он включен - доступ к функциональности есть (в частности - есть физически таблица и поле в БД). |
|
02.04.2009, 18:56 | #5 |
Участник
|
Спасибо за быструю реакцию.
Значит, если у объекта есть запись в Properties --> Configuration Key, это значит что он лицензирован? |
|
02.04.2009, 18:59 | #6 |
Участник
|
Цитата:
Дальше надо смотреть какой лицензии принадлежит конфигурационный ключ и включена ли лицензия. |
|
03.04.2009, 08:37 | #7 |
MCTS
|
Цитата:
как можно программно определить имеется-ли лицензия на опрделенный объект в AOT (принадлежность к модулю, на который имеется лицензия).
Если конфигурационный ключ не имеет лиц. кода, то считается, что лицензия есть. Таким образом, чтобы посмотреть имеет ли лицензия на объект, надо рекурсивно пробежаться по конф. ключам, и у родительского посмотреть, есть ли лицензия. Пример для таблиц (для другого типа, просто меняем первую строку на нужный тип объекта): X++: DictTable dictObject = new DictTable(tablenum(SmmBusRelTable)); SysDictLicenseCode SysDictLicenseCode; ConfigurationKeyId getParentCKId(ConfigurationKeyId _keyid) { ConfigurationKeyId ret; DictConfigurationKey key; ; key = new DictConfigurationKey(_keyId); if (key.parentConfigurationKeyId()) ret = getParentCKId(key.parentConfigurationKeyId()); else ret = _keyId; return ret; } ; if (dictObject.configurationKeyId()) { sysdictLicenseCode = new SysDictLicenseCode( new DictConfigurationKey(getParentCKId(dictObject.configurationKeyId())).licenseCode()); info(strfmt("%1", sysDictLicenseCode.isEntered())); } else info("true"); смотрим включен ли конфигурационный ключ. Для конфигурационных ключей с выключенными лицензионнами кодами конф. ключ будет выключен, причем независимо от соответствующего свойства, выставленного для него в АОТе. Последний раз редактировалось Eldar9x; 03.04.2009 в 09:33. |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
03.04.2009, 12:01 | #8 |
Участник
|
Цитата:
Сообщение от Eldar9x
Почти каждый объект имеет конфигурационный ключ. Если не имеет, то считается, что лицензия есть.
Если конфигурационный ключ не имеет лиц. кода, то считается, что лицензия есть. Таким образом, чтобы посмотреть имеет ли лицензия на объект, надо рекурсивно пробежаться по конф. ключам, и у родительского посмотреть, есть ли лицензия. Пример для таблиц (для другого типа, просто меняем первую строку на нужный тип объекта): X++: DictTable dictObject = new DictTable(tablenum(SmmBusRelTable)); SysDictLicenseCode SysDictLicenseCode; ConfigurationKeyId getParentCKId(ConfigurationKeyId _keyid) { ConfigurationKeyId ret; DictConfigurationKey key; ; key = new DictConfigurationKey(_keyId); if (key.parentConfigurationKeyId()) ret = getParentCKId(key.parentConfigurationKeyId()); else ret = _keyId; return ret; } ; if (dictObject.configurationKeyId()) { sysdictLicenseCode = new SysDictLicenseCode( new DictConfigurationKey(getParentCKId(dictObject.configurationKeyId())).licenseCode()); info(strfmt("%1", sysDictLicenseCode.isEntered())); } else info("true"); смотрим включен ли конфигурационный ключ. Для конфигурационных ключей с выключенными лицензионнами кодами конф. ключ будет выключен, причем независимо от соответствующего свойства, выставленного для него в АОТе. Просто класс !!! Спасибо за помощь. |
|
07.04.2009, 11:17 | #9 |
Участник
|
Добрый день.
У меня ещё вопрос: если я хочу узнать лицензираван ли какой-либо MenuItem, как мне узнать ConfigurationKeyId этого MenuItem. У класса MenuItem такой методы нет. Спасибо. |
|
07.04.2009, 11:36 | #10 |
Administrator
|
Из кода?
X++: static void showConfigurationKey(Args _args) { ; info(configurationkeyId2Name(new MenuFunction(menuitemdisplaystr(LedgerTable), MenuItemType::Display).configurationKey())); info(configurationkeyId2PName(new MenuFunction(menuitemdisplaystr(LedgerTable), MenuItemType::Display).configurationKey())); }
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
07.04.2009, 11:59 | #11 |
MCTS
|
Еще вариант
X++: XInfo xInfo = new XInfo(); Object obj; SysDictLicenseCode SysDictLicenseCode; DictConfigurationKey dictConfigKey; ConfigurationKeyId getParentCKId(ConfigurationKeyId _keyid) { ConfigurationKeyId ret; DictConfigurationKey key; ; key = new DictConfigurationKey(_keyId); if (key.parentConfigurationKeyId()) ret = getParentCKId(key.parentConfigurationKeyId()); else ret = _keyId; return ret; } ; obj = xInfo.rootNode(); obj = obj.AOTfindChild('Menu Items'); obj = obj.AOTfindChild('Display'); obj = obj.AOTfindChild('smmActivities'); if (obj.ConfigurationKey()) { dictConfigKey = new DictConfigurationKey( getParentCKId(obj.ConfigurationKey()) ); if (dictConfigKey.licenseCode()) { sysdictLicenseCode = new SysDictLicenseCode(dictConfigKey.licenseCode()); if (sysDictLicenseCode) info(strfmt("%1", sysDictLicenseCode.isEntered())); } else info("true"); } else info("true"); |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |