|
|
#6 |
|
Участник
|
Я в свое время столкнулся с тем, что buffer.TableId для таблиц, использующих наследование, зачастую возвращает идентификатор не совсем той таблицы, к которой относится буфер. Вместо этого обычно возвращается идентификатор одной из родительских таблиц, явно фигурирующих в коде во время компиляции - см. также А что такого принципиального в 2012? По моему хороший разработчик без труда в ней разберется
Нужную информацию содержит поле buffer.RelationType, но тут есть нюанс: в интерпретаторе Х++ обращение к этому полю безопасно даже для Common, а вот при генерации CIL это приводит к ошибке компиляции. Более безопасным оказалось вызывать buffer.getInstanceRelationType() - он возвращает название конкретной таблицы-наследника либо пустую строку, если таблица не входит в иерархию наследования. В итоге для определения во время выполнения "настоящего" типа табличного буфера с учетом возможного наследования получился такой вспомогательный метод:X++: // возвращает tableId таблицы либо, если таблица поддерживает наследование, то tableId конкретного "наследника" // safe тут относится к генерации кода CIL, которая валится на простом обращении к Common.RelationType public static TableId getTableIdOrReltaionTypeSafe(Common _record) { TableNameShort tableName = _record.getInstanceRelationType(); TableId ret = tableName2id(tableName); ; if (!ret) { ret = _record.TableId; } return ret; } |
|
|
|
| За это сообщение автора поблагодарили: AlGol (3), raz (10), sukhanchik (8), Logger (8). | |