|  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 | 
|  | 
| 
 |