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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.05.2023, 15:17   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Достать информацию об иерархии X++ табличек из базы модели
Привет всем.

Понадобилось в Transact-SQL понять по базе модели и имени конкретной X++ таблицы, есть у нее родительская или нет.

Можно как-то это понять ?

Пока нашел только, что имя родительской таблички хранится в [ModelElementData].[Properties]
X++:
static void _upg003_Table(Args _args)
{
    void aa(boolean    _short, str s)
    {
        int         imax;
        int         i;
        str         sout;
        ;

        imax = strLen(s);

        for (i = 1; i <= imax; i += 2)
        {
            sout += num2char(hex2Int(subStr(s, i, 2)));
        }
        info(sout);

        if (_short)
        {
            return;
        }

        for (i = 1; i <= imax; i += 2)
        {
            info(con2Str([i, subStr(s, i, 2), "   ", num2char(hex2Int(subStr(s, i, 2)))]));
        }
    }
    ;
    
    // пример  сделан для CompanyInfo
    // aa(1, "100008400053005900530031003200390031003000300000004F004D004C006500670061006C0045006E00740069007400690065007300000000004C006500670061006C00200065006E00740069007400790000000000000040005300590053003100320035003000340031000000F6DD0B8C4F004D0049006E007400650072006E0061006C004F007200670061006E0069007A006100740069006F006E00000003004400610074006100410072006500610000000202800001032A0053007500720072006F0067006100740065004B006500790000004B006500790000000203420061007300690063005400610062006C0065007300000000000043006F006D00700061006E00790049006E0066006F0045007800740065006E00730069006F006E005F0043004E0000000143006F006D00700061006E00790049006E0066006F00000054006100780049006E0066006F0072006D006100740069006F006E004C006500670061006C0045006E0074006900740079005F0049004E0000000143006F006D00700061006E00790049006E0066006F0000004C00650064006700650072000000015000720069006D0061007200790046006F0072004C006500670061006C0045006E00740069007400790000004B006500790000004800000000000000");
    aa(0, "100008400053005900530031003200390031003000300000004F004D004C006500670061006C0045006E00740069007400690065007300000000004C006500670061006C00200065006E00740069007400790000000000000040005300590053003100320035003000340031000000F6DD0B8C4F004D0049006E007400650072006E0061006C004F007200670061006E0069007A006100740069006F006E00000003004400610074006100410072006500610000000202800001032A0053007500720072006F0067006100740065004B006500790000004B006500790000000203420061007300690063005400610062006C0065007300000000000043006F006D00700061006E00790049006E0066006F0045007800740065006E00730069006F006E005F0043004E0000000143006F006D00700061006E00790049006E0066006F00000054006100780049006E0066006F0072006D006100740069006F006E004C006500670061006C0045006E0074006900740079005F0049004E0000000143006F006D00700061006E00790049006E0066006F0000004C00650064006700650072000000015000720069006D0061007200790046006F0072004C006500670061006C0045006E00740069007400790000004B006500790000004800000000000000");
}
выводит
Цитата:
@SYS129100OMLegalEntitiesLegal entity@SYS125041ö݌OMInternalOrganizationDataArea€*SurrogateKeyKeyBasicTablesCompanyInfoExtension_CNCompanyInfoTaxInformationLegalEntity_INCompanyInfoLedgerPrimaryForLegalEntityKeyH
т.е. можно оттуда достать, но на Transact-SQL это неудобно разбирать.

Есть способ попроще ?

Ax2012 R3
Старый 04.05.2023, 15:47   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А в R3 наследуемые таблицы на уровне SQL сервера разве не представлены одной плоской таблицей?
Старый 04.05.2023, 17:22   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А в R3 наследуемые таблицы на уровне SQL сервера разве не представлены одной плоской таблицей?
Да, представлены.

Но вопрос был в другом. Есть скрипт на Transact-SQL который обрабатывает базу с моделью. Как он поймет, например, что для таблички CompanyInfo и идентификатором 41 корневой является табличка DirPartyTable c идентификатором
2303

(я пишу скрипт, который после изменения идентификаторов в модели пробрасывает их в бизнесбазу в табличку SqlDictionary)

