Ormai avrete sicuramente notato che le query ORDA non sono solo leggere e leggibili, ma permettono anche di navigare facilmente attraverso l’intero modello di dati utilizzando concetti orientati agli oggetti! In questo post vi abbiamo mostrato come scrivere query potenti e facili da mantenere. Uno dei metodi consigliati era quello di fornire la query e i valori separatamente tramite segnaposto. 4D v17 R5 fa un ulteriore passo avanti, consentendo di scrivere query ORDA generiche: salutate i segnaposto denominati per i valori!
HDI: Esempio di segnaposto denominati per i valori nelle query ORDA
Questi nuovi segnaposto sono forniti come parametri di oggetto nelle impostazioni della query. Poiché un oggetto è una mappa chiave/valore, è molto facile utilizzarli nelle query.
Un esempio vale più di mille parole
Ecco una query per ottenere un cliente di nome Charlie con il cliente Loyal come commento. Vi ricorda qualcosa? Se no, date un’occhiata a questo post per rinfrescarvi la memoria.
C_OBJECT($clients)
$clients :=ds.Clients.query("name = :1 and comment = :2"; "Charlie@"; "Loyal client")
La query può anche essere scritta come:
C_OBJECT($settings;$clients)
$settings :=New object
$settings .parameters:=New object("givenName"; "Charlie@"; "givenComment"; "Loyal client")
$clients :=ds.Clients.query("name = :givenName and comment = :givenComment";$settings)
Basta usare il segnaposto con il suo nome preceduto da “:” .
Il codice è facilmente leggibile e manutenibile, ma un vantaggio ancora maggiore è quello di poter scrivere query generiche i cui parametri possono provenire da fonti diverse (l’interfaccia dell’utente o una richiesta).
Che ne dite di uno schema come questo?
È possibile fornire agli utenti un’interfaccia di interrogazione in cui possono scegliere i criteri di ricerca e i valori da applicare.
Il codice qui sotto è per un’interfaccia che consente a un venditore di sfogliare un elenco dei suoi clienti. Restituisce contenuti filtrati in base all’ID del venditore.
C_OBJECT $queryString$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
:="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 $clients#Null)
$queryString :=$queryString+" e nome = :givenName"
End if
If ($settings.parameters.givenCity#Null)
$queryString :=$queryString+" e city.name = :givenCity"
End if
:=ds.Clients.query($queryString;$settings)
end if
Gli esempi precedenti riguardano l’interrogazione di una dataClass, ma se si controlla la documentazione, si vedrà che è applicabile anche alle collezioni!
Come si vede, costruire query in modo dinamico è un gioco da ragazzi. Scaricate ed eseguite l’HDI per saperne di più!