Sie haben sicher schon bemerkt, dass ORDA-Abfragen nicht nur leicht und lesbar sind, sondern auch die Navigation durch das gesamte Datenmodell mit objektorientierten Konzepten erleichtern! In diesem Blog-Beitrag haben wir Ihnen gezeigt, wie Sie leistungsfähige und leicht zu pflegende Abfragen schreiben können. Eine der empfohlenen Methoden war, die Abfrage und die Werte separat über Platzhalter bereitzustellen. 4D v17 R5 geht mit Platzhaltern noch einen Schritt weiter, indem es Ihnen erlaubt, generische ORDA-Abfragen zu schreiben: Begrüßen Sie die benannten Platzhalter für Werte!
HDI: Beispiel für benannte Platzhalter für Werte in ORDA-Abfragen
Diese neuen Platzhalter werden als Objektparameter in den Abfrageeinstellungen bereitgestellt. Da ein Objekt eine Schlüssel/Wert-Map ist, ist es sehr einfach, sie in Ihren Abfragen zu verwenden.
Ein Beispiel sagt mehr als tausend Worte
Hier ist eine Abfrage, um einen Kunden namens Charlie mit Loyal Client als Kommentar zu erhalten. Kommt Ihnen das bekannt vor? Wenn nicht, sollten Sie sich diesen Beitrag ansehen, um Ihr Gedächtnis aufzufrischen.
C_OBJECT($clients)
$clients :=ds.Clients.query("Name = :1 und Kommentar = :2"; "Charlie@"; "Loyaler Kunde")
Die Abfrage kann auch wie folgt geschrieben werden:
C_OBJECT($settings;$clients)
$settings :=New object
$settings .parameters:=New object("givenName"; "Charlie@"; "givenComment"; "Loyaler Kunde")
$clients :=ds.Clients.query("name = :givenName und comment = :givenComment";$settings)
Verwenden Sie einfach den Platzhalter mit dem Namen vorangestellten „:“ .
Ihr Code ist leicht lesbar und wartbar, aber ein noch größerer Vorteil ist die Möglichkeit, generische Abfragen zu schreiben, deren Wertparameter aus verschiedenen Quellen stammen können (einer Benutzeroberfläche oder einer Anfrage).
Wie wäre es mit einem Muster wie diesem?
Sie können Ihren Benutzern auch eine Abfrageoberfläche zur Verfügung stellen, in der sie die Suchkriterien und die anzuwendenden Werte auswählen können.
Der unten stehende Code ist für eine Schnittstelle, die es einem Vertriebsmitarbeiter ermöglicht, eine Liste seiner Kunden zu durchsuchen. Sie gibt gefilterte Inhalte entsprechend der ID des Verkäufers zurück.
C_OBJECT$settingsparameters($formData;$settings;$clients)
C_TEXT ($queryString)
$formData :=New object
DIALOG ("QueryEditor";$formData)
CLOSE WINDOW
if (OK=1)
//The logged sales person can only browse their clients
$queryString :="salesPersonUserId = :givenUserId"
//The $formData object comes from the user's interface with search criteria filled
//It contains the sales person's user id and some additional search criterias (name and city)
$settings :=New object
$settings .parameters:=$formData
If ( xml-ph-0034@deepl.ingivenName#Null)
$queryString :=$queryString+" and name = :givenName"
End if
If ($settings.parameters.givenCity#Null)
$queryString :=$queryString+" and city.name = :givenCity"
End if
$clients :=ds.Clients.query($queryString;$settings)
end if
In den obigen Beispielen wird eine dataClass abgefragt, aber wenn Sie die Dokumentation lesen, werden Sie sehen, dass es auch auf Collections anwendbar ist!
Wie Sie sehen können, ist die dynamische Erstellung von Abfragen ein Kinderspiel. Laden Sie den HDI herunter und führen Sie ihn aus, um mehr zu erfahren!