27.10.2021, 17:52 | #1 |
Участник
|
Странный код в построении перекрестных ссылок
Всем привет!
Когда стал в выборочном режиме строить перекрестные ссылки, полезли ошибки. Поиск корней ошибок привел к такому вот коду, в классе xRefUpdate метод utilElementsToBexRefedInsert. А конкретно sysDictTable = new SysDictTable(tablename2id(_utilElements.Name)) X++: case UtilElementType::TableInstanceMethod, // table method can be xreffed individually; but skip it, if the complete table are xreffed. UtilElementType::TableStaticMethod: sysDictTable = new SysDictTable(tablename2id(_utilElements.Name)); if (sysDictTable) { select utilElementsToBexRefed where utilElementsToBexRefed.RecordType == sysDictTable.utilElementType() && utilElementsToBexRefed.Id == tablename2id(_utilElements.Name); if (!utilElementsToBexRefed) { utilElementsToBexRefed.clear(); utilElementsToBexRefed.RecordType = sysDictTable.utilElementType(); utilElementsToBexRefed.ParentId = _utilElements.ParentId; utilElementsToBexRefed.Name = _utilElements.Name; utilElementsToBexRefed.insert(); } break; } Кто-то сталкивался с этим? Непонятно, или это ошибка, или какая-то неведомая задумка. Ведь при таком типе элемента, в поле _utilElements.Name будет имя метода. И тогда теряется какой-либо смысл в выражении tablename2id(_utilElements.Name). Т.е. это поиск кода таблицы через имя ее метода. Ну ладно когда это не сработало, тогда код просто пропускается. Но хуже когда имя метода совпадает с какой-то таблицей. Например, у меня было так - таблица CustSettlement имеет метод custVendTrans. При обработке в этом участке кода по имени custVendTrans, SysDictTable замечательным образом инициализируется по мапу CustVendTrans. В итоге дальше в utilElementsToBexRefed пишется полная ересь - имя custVendTrans, parentId - от CustSettlement, но тип записи - TableMap. Пока склоняюсь что это ошибка. Возможно, по логике следовало бы записать: sysDictTable = new SysDictTable(_utilElements.ParentId)); Подскажите, было ли что-то на эту тему? Код давний очень, аж на 4-ке есть. Наверняка за долгое время у кого-то тоже должно было проявиться |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
28.10.2021, 08:03 | #2 |
Участник
|
У нас свой инкрементный сборщик ссылок.
Поэтому не сталкивались. Вы же можете провести простой тест своих предположений. Пройти все с отладчиком. Это недолго. |
|
|
За это сообщение автора поблагодарили: FrolovAndy (2). |
28.10.2021, 10:07 | #3 |
Участник
|
а как, собственно, ошибку получить?
при полном перестроении перекрестных вроде всё ОК работает |
|
28.10.2021, 11:20 | #4 |
Участник
|
Цитата:
При полном перестроении тот код вообще не задействуется |
|
28.10.2021, 11:24 | #5 |
Участник
|
Цитата:
Поэтому остается небольшой процент предположения, что это я не понял какую-то хитрую задумку в этом коде Но вообще да, идея хорошая, также сделать свой сервис по ссылкам, и тогда вопрос об этой ошибке перейдет исключительно в разряд "из любопытства" |
|
28.10.2021, 11:38 | #6 |
Участник
|
Сейчас посмотрел на этот метод. Там такая же непонятная логика и для методов класса.
X++: case UtilElementType::ClassStaticMethod, UtilElementType::ClassInstanceMethod: select utilElementsToBexRefed where utilElementsToBexRefed.RecordType == UtilElementType::Class && utilElementsToBexRefed.Id == className2Id(_utilElements.Name); X++: case UtilElementType::TableMap, // these table childs can't be xreffed individually, so the table has to be xreffed. UtilElementType::TableIndex, UtilElementType::TableRelation, UtilElementType::TableFieldGroup, UtilElementType::TableField: sysDictTable = new SysDictTable(tablename2id(_utilElements.Name)); Последний раз редактировалось S.Kuskov; 28.10.2021 в 11:43. |
|
|
За это сообщение автора поблагодарили: FrolovAndy (1). |
28.10.2021, 12:24 | #7 |
Участник
|
Если я правильно понял, то метод
\Classes\xRefUpdate\utilElementsToBexRefedInsert Это подготовка списка объектов, для которых планируется выполнить обновление перекрестных ссылок. Метод - это не объект. Поэтому нужно указать таблицу. Вопрос в том, какую именно? По логике, вроде бы, надо именно ту таблицу, к которой этот метод относится. Т.е. действительно "опечатка" Та же самая проблема и дальше в этом методе - TableIndex, TableRelation, TableFieldGroup, TableField - ClassStaticMethod Поиск родителя по имени вложенного объекта. Скорее всего, ничего не найдет или найдет не тот объект, для которого нужно обновлять перекрестные ссылки Вообще говоря, в комментариях же написано, что это все - перестраховка. На случай, если предполагается обновление перекрестных ссылок по одному конкретному методу. Без обновления перекрестных ссылок по самой таблице. Вот я сильно сомневаюсь, что кто-то так делает. Скорее всего, обновление будет по самой таблице, где все это находится и в этом случае в данную ветку кода не попадем Т.е. формально - да, ошибка. Но фактически, проявляется эта ошибка в очень специфической ситуации.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: FrolovAndy (2). |
28.10.2021, 12:44 | #8 |
Участник
|
Вот то что копипаста - да, очень похоже на это. Если весь метод смотреть, похоже не глядя наставили
Ну и тоже верно, что ошибка актуальна только если перестраивать отдельные элементы, а не родительские Думаю, что тогда нет смысла что-то править, а оставить в запросе только типы записей элементов верхнего уровня, а все дочерние пропустить |
|
Теги |
перекрестные ссылки |
|
|