ORDA Objektfeld mit Objektarray abfragen

Ich habe einmal eine Frage, bei der ich mir selber nicht ganz sicher bin, ob das überhaupt funktionieren kann … aber man weiß ja nie :wink:

Folgendes Szenario: Ich speichere in einem Objektfeld ein Array aus mehreren Objekten, nennen wir sie Termine. Die Objekte beinhalten ein Datum (am) und ein Boolsches Feld (erledigt). Das sieht vereinfacht so aus:

Objektfeld{
{“am”;erledigt},
{“am”;erledigt},
{“am”;erledigt} …
}

Soweit so gut. Jetzt suche ich via ORDA alle Datensätze deren Objektfeld Termine zu einem Datum beinhalten … das geht wunderbar mit:

Code :
dataClass.query(“Objektfeld.Termin[].am = :1”;$datum)

Jetzt hätte ich gerne die Abfrage um das Boolsche Feld erweitert. Sprich ich hätte gerne alle Datensätze, die Objekte zu einem Datum haben und die erledigt sind.

Wenn man einfach die Abfrage um das Boolsche Feld erweitert bekommt man logischerweise alle Datensätze die in IRGENDEINEM Objekt, das richtige Datum und in IRGENDEINEM Objekt true stehen haben.

Code :
dataClass.query(“Objektfeld.Termin[].am = :1 AND Objektfeld.Termin[].erledigt = :2”;$datum;true)

Ich hätte aber gerne, dass Datum und Boolscher Wert im SELBEN Objekt übereinstimmen.

Geht das so einfach, oder muss man sich über das erste Ergebnis Loopen und selbst prüfen?

Danke für sachdienliche Hinweise!

So gut wie den Kuchen aufessen und ihn behalten.

: Ortwin ZILLGEN

Daten auslesen und in ein Objekt packen
per JSON Stringify das Objekt in einen Text wandeln
diesen Text ins Feld speichern

verstehe ich jetzt nicht. Das ist doch das schlechteste aus beiden Varianten?

In einem Objekt-Feld kann man rasend schnell suchen. Sortieren. Max/min/Average abfragen.
Json benötigt mehr Speicherplatz als Raw-Text.

Für mich ist das ein klassisches Refactoring.

Entweder:
a) neue Tabelle mit neuer Struktur anlegen. Anwendung auf neue Tabelle umschreiben, Daten übertragen. Alte Tabelle löschen. Das kann man parallel zum Arbeiten machen, stück für stück, ohne die Lauffähigkeit zu gefährden. Daher oft der beste Weg.
b) neues Feld anlegen, Werte übertragen. Alte Feldinhalte löschen. Das ist ganz wichtig, da nach Feldlöschen diese irgendwann wieder verwendet werden. Wurden alle Datenbestände gelöscht, gibt das keine Probleme. Dann kann man die Felder nach einer Wartezeit (klappt alles…) nach einigen Monaten löschen.

: Thomas MAUL

verstehe ich jetzt nicht.
ich dachte “So gut wie den Kuchen aufessen und ihn behalten” sei eindeutig

Hallo,

vielen Dank für die Antworten.

Ich hatte irgendwie gehofft, dass ich die Daten in einem Format speichern kann,
welches “object” interpretieren kann.

Das Beispiel für den Feldinhalt verwendet keine [], ist also kein Array/Collection sondern Einzelwerte. Ich gehe hier aber davon aus das dies ein Tippfehler ist, sonst würde Ihr Beispiel unten nicht passen.

So wie geschrieben wird AND auf den Datensatz angewandt, nicht auf ein Unterelement.
Also ein Datensatz muss einen Termin für den Zeitraum haben und einmal erledigt sein, diese sind aber nicht verlinkt.

Die “Verlinkung” ist optional - und nicht auf einen einzigen Link beschränkt. In Ihrem Fall wäre es so richtig:

dataClass.query(“Objektfeld.Termin[a].am = :1 AND Objektfeld.Termin[a].erledigt = :2”;$datum;true)

[a] erzeugt einen Link mit Bezeichnung a.
Sie können bis zu 26 Links gleichzeitig in einer Suche aufbauen, und ja, richtig geraten, diese werden mit a-z spezifiziert.

Danke für die Antwort. Leider funktioniert das so noch nicht wie ich mir das vorstelle. Wo in der Dokumentation finde ich nähere Infos zur “Verlinkung”?

Wenn ich das mit Ihrer Version versuche, dann wird kein Datensatz gefunden, obwohl es eindeutig einen gibt, der die Kriterien erfüllt.

: Franz HAUSER

Danke für die Antwort. Leider funktioniert das so noch nicht wie ich
mir das vorstelle. Wo in der Dokumentation finde ich nähere Infos zur
“Verlinkung”?

Schauen Sie bei dem Befehl QUERY BY ATTRIBUTE:

http://livedoc.4d.com/4Dv17-R4/help/Command/de/page1331.html

Und dann unter dem Punkt Suchkriterien mit Array Attributen verlinken.

: Franz HAUSER

Wenn ich das mit Ihrer Version versuche, dann wird kein Datensatz
gefunden, obwohl es eindeutig einen gibt, der die Kriterien erfüllt.

Wir werden dann Ihre Daten (Auszug) und Code benötigen, um Ihre Vorgehensweise zu verstehen und helfen zu können. Bitte öffnen Sie einen TAOW Fall und laden eine Beispielanwendung hoch.
Da reichen vermutlich 2 Datensätze, mit jeweils passendem Objekt (also zwei Felder) und die eine Methode.

Danke für den Hinweis!

Es ist offensichtlich ein Problem aus der Kombination Datum und Boolean in der Abfrage. Es gibt mittlerweile eine “offizielle” Bug-ID dazu: ACI0099239