In einer Baumtabelle werden unterschiedliche Knotentypen angezeigt: "Top->Node->Leaf"
Auf Blatt Ebene ist ein Enum-Attribut definiert, welches inline gespeichert wird:
**model.xml** mit Annotation für inline-Speicherung in Quelltabelle:
<reference name="art" kind="forwards" mandatory="true" navigate="true" type="TemperaturprofilArt" > <annotations> <storage-algorithm> <foreign-key-storage storage-attribute="art" storage-type="Temperaturprofil" /> </storage-algorithm> </annotations> </reference>
**meta.xml** mit Spaltendefinition zur Speicherung des Wertes:
<metaobject object_name="Temperaturprofil" super_class="GenericObject" > <reference att_name="art" by-value="true" mandatory="true" monomorphic="true" target-type="FastListElt" /> ... </metaobject>
Die Anzeige und Bearbeitung dieser Spalte funktioniert zunächst korrekt:
Problem
Ein Klick auf das Filter-Symbol führt jedoch zu einem Fehler:
2025-05-19T17:02:51,447 ERROR [qtp1700721442-120]: com.top_logic.util.error.ErrorHandlingHelper - Command 'dispatchControlCommand' failed. S(Tw3uGG5dlqewSzkWIMHv4RU05ULwRyeOPRzKEmlSPbA=) com.top_logic.util.error.TopLogicException: Internal error at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatchCommand(CommandDispatcher.java:218) at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatch(CommandDispatcher.java:134) at com.top_logic.mig.html.layout.CommandDispatcher.dispatchCommand(CommandDispatcher.java:127) at com.top_logic.base.services.simpleajax.AJAXServlet.processRequest(AJAXServlet.java:686) at com.top_logic.base.services.simpleajax.AJAXServlet.doPost(AJAXServlet.java:359) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:547) at com.top_logic.util.TopLogicServlet.doService(TopLogicServlet.java:402) at com.top_logic.util.TopLogicServlet.inContext(TopLogicServlet.java:266) at com.top_logic.util.TopLogicServlet$1.inContext(TopLogicServlet.java:334) at com.top_logic.util.TLContextManager.inInteractionInternal(TLContextManager.java:283) at com.top_logic.util.TLContextManager.inInteraction(TLContextManager.java:259) at com.top_logic.util.TopLogicServlet.enterContext(TopLogicServlet.java:329) at com.top_logic.util.TopLogicServlet.serviceWithLogMark(TopLogicServlet.java:183) at com.top_logic.util.TopLogicServlet.lambda$service$0(TopLogicServlet.java:167) at com.top_logic.util.TopLogicServlet.withSessionIdLogMark(TopLogicServlet.java:209) at com.top_logic.util.TopLogicServlet.service(TopLogicServlet.java:166) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1379) at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736) at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614) at com.top_logic.knowledge.gui.layout.HttpSecureHeaderFilter.doFilter(HttpSecureHeaderFilter.java:135) at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:208) at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1586) at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547) at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:805) at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:431) at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:571) at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:703) at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:763) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:181) at org.eclipse.jetty.server.Server.handle(Server.java:179) at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:619) at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:410) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:971) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1201) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1156) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.AssertionError: Cache contains either 'com.top_logic.dob.identifier.ObjectKey' or 'com.top_logic.dob.meta.IdentifiedObject'. at com.top_logic.knowledge.ByValueReferenceStorageImpl.getObjectKey(ByValueReferenceStorageImpl.java:169) at com.top_logic.knowledge.ByValueReferenceStorageImpl.fromCacheToApplicationValue(ByValueReferenceStorageImpl.java:79) at com.top_logic.knowledge.ByValueReferenceStorageImpl.getApplicationValue(ByValueReferenceStorageImpl.java:102) at com.top_logic.knowledge.service.db2.AbstractDBKnowledgeItem.lookupValue(AbstractDBKnowledgeItem.java:148) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getAttributeValue(DBKnowledgeItem.java:246) at com.top_logic.knowledge.service.db2.DBKnowledgeItem.getValue(DBKnowledgeItem.java:189) at com.top_logic.knowledge.service.db2.AbstractDBKnowledgeItem.getValue(AbstractDBKnowledgeItem.java:314) at com.top_logic.model.v5.ReferencePreload.loadReferenceByValue(ReferencePreload.java:130) at com.top_logic.model.v5.ReferencePreload.prepare(ReferencePreload.java:102) at com.top_logic.model.export.Preloader.internalPrepare(Preloader.java:55) at com.top_logic.model.export.Preloader.prepare(Preloader.java:50) at com.top_logic.model.export.PreloadOperation.prepare(PreloadOperation.java:40) at com.top_logic.model.export.Preloader.prepare(Preloader.java:42) at com.top_logic.element.layout.grid.AbstractTreeGridBuilder$TreeGridHandler$2.doPrepareRows(AbstractTreeGridBuilder.java:466) at com.top_logic.layout.tree.model.AbstractTreeTableModel$TreeTable.prepareRows(AbstractTreeTableModel.java:222) at com.top_logic.layout.table.TableViewModel.internalRevalidateMatchCount(TableViewModel.java:2891) at com.top_logic.layout.table.TableViewModel.addToOpenFilters(TableViewModel.java:2611) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.openTableFilter(TableControl.java:1561) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.openTableFilter(TableControl.java:1552) at com.top_logic.layout.table.control.TableControl$OpenFilterDialogAction.executeChecked(TableControl.java:1547) at com.top_logic.layout.table.control.TableControl$CheckedTableCommand.execute(TableControl.java:1377) at com.top_logic.layout.table.control.TableControl$TableCommand.execute(TableControl.java:1327) at com.top_logic.layout.basic.AbstractControlBase.executeCommand(AbstractControlBase.java:981) at com.top_logic.layout.basic.component.ControlSupport.executeCommand(ControlSupport.java:223) at com.top_logic.layout.basic.component.ControlComponent$DispatchAction.handleCommand(ControlComponent.java:233) at com.top_logic.tool.boundsec.CommandHandlerUtil.handleCommand(CommandHandlerUtil.java:31) at com.top_logic.mig.html.layout.LayoutComponent.dispatchCommand(LayoutComponent.java:3063) at com.top_logic.mig.html.layout.CommandDispatcher.internalDispatchCommand(CommandDispatcher.java:196) ... 40 more
Offenbar wird dabei versucht (Ermittlung tatsächlich vorhandener Werte?), dieses Attribut von einem übergeordneten Zeilenobjekt zu lesen, dass dieses Attribut (insbesondere dessen Speichervorschrift) nicht definiert.
Workaround
Anstatt die Attributspalte anzuzeigen, diese Spalte nochmal als berechnete Spalte konfigurieren. Wertermittlung und Speichervorschrift für den entsprechenden Zeilentyp implementieren und die Spalte für die anderen Typen als read-only deklarieren.