Подробнее, см
Программное воссоздание записей SqlDictionary для определенной таблицы

Последний раз редактировалось Logger; 04.05.2023 в 17:38.
Старый 05.05.2023, 15:48   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Прямого способа не вижу, но есть идея, как опосредовано получить информацию. Не очень однозначно получается, но хоть что-то

Идея основана на следующих допущениях
  1. Таблица, на основании которой создали наследников, имеет поле InstanceRelationType
  2. Поля этой таблицы, которые были созданы в таблицах-наследниках, могут принимать значение Null
  3. Таблица-наследник физически не существует в базе данных

Тогда логика такая

1. Ищем все таблицы, у которых есть поле InstanceRelationType. Это таблицы, по которым были созданы таблицы-наследники

К сожалению, просто посмотреть список значений в поле InstanceRelationType - недостаточно, поскольку там записывается Id той таблицы, где запись была создана. В некоторых таблицах записи просто не создаются.

Например, в таблице OMInternalOrganization. Хотя она прямой родитель CompanyInfo, но нет ни одной записи DirPartyTable, где InstanceRelationType равно Id этой таблицы


2. Отбираем все поля, которые могут иметь значение Null

Можно просто "все" поля, но так уменьшим объемы выборки. Тут, конечно, могут "помешать" контейнерные поля, которые имеют значение Null и без наследования, но это выяснится позже


3. В базе данных модели в таблице [ModelElement] ищем записи по этим полям (по имени поля) и смотрим, какое у них значение в поле ParentId. Это будет ссылка на ту таблицу-наследник, в которой это поле было физически создано

Можно здесь сразу закончить анализ, если поле ссылаются на одну из таблиц, код которой есть в поле InstanceRelationType анализируемой таблицы-родителя


4. Из списка найденных таблиц оставляем только те, которые физически не существуют в основной базе данных. Скорее всего, в итоге останется только одна таблица, которая и является таблицей-наследником

Есть, конечно, риск совпадения имен полей в разных таблицах-наследниках, но не проверял, насколько это частое явление


Это идея. Как это реализовать в виде запросов - не проверял. Но, вроде бы, все реализуемо
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Logger (3).
Старый 06.05.2023, 10:14   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Есть скрипт на Transact-SQL который обрабатывает базу с моделью. Как он поймет, например, что для таблички CompanyInfo и идентификатором 41 корневой является табличка DirPartyTable c идентификатором 2303
Как на счет того, чтобы по аналогии с enum-ами (какая-то там таблица для SSRS) просто создать служебную таблицу с инфой об иерархии таблиц, заполнить ее из Х++, а потом обращаться из TSQL к этой таблице?
За это сообщение автора поблагодарили: Logger (5).
Старый 25.10.2024, 15:09   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Как на счет того, чтобы по аналогии с enum-ами (какая-то там таблица для SSRS) просто создать служебную таблицу с инфой об иерархии таблиц, заполнить ее из Х++, а потом обращаться из TSQL к этой таблице?
Оказывается такая таблица уже есть.
\System Documentation\Tables\SysInheritanceRelations
живет в базе с данными (там же где SqlDictionary)
Случайно наткнулся.
За это сообщение автора поблагодарили: S.Kuskov (5), Владимир Максимов (5), SRF (10).
Теги
axutil, idkeep, inheritance, modelelement, modelelementdata, sqldictionary, sysinheritancerelations, sysupgradeexportids

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2012 ускорение синхронизации базы в 3-5 раз Logger DAX: База знаний и проекты 19 05.09.2019 12:50
Генератор скриптов конвертации базы Axapta 3.0 в базу AX 2009 gl00mie DAX: Программирование 1 14.08.2011 20:05
Как удалить из базы данных информацию прошлых лет Klochkov_Valeriy DAX: Администрирование 3 22.09.2009 14:46
Как достать информацию в сплывающей подсказке miklenew DAX: Программирование 6 16.01.2009 09:21
Прогноз роста базы данных и выбор топологии системы sergeypp DAX: Администрирование 8 12.12.2006 11:26

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

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

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