4D v17.4

Entity-Selections

Home

 
4D v17.4
Entity-Selections

Entity-Selections  


 

Eine Entity-Selection ist ein Objekt, das eine oder mehrere Referenzen auf Entities der gleichen Dataclass enthält. Eine Entity-Selection kann 0, 1 oder X Entities aus der Dataclass enthalten, wobei X die Gesamtzahl der in der Dataclass enthaltenen Entities darstellen kann. Die Auswahl der Entities kann "sortiert" oder "unsortiert" erfolgen (dieser Punkt wird weiter unten erläutert).

Entity-Selections werden in der Regel über eine Abfrage (query) erstellt oder aus einem Verknüpfungsattribut zurückgegeben. Zum Beispiel:

 brokers:=ds.Person.query("personType = broker")

Dieser Code gibt in brokers alle Personen vom Typ Broker zurück. Um auf eine Entity der Selection zuzugreifen, verwenden Sie eine ähnliche Syntax wie beim Zugriff auf ein Element in einer Collection. Zum Beispiel:

 theBroker:=brokers[0]  //Entity-Selections gehen von 0 aus

Die Methode entitySelection.orderBy() gibt eine neue Entity-Selection gemäß den definierten Sortierkriterien zurück. Zum Beispiel:

 brokers:=brokers.orderBy("name") //gibt eine sortierte Selection zurück

Dieser Code gibt in brokers die gleiche Entity-Selection der Entities person zurück, jedoch sortiert nach Namen.

Alternativ können Sie eine Entity-Selection auch über ein Verknüpfungsattribut zurückgeben. Zum Beispiel:

 brokers:=ds.Person.query("personType = broker")
 brokerCompanies:=brokers.myCompany

Dieser Code ordnet den brokerCompanies alle verbundenen Unternehmen der Personen in der Entity-Selection brokers zu, die das Verknüpfungsattribut myCompany annehmen. Die Verwendung von Verknüpfungsattributen sind ein leistungsstarker und einfacher Weg, um in den verknüpften Entities nach oben und unten zu navigieren.

Um wiederholte Aktionen an Entities in einer Entity-Selection durchzuführen, wie Werte bestimmter Attribute abrufen und ändern, können Sie die Struktur For each...End for each verwenden. Zum Beispiel:

 C_OBJECT(emp)
 For each(emp;ds.Employees.all())
    If(emp.Country="UK")
       emp.salary:=emp.salary*1,03
       emp.save()
    End if
 End for each

Sie können ein Objekt vom Typ Entity-Selection wie folgt anlegen:

Sie können gleichzeitig beliebig viele verschiedene Entity-Selections für eine Dataclass anlegen und verwenden.

Beachten Sie, dass eine Entity-Selection nur Referenzen auf Entities enthält. Verschiedene Entity-Selections können Referenzen auf die gleichen Entities enthalten.

Hinweis: Eine Entity-Selection ist nur in dem Prozess definiert, wo sie erstellt wurde. So können Sie beispielsweise nicht eine Referenz auf eine Entity-Selection in einer Interprozessvariablen speichern und in einem anderen Prozess verwenden. 

Alle Speicherattribute (Text, Nummer, Boolean, Datum) sind sowohl als Eigenschaften von Entity-Selections als auch von Entities verfügbar. In Verbindung mit einer Entity-Selection gibt ein skalares Attribut eine Collection von skalaren Werten zurück. Zum Beispiel:

 locals:=ds.Person.query("city = :1";"San jose") //Entity-Selection von Personen
 localEmails:=locals.emailAddress //Collection von E-Mail Adressen (Strings)

Dieser Code gibt in localEmails eine Collection von E-Mail Adressen als Strings zurück.

Zusätzlich zu den verschiedenen Wegen für Abfragen (query) können Sie Verknüpfungsattribute als Eigenschaften von Entity-Selections verwenden, um neue Entity-Selections zurückzugeben. Nehmen wir z.B. folgende Struktur:

 myParts:=ds.Part.query("ID < 100") //gibt Teile (parts) mit ID unter 100 zurück
 $myInvoices:=myParts.invoiceItems.invoice
  //Alle Rechnungen mit mindestens einem Rechnungseintrag, verknüpft mit einem Teil in myParts

Die letzte Zeile gibt in $myInvoices eine Entity-Selection aller Rechnungen zurück, die mindestens einen Rechnungseintrag haben, verknüpft mit einem Teil (part) in der Entity-Selection myParts. Wird ein Verknüpfungsattribut als Eigenschaft einer Entity-Selection verwendet, ist das Ergebnis immer eine andere Entity-Selection, selbst wenn nur eine Entity zurückgegeben wird. Werden keine Entities zurückgegeben, ist das Ergebnis eine leere Entity-Selection, nicht Null.

Lokale Entity-Selections können sortiert oder unsortiert sein. Die Funktionsweise ist für beide Arten ähnlich, es gibt Unterschiede in der Performance und den Features. Sie können selbst bestimmen, welcher Typ sich besser für Ihre spezifischen Anforderungen eignet.

