4D v18Entity-Selections |
||||||||||||||
|
4D v18
Entity-Selections
|
Feature | Unsortierte Entity-Selection | Sortierte Entity-Selection |
Bearbeitungsgeschwindigkeit | sehr schnell | langsamer |
Größe im Speicher | sehr klein | größer |
Kann mehrere Referenzen auf eine Entity enthalten | nein | ja |
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:
Unsortierte Entity-Selections werden in folgenden Fällen erstellt:
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
4D bietet eine automatische Optimierung für ORDA Anfragen, die Entity Selections nutzen oder Entities in Client/Server Konfigurationen laden. Diese Optimierung beschleunigt die Ausführung Ihrer 4D Anwendung, da sie die Menge an Informationen, die über das Netzwerk übertragen wird, drastisch verringert.
Zur Optimierung sind folgende Mechanismen eingebaut:
Folgende Methoden weisen den Optimierungskontext der Entity Selection Quelle automatisch der zurückgegebenen Entity Selection zu:
Beispiel
Nehmen wir folgenden Code:
$sel:=$ds.Employee.query("firstname = ab@")
For each($e;$sel)
$s:=$e.firstname+" "+$e.lastname+" works for "+$e.employer.name // $e.employer bezieht sich auf die Tabelle Company
End for each
Dank der Optimierung erhält diese Anfrage in $sel nach der Lernphase nur Daten der verwendeten Attribute (firstname, lastname, employer, employer.name).
Die Eigenschaft context verwenden
Sie können die Vorteile der Optimierung durch die Eigenschaft context verbessern. Sie bezieht sich auf den "gelernten" Optimierungskontext für eine Entity Selection. Sie lässt sich auch als Parameter an ORDA Methoden übergeben, die neue Entity Selections zurückgeben, so dass Entity Selections die verwendeten Attribute direkt vom Server anfragen und die Lernphase übernehmen.
Die gleiche Eigenschaft lässt sich auch an eine unbegrenzte Zahl von Entity Selections in derselben Dataclass übergeben. Alle ORDA Methoden, die Entity Selection verwalten, unterstützen die Eigenschaft context (zum Beispiel Methode dataClass.query() oder dataClass.all()). Beachten Sie jedoch, dass ein Kontext automatisch aktualisiert wird, wenn neue Attribute in anderen Teilen des Code verwendet werden. Erneutes Verwenden desselben Kontexts in unterschiedlichen Codes könnten den Kontext überladen und so dessen Effizienz beeinträchtigen.
Hinweis: Ein ähnlicher Mechanismus ist für Entities eingebaut, die geladen werden, so dass nur verwendete Attribute abgefragt werden (siehe die Methode dataClass.get()).
Beispiel mit Methode dataClass.query():
C_OBJECT($sel1;$sel2;$sel3;$sel4;$querysettings;$querysettings2)
C_COLLECTION($data)
$querysettings:=New object("context";"shortList")
$querysettings2:=New object("context";"longList")
$sel1:=ds.Employee.query("lastname = S@";$querysettings)
$data:=extractData($sel1) // In der Methode extractData wird eine Optimierung ausgelöst und dem Kontext "shortList" zugewiesen
$sel2:=ds.Employee.query("lastname = Sm@";$querysettings)
$data:=extractData($sel2) // In der Methode extractData wird die dem Kontext "shortList" zugewiesene Optimierung angewandt
$sel3:=ds.Employee.query("lastname = Smith";$querysettings2)
$data:=extractDetailedData($sel3) // In der Methode extractDetailedData wird eine Optimierung ausgelöst und dem Kontext "longList" zugewiesen
$sel4:=ds.Employee.query("lastname = Brown";$querysettings2)
$data:=extractDetailedData($sel4) // In der Methode extractDetailedData wird die dem Kontext "longList" zugewiesene Optimierung angewandt
Listbox, die auf Entity Selections basiert
Die Optimierung der Entity Selection wird automatisch auf Listbox-basierte Entity Selection in Client/Server Konfigurationen angewandt, wenn Inhalt der Listbox angezeigt und gescrollt wird. Nur die in der Listbox angezeigten Attribute werden vom Server angefragt.
Wird die aktuelle Entity über die Eigenschaft Aktueller Eintrag der Listbox geladen, gibt es auch den spezifischen Kontext "Seitenmodus" (siehe Listboxen vom Typ Collection oder Entity-Selection). Er sorgt dafür, dass der ursprüngliche Kontext der Listbox nicht überladen wird, insbesondere wenn die "Seite" zusätzliche Attribute anfordert. Beachten Sie, dass der Seitenmodus nur über die Eigenschaft Aktueller Eintrag angelegt bzw. eingesetzt wird. Der Zugriff über entitySelection[index] verändert den Kontext Entity Selection.
Diese Optimierung wird auch von Anfragen genutzt, die später über Methoden, welche die Entity durchlaufen, an den Server gesendet werden. Folgende Methoden weisen automatisch den Optimierungskontext von der Entity Quelle der zurückgegebenen Entity zu:
Der folgende Code lädt z.B. die ausgewählte Entity und erlaubt das Durchlaufen der Entity-Selection. Entities werden in einem separaten Kontext geladen und der ursprüngliche Kontext der Listbox bleibt unverändert bestehen:
$myEntity:=Form.currentElement //Ausdruck aktueller Eintrag
//... etwas ausführen
$myEntity:=$myEntity.next() //lädt die nächste Entity mit dem gleichen Kontext
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"...)
Produkt: 4D
Thema: ORDA
Erstellt: 4D v17
4D Designmodus ( 4D v18)