ORDA Beispiele

Ich würde gerne mal ORDA mit v18r3 ausprobieren, habe mich damit aber noch nicht wirklich befasst.
-> Zeitmangel

Starten würde ich gern mit einem Speed Vergleich zur jetzigen Suche mit QUERY. Bei WAN Anbindungen ist das folgende Beispiel recht langsam, wenn es in einer Schleife mehrfach mit anderen Parametern aufgerufen wird.
Daher würde ich das gern mal mit ORDA testen und die Suche evtl. mit Execute on Server umprogrammieren.

Hat jemand ein Beispiel für mich als Timesaver, wie man am effizientesten so etwas mit ORDA umsetzt ?

QUERY([Tabelle];[Tabelle]Feld1=true;)
QUERY([Tabelle];&;[Tabelle]Feld2=“Wert”;
)
QUERY([Tabelle];&;[Tabelle]Feld3#“Wert2”)

Selection To Array([Tabelle]Feld1;$array1;[Tabelle]Feld2;$array2;[Tabelle]Feld3;$array3;[Tabelle]Feld4;$array4;[Tabelle]Feld5;$array5;[Tabelle]Feld6;$array6;[Tabelle]Feld7;$array7;[Tabelle]Feld8;$array8;[Tabelle]Feld9;$array9;[Tabelle]Feld10;$array10)

Danke Armin

Kommt ganz darauf an wozu man das Resultat benötigt und in welcher Art es vorliegen soll.
Eigentlich benötigen wir meistens keine Arrays mehr und es ist besser
wenn man gleich entitySelection oder bei Bedarf collection verwenden.
Falls man ein virtuelles Datengerüst benötigt sollte man gleich auf collection ausweichen
und sich nicht den Automatismen+Beschränkungen unötig einer entitySelection zu unterwerfen.
Baue ich also auf Basis der Daten aus Datenfile ein rein temporäres virtuelles Gerüst auf
welches komplett vom Datenfile/Table/Record entkoppelt ist
was ich mit weiteren temporären Daten anreichern will
und sicher auch kein Auto-Sync-Save in Records haben will
dann empfiehlt sich immer auf reiner Basis von Collection zu arbeiten (siehe Beispiel 2)

Beispiel 1 “Ziel ist entitySelection”

// Example-1: Working direct with entitySelection in a 4DFormListbox or in following codelines
C_OBJECT($entitySelection)
C_TEXT($val1;$val2)
$val1:="@"
$val2:="abcxyz"
$entitySelection:=ds.person.query("active = false AND name1 = :1 AND name2 # :2";$val1;$val2)
  // now the best is to direct work with entitySelection (it is not needed to convert entitySelection to collection/array)
  // ...any use example
$firstName1:=$entitySelection[0].name1
For each ($item;$entitySelection)
	$name1:=$item.name1
End for each

Beispiel 2 “Ziel ist collection via entitySel.toCollection”

// Example-2: Working direct with a client local collection in a 4DFormListbox or in following codelines
C_COLLECTION($resultCol)
C_TEXT($val1;$val2)
$val1:="@"
$val2:="abcxyz"
$resultCol:=ds.person.query("active = false AND name1 = :1 AND name2 # :2";$val1;$val2).toCollection("name1,name2")
  // now the best is to direct work with collection (it is not needed to convert collection to array)
  // ...any use example
$firstName1:=$resultCol[0].name1
For each ($item;$resultCol)
	$name1:=$item.name1
End for each

Beispiel 3 “Ziel ist array”

  // Example-3: Working with a array in a 4DFormListbox or in following codelines
C_COLLECTION($resultCol)
C_TEXT($val1;$val2)
$val1:="@"
$val2:="abcxyz"
$resultCol:=ds.person.query("active = false AND name1 = :1 AND name2 # :2";$val1;$val2).toCollection("name1,name2")
ARRAY TEXT($aNam1;0)
ARRAY TEXT($aNam2;0)
COLLECTION TO ARRAY($resultCol;$aNam1;"name1";$aNam2;"name2")
  // now you can work with arrays (just if you need arrays, userwise use entitySel or collection)

Beispiel 4 “Ziel ist collection via entitySelection.extract()”

https://blog.4d.com/orda-breaking-news-for-entity-selection-methods/
https://doc.4d.com/4Dv18R3/4D/18-R3/entitySelectionextract.305-4960869.de.html

  // Example-4: Working direct with a client local collection in a 4DFormListbox or in following codelines
  // Alternative for entitySel.toCollection(), use new collection function in 4Dv18R3: entitySel.extract()
  // with free to set any target names
  // just maybe in client/server is faster than entitySel.toCollection(filter) ...or same speed?
C_COLLECTION($resultCol)
C_TEXT($val1;$val2)
$val1:="@"
$val2:="abcxyz"
$resultCol:=ds.person.query("active = false AND name1 = :1 AND name2 # :2";$val1;$val2).extract("name1";"myN1";"name2";"myN2")

Meine Beispiel-Felder waren:
// [person]active (boolean)
// [person]name1 (text)
// [person]name2 (text)

1 Like

Danke Lutz,

damit kann ich mich mit Thema gleich produktiv beschäftigen :slight_smile:

Armin

Hi Armin

Auch interessant zu lesen, für spezielle Fälle mit großen Datenmengen ist der Client/Server Aspekt zu berücksichtigen.
Eine entitySel ist ja kein Client-Lokaler gefüllter Datenpool,
sondern eine leere Wanne mit Begrenzung
welche bei Bedarf (immer wenn verwendet oder DisplayDetail) gefüllt wird mit Daten vom Server.
Ebenso natürlich das Sync-Verhalten bei Refresh, ein stets aktuelles Abbild der Datafile-Daten
und dem Auto-Syn-Save, also entity stets in direktem Bezug zum Datenfile/datastore.
Manchmal will man nur eine Momentaufnahme ohne direkte datastoreVerbindung
und so ein entkoppeltes Abbild wäre dann einen collection.

Ab wann (oder welcher Situation) momentan noch SelectionToArray schneller ist
weis ich nicht aber da wird ja noch zukünftig in R4 eine nachträgliche Optimierung kommen.
Scheint wohl in v18R4 besser zu werden.


Achja und eine sql-query Alternative gibt es ja auch noch:

  // Old-Example with "SELECTION TO ARRAY" ...Query changes currSel and currLoadedRecord
C_TEXT($val1;$val2)
$val1:="@"
$val2:="abcxyz"
ARRAY TEXT($aNam1;0)
ARRAY TEXT($aNam2;0)
QUERY([person];[person]active=False;*)
QUERY([person];&;[person]name1=$val1;*)
QUERY([person];&;[person]name2#$val2)
SELECTION TO ARRAY([person]name1;$aNam1;[person]name2;$aNam2)
UNLOAD RECORD([person])
REDUCE SELECTION([person];0)
  // Alternativ-NonORDA-Example into array without change currSel and currLoadedRecord
C_TEXT($val1;$val2)
$val1:="%"
$val2:="abcxyz"
ARRAY TEXT($aNam1;0)
ARRAY TEXT($aNam2;0)
Begin SQL
	SELECT name1, name2
	FROM person
	WHERE active = FALSE
	AND name1 LIKE <<$val1>>
	AND name2 <> <<$val2>>
	INTO <<$aNam1>>, <<$aNam2>>;
End SQL

Hallo Lutz,

hast du eine Idee was ich falsch mache ? Ich habe dein Beispiel mal auf einen Suchparameter reduziert.

Die Tabelle [Interessenten] hat u.a. das Feld Name

QUERY([Interessenten];[Interessenten]Name="Wolf")
C_OBJECT($entitySelection)
C_TEXT($val1)
$val1:="Wolf"

$entitySelection:=ds.Interessenten.query("Name = :1";$val1)


Mit SQL geht es:

ARRAY TEXT(aNam;0)
Begin SQL
	SELECT NameVorname
	FROM Interessenten
	WHERE Name = 'Wolf'
	INTO :aNam;
End SQL

Armin

Hi Armin

Any Prefs not set correct?
Access to datastore not given?
Access to table not given?
Check too any specials there, table invisible or virtual table/field names
or no primary key is given.

Prinzipiell geht das alles per default in einer neu angelegten DB,
i.e. es muss also an etwas besonderen/individuellen in deiner DB liegen.

Um es näher einzukreisen, bevor man alles prüft.
(deine code syntax ist ok und normalerweise sollte das funktionieren)

Als erstes würde ich den debugger öffnen
und sehen was überhaupt die Basics sagen:

  • ds
  • ds.Interessenten
  • ds.Interessenten.all()
  • ds.Interessenten.query("Name =‘p@’ ")

Lutz

Umfangreiche allgemein docu zu entitySel.query()
…not all of this documented features available for col.query() …for example eval and some other exotics only for ds.query() i.e. entitySel.query()
https://doc.4d.com/4Dv18/4D/18/dataClassquery.305-4505887.de.html

Ja, ohne Primärschlüssel auf dem Table muss man auf ORDA verzichten,
deshalb gehört auf jeden Table ein Primärschlüssel.
Wenn ich den Schlüssel übers Kontextmenü von meinem table lösche
bekomme ich exakt gleiche ErgebnisMeldung.


Empfohlen ist natürlich UUID (ich habe die longint nur in einer demoDB und in realer DB meist immer UUID)

Danke Lutz,

das mit den PK’s habe ich ausgelassen. Da es ja anscheinend keine Möglichkeit gibt, das ohne Zuarbeit der Benutzer mit dem nächsten Update zu integrieren.

Oder hat sich da mittlerweile was geändert ?
Armin

Hallo Armin

Dazu kann ich leider nicht viel sagen, da ich mich damit nie beschäftigt habe.

Welche Zuarbeit der Benutzer bei welcher Art von Update gemeint ist,
ist mir auch nicht klar, weshalb es gut sein kann das folgender Tipp
nicht das war was Du wissen wolltest.

https://doc.4d.com/4Dv18R3/4D/18-R3/Primarschlussel-Assistent.300-4919458.de.html

https://doc.4d.com/4Dv18R3/4D/18-R3/Konvertierung-alterer-Anwendungen.300-4919331.de.html#1278716

Lutz

Guten Morgen!
Gerne verweise ich hier an der Stelle auf das kommende Webinar unseres Gast-Speakers @Sakowski.Christian zum Thema “ORDA & Objekte in der realen Welt.

Das kostenfrei Webinar findet morgen um 14:30 Uhr statt.
Registrierung unter https://us02web.zoom.us/webinar/register/WN_jGEKNbSkSYSN_Lxh2BgJzg

Wir freuen uns auf ganz viele Teilnehmer.

Schönen Tag!
Stephan Schäfer

1 Like

Die Aufzeichnung der Session ist jetzt auf unserem YouTube Kanal:

https://youtu.be/6UWA1VkqDis

Viel Spaß!

Grüße
Stephan Schäfer