Hinweis: Entity-Selections, die von 4D Server an einen remote Client zurückgegeben werden, sind immer sortiert

  • Unsortierte Entity-Selections werden auf Bit Tabellen im Speicher aufgebaut. Eine unsortierte Entity-Selection enthält ein Bit pro Entity in der Dataclass, unabhängig ob die Entity tatsächlich in der Selection ist. Jedes Bit ist gleich 1 oder 0, um anzuzeigen, ob die Entity in der Selection enthalten ist oder nicht. Es ist eine sehr kompakte Darstellung jeder Entity.
    Demzufolge sind Operationen mit unsortierten Entity-Selections sehr schnell und benötigen wenig Speicherplatz. Die Größe einer unsortierten Entity-Selection in Bytes entspricht immer der Gesamtanzahl von Entities in der Dataclass, dividiert durch 8. Beispiel: Sie erstellen eine unsortierte Entity-Selection für eine Dataclass mit 10.000 Entities, das beansprucht bis zu 1.250 Bytes, was ungefähr 1.2K in RAM ausmacht.
    Dagegen lassen sich unsortierte Entity-Selections nicht sortieren. Sie können sich nicht auf die Position von Entities innerhalb der Selection verlassen. Es kann auch nicht mehrere Referenzen auf eine Entity in der Selection geben: Jede Entity lässt sich nur einmal hinzufügen.
  • Sortierte Entity-Selections werden auf Arrays vom Typ Lange Ganzzahl im Speicher aufgebaut (mit Entity Referenzen). Jede Referenz auf eine Entity beansprucht 4 Bytes im Speicher. Bearbeiten und Verwalten dieser Selections erfordert mehr Zeit und mehr Speicherplatz als unsortierte Entity-Selections.
    Sie können dagegen sortiert oder unsortiert sein und Sie können sich auf die Entity Positionen verlassen. Außerdem können Sie mehrere Referenzen auf dieselbe Entity hinzufügen. 

Die Übersicht zeigt die Hauptmerkmale:

FeatureUnsortierte Entity-SelectionSortierte Entity-Selection
Bearbeitungsgeschwindigkeit
sehr schnelllangsamer
Größe im Speicher
sehr kleingrößer
Kann mehrere Referenzen auf eine Entity enthalten
neinja

Aus Optimierungsgründen erstellt 4D ORDA standardmäßig unsortierte Entity-Selections, außer Sie verwenden die Methode orderBy( ) oder geeignete Optionen (siehe unten). In dieser Dokumentation bezieht sich Entity-Selection in der Regel auf "unsortierte Entity Collection". Andernfalls wird das explizit angegeben.

Wie oben erwähnt, erstellt und behandelt ORDA standardmäßig unsortierte Entity-Selections als Ergebnis von Operationen wie Anfragen oder Vergleiche wie and( ). Sortierte Entity-Selections werden nur bei Bedarf erstellt, oder wenn sie über spezifische Optionen angefordert werden.

Sortierte Entity-Selections werden in folgenden Fällen erstellt:

  • Ergebnis einer orderBy( ) auf eine Selection ((jeder Typ) oder ein orderBy( ) auf eine Dataclass
  • Ergebnis der Methode newSelection( ) mit der Option dk keep ordered

Unsortierte Entity-Selections werden in folgenden Fällen erstellt:

  • Ergebnis einer standardmäßigen query( ) auf eine Selection (jeder Typ) oder eine query( ) auf eine Dataclass
  • Ergebnis der Methode newSelection( ) ohne Option
  • Ergebnis einer Vergleichsmethode, unabhängig vom Typ der Input Selection: or( ), and( ), minus( )

Beachten Sie, dass sich wiederholende Entity Referenzen entfernt werden, wenn eine sortierte Entity-Selection zu einer unsortierten Entity-Selection wird.

Wollen Sie eine sortierte Entity-Selection in eine unsortierte umwandeln, müssen Sie nur eine and( ) Operation darauf anwenden, wie z.B.:

  //mySel ist eine sortierte Entity-Selection
 mySel:=mySel.and(mySel)
  //mySel ist jetzt eine unsortierte Entity-Selection

Das Objekt Entity-Selection selbst kann nicht als Objekt kopiert werden:

 $myentitysel:=OB Copy(ds.Employee.all()) //gibt Null zurück

Die Eigenschaften der Entity-Selection sind dagegen aufzählbar:

 ARRAY TEXT($prop;0)
 OB GET PROPERTY NAMES(ds.Employee.all();$prop)
  //$prop enthält die Namen der Entity-Selection Eigenschaften
  //("length", 00", "01"...)

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: ORDA

 
SEITENINHALT 
 
GESCHICHTE 

New
Erstellt: 4D v17

 
ARTIKELVERWENDUNG

4D Designmodus ( 4D v17)
4D Designmodus ( 4D v17.1)
4D Designmodus ( 4D v17.2)
4D Designmodus ( 4D v17.3)
4D Designmodus ( 4D v17.4)