Lade...
 

Gültigkeiten

Gültigkeiten

Setzen von Gültigkeiten

Alle Objekte, die vom Typ CX_TERMED abgeleitet sind, können mit Gültigkeiten versehen werden. Um die Gültigkeit eines Objekts zu setzen gibt es die Zugriffsfunktion SpanDateValidity() und Austauschobjekte werden über Link mit dem Objekt verknüpft. Das aktuelle Gültigkeitsdatum lässt sich über ValidityDate auslesen und per SetValidityDate setzen. Ein Gültigkeitsdatum von NULL deaktiviert die Gültigkeitsprüfung von Objekten.

 

Codebeispiel:
Var(invalid, valid) CreateTransObject(CX_EXPANDABLE) -> invalid CreateTransObject(CX_EXPANDABLE) -> valid "invalid" invalid Put(str) "valid" valid Put(str) "gestern" invalid Put(SpanDateValidity()) "heute" valid Put(SpanDateValidity()) valid invalid Call(Link) invalid Copy(str) //-> "invalid" direct access, no validity checked invalid Copy(this.str) //-> "valid" access via 'this' checks validity

 

Gültigkeit in Zugriffsausdrücken

Zugriffsausdrücke sind in Terme unterteilt. Ein Punkt trennt die einzelnen Terme. Ein Zugriffsausdruck wird immer von links nach rechts ausgewertet, Term für Term.

Bei jedem Weiterschalten zum nächsten Term wird die Gültigkeit beachtet, wenn der vorige Term ein Objekt ist:

  • ...reference.term...
    Wenn reference auf ein ungültiges Objekt verweist, wird ein passendes gültiges Objekt gesucht, bevor term darauf angewendet wird.
  • ...reference
    Nach reference folgt kein Term, es wird das referenzierte Objekt ohne Beachtung der Gültigkeit zurückgeliefert.

reference ist eine Referenz auf ein Objekt (z.B. mother) oder eine Collection mit Subskript (z.B. children(2)).
term ist ein Datenfeld, ein Funktionsaufruf oder this.

Wenn man ein Objekt holt, bekommt man genau dieses Objekt.
Wenn man mit dem Objekt etwas tut, wird das aktuell gültige Objekt benutzt.

Beispiele:

A und B seien CX_PERSON-Objekte, wobei A bis gestern gültig ist und B ab heute. Zudem ist B als Austauschobjekt von A definiert. Die Systemgültigkeit sei auf heute gesetzt.

A Copy(uniqueID)  ->  liefert A.uniqueID  (1. Regel)
B Copy(uniqueID)  ->  liefert B.uniqueID  (1. Regel)
A Copy(this.uniqueID)  ->  liefert B.uniqueID  (2. Regel, mit "this" wird etwas getan)
B Copy(this.uniqueID)  ->  liefert B.uniqueID  (2. Regel, mit "this" wird etwas getan)

A A Link(masterObject)
B B Link(masterObject)
A Get(masterObject)  ->  liefert A  (1. Regel)
B Get(masterObject)  ->  liefert B  (1. Regel)
A Get(this.masterObject)  ->  liefert B  (2. Regel, mit "this" wird etwas getan)
B Get(this.masterObject)  ->  liefert B  (2. Regel, mit "this" wird etwas getan)
A Copy(masterObject.uniqueID)  ->  liefert B.uniqueID  (2. Regel, mit "masterObject" wird etwas getan)
B Copy(masterObject.uniqueID)  ->  liefert B.uniqueID  (2. Regel, mit "masterObject" wird etwas getan)

Queries, Conditioned Bags

  • Alle Arten von Queries beachten keine Gültigkeiten.
  • Suche in CX_CONDITIONED_BAG beachtet keine Gültigkeit.
  • Suche in CX_DICTIONARY und Verwandten ebensowenig.

Rates

Rates-Funktionen beachten die Gültigkeit

  • beim Anmelden,
  • in allen Convert()-Funktionen,
  • bei implizierter Konvertierung durch Modifikation der Einheitentabelle,
  • bei temporärer Änderung der Einheiten-Namen

Model-Funktionen

