Por esta altura já deve ter reparado que as consultas ORDA não são apenas leves e legíveis, elas também facilitam a navegação através de todo o modelo de dados usando conceitos orientados para objectos! Neste post do blogue, mostramos-lhe como escrever consultas poderosas e fáceis de manter. Um dos métodos recomendados foi fornecer a consulta e os valores separadamente através de marcadores de lugar. 4D v17 R5 dá mais um passo em frente ao permitir-lhe escrever consultas ORDA genéricas: diga olá aos placeholders nomeados para os valores!
HDI: Exemplo de marcadores de lugar nomeados para valores em consultas ORDA
Estes novos titulares de lugares são fornecidos como parâmetros do objecto nas definições da consulta. Uma vez que um objecto é um mapa chave/valor, é muito fácil de os utilizar nas suas consultas.
Um exemplo vale por mil palavras
Aqui está uma consulta para obter um cliente chamado Charlie com um cliente leal como comentário. Isto diz-lhe alguma coisa? Se não, deve consultar este post para refrescar a sua memória.
C_OBJECT($clients)
$clients :=ds.Clients.query("nome = :1 e comentário = :2"; "Charlie@"; "Cliente Leal")
A consulta também pode ser escrita 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)
Basta utilizar o espaço reservado com o seu nome prefixado por “:” .
O seu código é de fácil leitura e manutenção, contudo, uma vantagem ainda maior é poder escrever consultas genéricas cujos parâmetros de valor podem provir de diferentes fontes (uma interface do utilizador ou um pedido).
E que tal um padrão como este?
Pode também fornecer aos seus utilizadores uma interface de consulta onde estes podem escolher os critérios de pesquisa e os valores a aplicar.
O código abaixo é para uma interface que permite a um vendedor navegar por uma lista dos seus clientes. Retorna o conteúdo filtrado de acordo com o ID do 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 ( givenName$queryString#Null)
$queryString :=$queryString+" e nome = :givenName"
End if If ($settings.parameters.givenCity. #Null)
$queryString :=$queryString+" e city.name = :givenCity"
End if
$clients :=ds.Clients.query(
;$settings)
end if
Os exemplos acima estão a consultar uma DataClass, mas se verificar a documentação, verá que também é aplicável em colecções!
Como pode ver, construir consultas de forma dinâmica é canja. Descarregue e execute o HDI para saber mais!