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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.08.2017, 19:41   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Найти Table Relation для заданного поля таблицы
АХ 7

Допустим у меня есть TableId и FieldId, где FieldId - это поле на таблице с TableId
Это поле - foreign key на другую таблицу, и для этой связи существует Table relation на таблице с TableId

Как мне это определить наиболее оптимальным способом?

В смысле понять, есть такой relation, или нету
Старый 30.08.2017, 19:55   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Допустим у меня есть TableId и FieldId, где FieldId - это поле на таблице с TableId
Это поле - foreign key на другую таблицу, и для этой связи существует Table relation на таблице с TableId

Как мне это определить наиболее оптимальным способом?
я не знаю оптимального способа.
и не уверен, что для акс7 DictTable и DictField - правильные способы.

я знаю два способа:
1. через перекрестные ссылки
(могут содержать не актуальную и не полную информацию. зато запрос прямой как палка)

2. через DictTable, DictField
вот кусок кода для акс7 из моего пока приватного проекта по созданию ER-диаграм и dgml-диаграм.
этот кусок почти без изменений подойдет для любой версии.

X++:
            SysDictTable dt = new SysDictTable(TableId);

...

            //------ relations
            SetEnumerator dre = dt.relations().getEnumerator();
            while (dre.moveNext())
            {
                SysDictRelation dr = dre.current();
                var member = dr.externTableName();
                container ThisKey = conNull();
                container OtherKey = conNull();

                for(int l=1; l<=dr.lines(); l++)
                {
                    try
                    {
                        var ThisKeyId = dr.lineTableValue(l);
                        var ThisKeyField = new SysDictField(dt.id(), ThisKeyId);
                        var ThisKeyName = ThisKeyField ? ThisKeyField.name() : strFmt("%1", ThisKeyId);
                        ThisKey += ThisKeyName;

                        Var OtherKeyId = dr.lineExternTableValue(l);
                        var OtherKeyField = new SysDictField(dr.externTable(), OtherKeyId);
                        var OtherKeyName = OtherKeyField ? OtherKeyField.name() : strFmt("%1", OtherKeyId);
                        OtherKey += OtherKeyName;
                    }
                    catch
                    {
                        exceptionTextFallThrough();
                    }
                }
                if( ThisKey && OtherKey )
                {
                    this.appendNewXML(xmlType, 'Association', [
                        ['Name', dr.name()],
                        ['Member' , member],
                        ['ThisKey', con2Str(ThisKey, ',')],
                        ['OtherKey', con2Str(OtherKey, ',')],
                        ['IsForeignKey', 'true'],
                        ['Type', member]]);
                }
Миниатюры
Нажмите на изображение для увеличения
Название: ax7tables.png
Просмотров: 482
Размер:	113.5 Кб
ID:	11618  
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 30.08.2017 в 20:04.
За это сообщение автора поблагодарили: Vadik (1), Logger (3), macklakov (3), kashperuk (2), axotnik88 (1).
Старый 30.08.2017, 23:28   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
я знаю два способа:
1. через перекрестные ссылки
(могут содержать не актуальную и не полную информацию. зато запрос прямой как палка)
Прикольно.

А если применить такой подход
Открыть в новом окне объект из кода
то может можно обойтись и без построенных перекрестных ссылок вообще ?

Для Relations я сам не пробовал но можно попытаться.
За это сообщение автора поблагодарили: mazzy (2).
Старый 31.08.2017, 02:56   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от mazzy Посмотреть сообщение
2. через DictTable, DictField
вот кусок кода для акс7 из моего пока приватного проекта по созданию ER-диаграм и dgml-диаграм.
этот кусок почти без изменений подойдет для любой версии.
Да, полным перебором оно то понятно, что можно.
Хотелось что-то более "изящное", наподобие DictField.relationObject(), чтобы сразу получить требуемое каким-то образом.

Все равно, спасибо, видимо таки придется перебирать..
Старый 31.08.2017, 07:47   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Да, полным перебором оно то понятно, что можно.
Хотелось что-то более "изящное", наподобие DictField.relationObject(), чтобы сразу получить требуемое каким-то образом.

Все равно, спасибо, видимо таки придется перебирать..
ну... здесь перебор внутри одной таблицы.
там рилейшенов вряд ли будет больше десятка-двух.

поэтому я бы не называл это "полным перебором".

да, других способов не знаю.
__________________
полезное на axForum, github, vk, coub.
Старый 31.08.2017, 09:14   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Да, полным перебором оно то понятно, что можно.
Хотелось что-то более "изящное", наподобие DictField.relationObject(), чтобы сразу получить требуемое каким-то образом.

Все равно, спасибо, видимо таки придется перебирать..
Может
X++:
new DictRelation(tableId).loadFieldRelation(fieldId)
За это сообщение автора поблагодарили: mazzy (5), kashperuk (20), trud (3), Vadik (5), Logger (3), axotnik88 (1).
Старый 31.08.2017, 10:13   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от skuull Посмотреть сообщение
Может
X++:
new DictRelation(tableId).loadFieldRelation(fieldId)
То, что нужно! Спасибо!
Старый 31.08.2017, 10:55   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от skuull Посмотреть сообщение
Может
X++:
new DictRelation(tableId).loadFieldRelation(fieldId)
Хороший способ.
Правда есть вопрос что нужно - найти тот конкретный relation который заюзает ядро для заданного буфера или найти все возможные Relation с этим полем для произвольной записи. Если второе то наверно только полный перебор.
Теги
dicttable, reflection, relation

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно отобразить значение поля таблицы Skolos DAX: Программирование 12 25.02.2016 21:30
How to add a new relation on a table from code Blog bot DAX Blogs 0 14.09.2014 04:56
emeadaxsupport: The 'view details' feature will not work on an EDT field when the field has a relation defined in the 'table references' subnode. Blog bot DAX Blogs 0 26.01.2013 02:14
Каким образом выцепить айдишку или текстовую репрезентацию EDT поля таблицы. HorrR DAX: Программирование 8 18.02.2008 15:45
Как добраться до поля таблицы? Sergioso DAX: Программирование 4 20.01.2005 15:39

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

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

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