As características da ORDA continuam a vir com 4D v17 R5! Num post anterior no blogue, mostrámos-lhe como criar consultas genéricas com os titulares de lugares nomeados para valores. Este post vai focar como utilizar marcadores de lugar para caminhos de atributos (nomes de campos em tabelas).
HDI: Exemplo de marcadores de lugar para caminhos de atributos em consultas ORDA
Estão disponíveis dois tipos de lugares reservados:
Marcadores de lugar indexados
Vejamos um exemplo que utiliza os lugares indexados para os caminhos dos atributos. Queremos encontrar clientes cujos nomes comecem com “Bravo” e tenham “Novo cliente” no campo de comentários:
C_OBJECT($clients)
$clients :=ds.Clients.query(":1 = "Bravo@" e :2 = "Novo cliente""; "nome"; "comentário")
Os espaços reservados são inseridos como :paramIndex (porexemplo,:1, :2, … com um incremento de 1) na cadeia de consulta. Os seus valores correspondentes são fornecidos pela sequência do(s) parâmetro(s) de valor.
caracteres de lugar nomeados
Também se pode utilizar marcadores de lugar nomeados. Utilizam o mesmo conceito que os placeholders nomeados para os valores. Os parâmetros são inseridos como :paramName e os seus valores são fornecidos na cadeia de consulta:
C_OBJECT($clients;$settings)
$settings :=New object
$settings .attributes:=New object("pathOfName"; "name"; "pathOfComment"; "comment")
$clients :=ds.Clients.query(":pathOfName = 'Bravo@' e :pathOfComment = 'Novo cliente'";$settings)
Porquê utilizar placeholders?
Vejamos o licencesInfo campo de objectos. Indica o número de licenças numa licençaNome: estilo de número.
{"licencesInfo":
{"4DDevPro":10, //This client has 10 4DDevPro licences
"4DServerV17_2":18,
"4DWebappserverV17_2":23}
}
Para encontrar o número de licenças “4DDevPro”, pode escrever esta consulta:
C_OBJECT($clients)
$clients :=ds.Clients.query("licençasInfo.4DDevPro >=0")
Mas agora vejam isto licencesInfo campo de objectos. Pode-se ver que a utilização de placeholders para caminhos de atributos pode ser especialmente útil ao consultar um objecto cujos nomes de propriedade não estejam em conformidade com a notação de pontos:
{"licencesInfo":
{"4D Dev. Pro":10, //This client has 10 4D Dev. Pro licences
"4D Server V17.2":18,
"4D Web app/server V17.2":23}
}
Neste caso particular, fornecer os parâmetros como um conjunto de cordas resolve o problema porque será interpretado pela consulta como um caminho de atributo.
C_OBJECT($clients)
$clients :=ds.Clients.query(":1 >=0";New collection("licensesInfo"; "4D Dev. Pro"))
Essa não é a única vantagem de utilizar placeholders. Há também um aspecto de segurança acrescido, uma vez que a utilização de placeholders impede a inserção de código malicioso. Também não há mais necessidade de se preocupar com questões de formatação ou de carácter. A lista prossegue …
Os exemplos acima estão a consultar uma classe de dados, mas se verificar a documentação, verá que também é aplicável em colecções. Também descobrirá mais exemplos que mostram porque é que a utilização de marcadores de lugar é uma boa escolha!