Lade...
 

Zugriffsausdruck

Zugriffsausdruck

Eine wichtige Rolle spielen Ausdrücke, die den Zugriff auf Daten und Methoden der Objekte beschreiben und ein Navigieren durch die Objekte erlauben:

  1. Ist das Datenfeld (name1) ein Objekt, wird auf dessen Datenfeld (name2) zugegriffen mit name1.name
     
  2. Ist das Datenfeld ein Pointer auf ein Objekt, so ereicht man dessen Datenfeld (name2) ebenfalls mit name1.name2
    d.h. InstantView® unterscheidet nicht zwischen einem Pointer auf ein Objekt und dem Objekt selbst (wie Java). 
     
  3. Von einem Datenfeld vom Typ CX_CONDITIONED_BAG kann mit -> weiternavigiert werden.
    -> verlangt hier die Auswahl eines Objektes, CX_CONDITIONED_BAG wird wie durch die Variablenbelegung im PlugSpace gesteuerter variabler Pointer aufgefasst.  
     
  4. Auf das n-te Element einer Collection (name1) bezieht man sich mit
    name1[n]

    Beispiel:

    father.children[3]
  5. und auf ein Datenfeld (name2) dieses Elements mit
    name1[n].name2
    , wobei n für eine ganze Zahl (Konstante) oder eine InstantView®-Variable steht.

    Beispiel:

    father.childeren[3].firstName

     
  6. An beliebiger Stelle können Aufrufe einer Memberfunktion stehen (mit Rückgabewert Objekt oder Collection); als Parameter können Konstanten - eine Zeichenkette bzw. eine ganze Zahl - oder eine InstantView®-Variable angegeben werden. Hinter dem Bezeichner der Memberfunktion müssen stets eine öffnende und nach den Parametern eine schließende Klammer folgen. Konstante Parameter können weggelassen werden, sofern sie nach allen angegebenen Parametern folgen. Sie werden dann als Leerstring "" bzw. als 0 oder NULL (für Objektparameter) angenommen.
    Ein Objekt kann nur mittels einer InstantView®-Variablen übergeben werden. 
    Beispiel: owner.StateMonitor("REQUEST").mlShortName
     
  7. Wird einem Term für einen Funktionsaufruf der Specifier weak vorangestellt, werden ClassiX®-Exceptions unterdrückt. Es gibt keinen Abbruch mit Fehlermeldung, aber das Ergebnis der Auswertung des ganzen Zugriffsausdrucks ist INVALID
    Beispiel: item.weak.ProductAllocation(resolveType,0)  
    'weak' muss dem Funktionsaufruf unmittelbar vorangehen. 'weak' darf auch für den Aufruf einer MA-Funktion bzw. der Pseudofunktion call(...) angegeben werden.
     
  8. Am Ende des Ausdrucks kann mit
    name[n]
    auf das n-te Bit eines Elements vom Typ CX_BIT_PATTERN, INTEGER, SHORT, CHAR, ENUMSHORT oder ENUMCHAR zugegriffen werden. Bei einem Element vom Typ MULTIPLE_STRING erreicht man den n-ten Teilstring (die n-te Sprache).
    Für n kann eine ganzzahlige Konstante oder eine InstantView®-Variable stehen.
     
  9. Am Anfang eines Zugriffsausdrucks kann die Pseudo- Funktion var(x) stehen. Sie liefert den Wert der InstantView®-Variablen x als Objekt.
    Diese Konstruktion verändert den Sinn des Zugriffsausdrucks: das Objekt, von dem die Navigation ausgeht, wird bedeutungslos. Dies ist vor allem innerhalb von Formeln (siehe CX_FORMULA) sinnvoll.
     
  10. Mit der Pseudo- Funktion call(Procedure) wird die als Operand angegebene InstantView®-Anweisung aufgerufen. Die (mit Define vereinbarte) Prozedur muss
    - entweder im aktuellen Modul bekannt oder
    - über ein Provider-Tag importiert sein. Außerdem kann
    - InstantView-Code direkt innerhalb einer anonymen Prozedur stehen.
    Das durch die bisherige Auswertung erreichte Objekt erscheint als Input-Parameter auf dem Stack. Die aufgerufenen Anweisung muss ein Resultat auf dem Stack hinterlassen (der Rückgabewert der Funktion).
    Soll der Zugriffsausdruck nach call(...) fortgesetzt werden,  muss ein Objekt zurückgegeben werden. 
     
  11. Wird der Wert des Ausdrucks als Zeichenkette benötigt, kann am Ende die Pseudo- Funktion string(flag1, flag2, ...) stehen, wobei die Konvertierung durch optional anzugebende Flags gesteuert wird.
     
  12. Pseudo-Funktion core() liefert für Objekte der Klassen CX_DESCRIPTIVE_REF und CX_OVERWRITIG_REF das referenzierte Objekt (das "gewrappte" Objekt) - auch über mehrere Stufen. Für alle anderen Objekte ist core() ohne Wirkung, d.h man erhält das Objekt selbst.
    Beispiel: salesItem.core().mlWordDoc
     
  13. Mit dem reservierten Wort this kann man sich auf das Objekt selbst beziehen. Dabei werden die Zugriffsrechte auf das Objekt und die Gültigkeit des Objekts überprüft. Schlägt eine der Prüfungen fehl, wird INVALID zurückgegeben. Das reservierte Wort this entspricht dem Punktoperator "." innerhalb eines Zugriffsausdruckes: auch hier wird während der Navigation von Teilausdruck zu Teilausdruck jeweils diese Prüfung auf Zugriffsrechte und Gültigkeit ausgeführt.
     
  14. Mit dem reservierten Wort hard wird die Prüfung auf (zeitliche) Gültigkeit des Objekts unterdrückt. D.h., unabhängig von der jetzigen Gültigkeit des Objekts wird das (früher einmal) referenzierte Objekt zurückgegeben. Das Wort ist dabei an den Bezeichner des Objekts anzuhängen.

    Beispiel, bei dem die Prüfung für partner unterdrückt wird:

    partner.hard.name
    Analog zu hard kann auch soft verwendet werden: Hierbei wird zunächst eine Gültigkeitsprüfung durchgeführt. Kommt die auf kein aktuell gültiges Objekt, verhält sich soft so wie hard und liefert das aktuell Objekt zurück. soft verhindert somit immer die Rückgabe von INVALID (analog zu hard, indem mindestens das ursprünglich referenzierte Objekt zurückgegeben wird), sollte aber doch aktuell ein anderes (neueres) Objekt gültig sein, wird dieses zurückgegeben (analog zu this). 

 

Hinweis: 'Datenfeld' kann sowohl ein in der Klassendefinition vorgesehenes Datenmember als auch ein dynamisches Datenfeld sein.
Bei der Auswertung der Zugriffsausdrücke werden - wenn entsprechende Security-Objekte aktiviert sind - die Zugriffsrechte und auch die Gültigkeit überprüft.

Namen der Datenfelder müssen im Data Dictionary und Funktionsnamen im Method Dictionary eingetragen sein.