A estas alturas seguro que te has dado cuenta de que las consultas ORDA no sólo son ligeras y legibles, ¡también facilitan la navegación por todo el modelo de datos utilizando conceptos orientados a objetos! En esta entrada del blog, le mostramos cómo escribir consultas poderosas y fáciles de mantener. Uno de los métodos recomendados era proporcionar la consulta y los valores por separado mediante marcadores de posición. 4D v17 R5 lleva los marcadores de posición un paso más allá al permitirle escribir consultas genéricas ORDA: ¡diga hola a los marcadores de posición con nombre para los valores!
HDI: Ejemplo de marcadores de posición con nombre para valores en consultas ORDA
Estos nuevos marcadores de posición se proporcionan como parámetros de objeto en la configuración de la consulta. Dado que un objeto es un mapa clave/valor, es muy fácil utilizarlos en las consultas.
Un ejemplo vale más que mil palabras
Aquí hay una consulta para obtener un cliente llamado Charlie con el cliente Leal como comentario. ¿Te suena? Si no es así, deberías consultar este post para refrescar la memoria.
C_OBJECT($clients)
$clients :=ds.Clients.query("nombre = :1 y comentario = :2"; "Charlie@"; "Cliente leal")
La consulta también puede escribirse como
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)
Sólo tiene que utilizar el marcador de posición con su nombre prefijado por «:» .
Su código es fácilmente legible y mantenible, sin embargo, una ventaja aún mayor es poder escribir consultas genéricas cuyos parámetros de valor pueden provenir de diferentes fuentes (una interfaz de usuario o una solicitud).
¿Qué tal un patrón como éste?
Puedes proporcionar a tus usuarios una interfaz de consulta en la que puedan elegir los criterios de búsqueda y los valores a aplicar.
El código siguiente es para una interfaz que permite a un vendedor navegar por una lista de sus clientes. Devuelve el contenido filtrado según el ID del vendedor.
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
Los ejemplos anteriores consultan una dataClass, pero si consultas la documentación, verás que también se puede aplicar a colecciones.
Como puedes ver, construir consultas de forma dinámica es muy fácil. Descargue y ejecute el IDH para saber más.