Wie wendet man transiente Attribute mit Funktionen korrekt an?

Als transient (vorübergehend, nicht dauerhaft) werden Attribute bezeichnet, die in einer Transferdatei nicht vorkommen, jedoch trotzdem im Datenmodell (.ili) modelliert sind. Dies, weil sie sich durch Berechnung aus anderen Attributen herleiten lassen.

Im Referenzhandbuch Kapitel 2.6.1. steht dazu:

Mittels eines Faktors festgelegte Attribute sollen, falls sie nur innerhalb weiterer Faktoren von Bedeutung sind, vom Datentransfer ausgeschlossen werden können, sie sollen dann als transient bezeichnet werden.

Ein als transient gekennzeichnetes Attribut kann wie folgt aufgebaut sein (angelehnt an die EBNF-Notation des Referenzhandbuches):

Attribute-Name (TRANSIENT) ':' AttrTypeDef ':=' Factor ';'.

Dabei kann Factor gemäss RefHB auch der Aufruf einer Funktion sein, z. B. INTERLIS.objectCount(<Rollenname>)

also z. B.
attr2 (TRANSIENT): 0..5 := INTERLIS.objectCount(aRef); oder

attr3 (TRANSIENT): 0..100 := Math.sum(aRef->Anzahl);

wobei aRef der Rollenname innerhalb einer ASSOCIATION ist.

Weshalb will der Compiler diese Schreibweisen partout nicht zulassen? Die zugehörige Fehlermeldung lautet in beiden Fällen:
Name aRef is not applicable to CLASS <Modellname>.<Topicname>.<Klassenname>
testmodel_2classes.ili (542 Bytes)

Danke für die Schilderung dieses Problems. Ich habe das RefHB studiert und einige Sachen probiert, aber ich stehe hier auch an. Eventuell ein Bug im ili2c…?

Beispiele ohne aRef funktionieren? Solche Beispiele gibt es jedenfalls in den ili2c Tests: https://github.com/search?q=repo%3Aclaeis%2Fili2c+TRANSIENT&type=code&p=2

Man kann transiente Attribute im Modell wie ein normales Attribut benutzen.

Weil aRef bei der Definition der Klasse cb noch nicht definiert ist (sondern erst nach der Definition der Assoziation ab).

Man müsste also in diesem Fall das transiente Attribut erst nach der Definition der Assoziation ab der Klasse cb hinzufügen können. Das kann man mit der aktuellen Sprache nicht.

2 „Gefällt mir“