Diese Model-Funktionen beachten die Gültigkeit, z.B. beim Iterieren über Collections oder Verfolgen von Zeigern:

  • CX_ATTRIBUTE::GetDataField und PlugDataField
  • CX_ITEM_PATTERN::Item()
  • CX_USER::CheckPassword()

Alle anderen Model-Funktionen beachten die Gültigkeit nicht. Hier die Funktionen, wo es bekannt ist:

  • CX_ALLOCATION::Allocators()
  • CX_ATTRIBUTE_SET::AttributeNames(), ViewExport()
  • CX_BUSINESS_OBJECT::Access(), CastedStructureByCondition(), MonitorByUnique(), TotalMonitors(), Allocation(), Allocators(), JobSchedule(), ClearingObject(), EmployeeOfCE(), EmployeeByFirstChoiceOfCE()
  • CX_CASH_DISCOUNT::DueCharge(), NetDueCharge()
  • CX_CHARGE_SET::NthDueCharge()
  • CX_DATA_CUBE::DataCube(), TopDimensions()
  • CX_ITEM::Attribute(), Monitor, SubCube(), AccountOwner(), GetTransTable()
  • CX_LEGAL_PERSON::Access(), Employees()
  • CX_MONITOR::Total()
  • CX_SCHEDULE::Predecessor(), Successor()
  • CX_SET_ALLOCATION::Examine(), Resolve3(), Inspect()
  • CX_STRUCTURE::Object()
  • CX_STRUCTURED::StructureByID(), StructureByEnum(), Monitor(), MonitorByUniqueID()
  • CX_TAX::GeneralLedger()
  • CX_TRANSACTION::Monitor(), Predecessors()

InstantView®-Befehle

  • FillObox, UpdateObox: Es wird immer das aktuell gültige Objekt in die ObjectList(View) eingefügt. Mit den Flags LIST_INVALID bzw. LIST_ORIGIN kann die Darstellung der gültigen Objekte und Ihrer Austauschobjekte konfiguriert werden.
  • UpdateObox: Auch die Siblings werden ersetzt.
  • iterate: Cardinality beachtet keine Gültigkeiten
  • NODE bei Tree-Verfolgung beachtet Gültigkeiten
  • FillWindow beachtet Gültigkeiten, wenn es implizit ein FillObox auslöst weil eine Collection dargestellt wird (mit und ohne ENTIRE)

Technische Beschreibung

Ein Objekt, das eine Gültigkeit haben kann, muss von CX_TERMED abgeleitet sein. Das trifft für CX_EXPANDABLE und folgende zu, also alle Info- und Geschäftsklassen. Die Gültigkeit selbst wird in einem CX_VALIDITY-Objekt gespeichert. Diese Objektpaare bilden einen Ring:

Statt eines CX_VALIDITY-Objekt kommt i.d.R. ein CX_TERMED_VALIDITY-Objekt zum Einsatz, das auf ein CX_DATE-Objekt zeigt. In den meisten Fällen dürfte es tatsächlich ein CX_SPAN_DATE-Objekt sein.

Wie wird zu einem ungültigen Objekt das gültige Austauschobjekt gefunden? Angenommen, A und B seien ungültig, nur C sei gültig. Von A soll das gültige Austauschobjekt gefunden werden.
Das System springt über den Zeiger 'validity' zum CX_VALIDITY-Objekt Av. Über 'termedValidity' erreicht es das CX_SPAN_DATE-Objekt und stellt fest, dass der heutige Tag nicht in dieser Spanne liegt. Anschließend springt das System über Av.next zum nächsten Austauschobjekt B. Die Prüfung wird wiederholt. Dieser Algorithmus wird so lange wiederholt, bis ein gültiges Objekt gefunden wurde, oder das Startobjekt wieder erreicht wird. In diesem Fall gibt es kein gültiges Austauschobjekt.

Kombiniert man Gültigkeiten mit Wrappen, dann können Wrapper und gewrappte Objekte wahlweise Teil des gleichen Gültigkeitsrings sein, oder in unterschiedlichen Gültigkeitsringen existieren. Dies wird hier genauer erklärt.