SetReference
SetReference(zugriffsAusdruck), SetReference(zugriffsAusdruck, backRef), SetReference(STACK, STACK)
Parameter: ein Zugriffsausdruck, Name der Rückreferenz.
Stack | Position | Beschreibung |
---|---|---|
Stack(In) | Top | Zielobjekt |
Top-1 | referenziertes Objekt | |
Stack(Out) | Top | - |
Achtung!
veraltet, bitte Link benutzen
Der vom Zielobjekt ausgehend über den Zugriffsausdruck erreichte Pointer p soll nach dieser Operation auf das Objekt auf Stack-Top-1 zeigen.
Wenn der im Zielobjekt ausgewählte Pointer im DDI als 1-1- oder 1-m-Referenz deklariert wurde, muss der Name einer Rückreferenz als zweiter Operand angegeben werden.
Ist p != NULL (vor der Operation), wird zunächst die bisherige gültige Rückreferenz aufgelöst. Danach werden p und die (neue) Rückreferenz (Pointer oder Collection) gesetzt. SetReference wird von Einträgen im DDI gesteuert und bricht mit einem Fehler ab, wenn versucht wird, eine den im DDI getroffenen Festlegungen widersprechende Referenz aufzubauen. Dies ist der Fall, wenn
- der Datentyp des zu referenzierenden Objekts nicht zu dem im DDI eingetragenen Referenz-Datentyp passt (d.h. das zu referenzierende Objekt ist keine Instanz der im DDI eingetragenen oder einer davon abgeleiteten Klasse)
- das Pointer p enthaltende Objekt o nicht zu dem im DDI eingetragenen BackReferenz-Datentyp paßt (d.h. Objekt o ist keine Instanz der im DDI als Backreference-Typ eingetragenen oder einer davon abgeleiteten Klasse)
- die zum Beginn der Operation vorgefundene Referenz hinsichtlich Hin- oder Rückreferenz einen Typwiderspruch zum DDI enthält
- bei einer 1-1-Relation die Rückreferenz gar nicht auf Objekt o zeigt
- bei einer 1-m-Relation Objekt o kein Element der Backreference-Collection ist.
Ein persistentes Objekt darf nie ein transientes Objekt referenzieren, dies betrifft Hin- und Rückreferenz. Folgende Referenzen sind erlaubt:
transient | persistent | |
transient | erlaubt | mit Einschränkungen erlaubt |
persistent | verboten | erlaubt |
Ein transientes Objekt darf ein persistentes referenzieren, wenn
- der Pointer ein dynamisches Datenfeld und
- vom Typ POINTER ist (REL_11 bzw. REL_1M würden eine Rückreferenz vom persistenten zum transienten Objekt erzwingen, und dies ist verboten).
Hinweis: Wenn ein persistentes Objekt an der Operation teilnimmt, beginnt eine Transaktion.