|
30.08.2017, 19:41 | #1 |
Участник
|
Найти Table Relation для заданного поля таблицы
АХ 7
Допустим у меня есть TableId и FieldId, где FieldId - это поле на таблице с TableId Это поле - foreign key на другую таблицу, и для этой связи существует Table relation на таблице с TableId Как мне это определить наиболее оптимальным способом? В смысле понять, есть такой relation, или нету |
|
30.08.2017, 19:55 | #2 |
Участник
|
Цитата:
и не уверен, что для акс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]]); } Последний раз редактировалось mazzy; 30.08.2017 в 20:04. |
|
|
За это сообщение автора поблагодарили: Vadik (1), Logger (3), macklakov (3), kashperuk (2), axotnik88 (1). |
30.08.2017, 23:28 | #3 |
Участник
|
Цитата:
А если применить такой подход Открыть в новом окне объект из кода то может можно обойтись и без построенных перекрестных ссылок вообще ? Для Relations я сам не пробовал но можно попытаться. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
31.08.2017, 02:56 | #4 |
Участник
|
Цитата:
Хотелось что-то более "изящное", наподобие DictField.relationObject(), чтобы сразу получить требуемое каким-то образом. Все равно, спасибо, видимо таки придется перебирать.. |
|
31.08.2017, 07:47 | #5 |
Участник
|
Цитата:
там рилейшенов вряд ли будет больше десятка-двух. поэтому я бы не называл это "полным перебором". да, других способов не знаю. |
|
31.08.2017, 10:13 | #7 |
Участник
|
То, что нужно! Спасибо!
|
|
31.08.2017, 10:55 | #8 |
Участник
|
Хороший способ.
Правда есть вопрос что нужно - найти тот конкретный relation который заюзает ядро для заданного буфера или найти все возможные Relation с этим полем для произвольной записи. Если второе то наверно только полный перебор. |
|
Теги |
dicttable, reflection, relation |
|
|