4D v16.3

QUERY BY ATTRIBUTE

Página Inicial

 
4D v16.3
QUERY BY ATTRIBUTE

QUERY BY ATTRIBUTE 


 

QUERY BY ATTRIBUTE ( {umaTabela}{;}{opConj ;} campoObjeto ; caminhoAtributo ; opPesq ; valor {; *} ) 
Parâmetro Tipo   Descrição
umaTabela  Tabela in Tabela para a qual retornar uma seleção de registros, ou tabela padrão se for omitido
opConj  Operador in Operador de Conjunção para juntar múltiplas pesquisas
campoObjeto  Campo in Campo Objeto para atributos de pesquisa
caminhoAtributo  String in Nome ou caminho do atributo
opPesq  Operador, String in Operador pesquisa (comparador)
valor  Texto, Número, Data, Hora in Valor a comparar
Operador in Continua a flag de pesquisa

QUERY BY ATTRIBUTE localiza os  registros que correspondam com a string de consulta definida utilizando os parâmetros campoObjeto, caminhoAtributo, opPesqvalor e retorna uma seleção de registros para a tabela.

Nota: Para mais informações sobre os
campos Objeto (novos em 4D v15) , por favor, veja no manual de  Refência de Design.

QUERY BY ATTRIBUTE  altera a seleção atual de tabela para o processo atual e faz o primeiro registro da nova seleção do registro atual. Se o parâmetro tabela for omitido, o comando aplica-se a tabela como padrão. Se você não tiver definido qualquer tabela padrão, ocorre um erro.

O parâmetro opcional opConj é usado para combinar várias chamadas a QUERY BY ATTRIBUTE no caso de várias pesquisas. Os operadores de conjunção disponíveis são o mesmo que o comando QUERY:


ConjunçãoSímbolo a utilizar com QUERY BY ATTRIBUTE

AND

&
OR|
Except#

O parâmetro opConj não é usado para a primeira chamada para QUERY BY ATTRIBUTE de uma consulta múltipla, ou se a pesquisa for uma busca simples. Se você omitir esse parâmetro dentro de uma pesquisa múltipla, o operador AND (&) é usado como padrão.

Em campoObjeto, passe o campo objeto cujos atributos que você deseja pesquisar. Se pertence a uma tabela Um relacionada à tabela com uma relação automática ou manual, o campoObjeto pode pertencer a uma outra tabela.

Em caminhoAtributo, passe o nome ou o caminho do atributo cujos valores deseja comparar. Pode passar um único atributo, por exemplo, "age": nesse caso todos os atributos com o nome serão comparados no registro. Você pode também passar um caminho, por exemplo "children.girls.age", neste caso todos os atributos com este nome serão comparados no registro. Pode também passar um caminho,  por exemplo "children.girls.age", em cujo caso só os atributos coincidentes serão comparados no registro.

Se um atributo "x" for um array, QUERY BY ATTRIBUTE buscará registros que contenham um atributo "x" no qual ao menos um elemento coincida com os critérios. Para buscar em atributos array, é necessário indicar ao comando QUERY BY ATTRIBUTE que o atributo "x" é um array adicionando ".[]" a seu nome em caminhoAtributo (ver exemplo 3).

Notas:

  • Lembre que os nomes de atributos diferenciam entre maiusculas e minúsculas: pode ter diferentes nomes de atributos "MyAtt" e "myAtt" no mesmo registro.
  • Os nomes de atributos são cortados para eliminar espaços adicionais. Por exemplo, "meu primeiro atributo .meu segundo atributo" se interpreta como "meu primeiro atributo.meu segundo atributo".
O parâmetro opBusq é o operador de comparação que se aplica entre campoObjeto e valor. Pode passar um dos símbolos que se mostran aqui:

ComparaçãoSímbolo a utilizar com QUERY BY ATTRIBUTE

Igual a

=
Diferente de #
Menor que <
Maior que >
Menor ou igual a <=
Maior ou igual a >=
Nota: Você pode especificar o operador de comparação como uma expressão de texto em vez de um símbolo. Consulte a descrição do comando QUERY  para mais informações.

valor  é o dado contra o qual irá comparar caminhoAtributo. O valor pode ser qualquer expressão do mesmo tipo que caminhoAtributo. O valor é avaliado uma vez, no início da busca. O valor não é avaliado para cada registro. Para procurar uma string dentro de uma string (uma procura "contém"), use o sinal de arroba (@) em valor para isolar a string a pesquisar, como mostrado neste exemplo: "@ Smith @". Note-se que, neste caso, a busca apenas parcialmente se benefícia do índice (compacidade de armazenamento de dados).

Esta é a estrutura de uma consulta por atributos:

 QUERY BY ATTRIBUTE([Table] ;[Table]ObjectField ;"attribute1.attribute2";=;value)

NOta: um critério implícito para todos os operadores (exceto #) é que o campo Objeto contenha um atributo. Entretanto, para o operador #, ele pode ser indefinido (ver abaixo).

Pesquisas por atributo usando o operador  "#" pode ter diferentes resultados dependendo da propriedade  [#title id="3200" anchor="2287953"/] estar ou não marcada para o campo objeto:

Propriedade Map NULL values to blank values  marcada (opção padrão, recomendada na maioria dos casos).
Neste caso, o operador  "#" deveria ser visto como selecionando registros onde o campo  "no attribute" contém o valor pesquisado. Neste contexto, 4D considera-o de uma maneira similar:
  • campos onde o valor do atributo é diferente do valor pesquisado,
  • campos onde o atributo não está presente (ou contém um valor Null).
Por exemplo, a seguinte pesquisa retorna registros para pessoas que têm um cachorro cujo nome não é Rex, assim como registros para pessoas que não têm um cachorro, ou que têm um cachorro sem nome:

 QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex")

Outro exemplo: essa pesquisa retorna todos os registros para os quais [Table]ObjectField contém um objeto o qual possui um atributo attribute1 que é em si mesmo um objeto contendo um atributo attribute2 cujo valor não é value, assim como registros onde o campo objeto não contém attribute1 ou attribute2):

 QUERY BY ATTRIBUTE([Table] ;[Table]ObjectField ;"attribute1.attribute2";#;value)

Este princípio também se aplica aos atributos de array. Por exemplo:

 QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].city";#;"paris")

Esta pesquisa retornará registros para pessoas que não tem um endereço em Paris.

Para especificamente obter registros onde o atributo não é definido, pode usar um objeto vazio (ver exemplo 2).


Map NULL values to blank values propriedade desmarcada (modo "SQL").
Neste caso, atributos indefinidos (atributos não presentes neste campo ou cujos valores for Null) não são considerados como equivalente aos valores em branco como padrão. Como resultado, pesquisas do tipo "atributo A é diferente de atributo B" não vai retornar registros onde o atributo A for indefinido.
Para usar o mesmo exemplo que acima, quando a opção Map NULL values to blank values não estiver marcada para o campo  [People]Animals field, a persquisa abaixo vai retornar apenas registros para pessoas que tenham um cachorro cujo atributo "name" não contiver "Rex". Registros para pessoas que não tem um cachorro, ou que tem um cachorro sem nome não vão ser retornados neste caso.

 QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex")

Esta operação, mais similar à lógica SQL, é reservada para necessidades específicas

Aqui estão as regras a serem seguidas para a construção de várias pesquisas por atributo:

  • A primeira linha não deve conter uma conjunção.
  • Cada argumento de consulta sucessivo pode começar com uma conjunção. Se você omiti-lo, o operador AND (&) é usado por padrão.
  • Todas as linhas, exceto a última, deve usar o parâmetro *.
  • QUERY BY ATTRIBUTE  pode ser combinado com os comandos QUERY (ver exemplo).
  • Para realizar a pesquisar, não especifique o parâmetro * no último comando QUERY BY ATTRIBUTE. Alternativamente, você pode executar o comando QUERY sem parâmetros diferentes à da tabela.

Nota: Cada tabela mantém sua própria construção de pesquisa atual. Isto significa que você pode criar várias consultas simultaneamente, um para cada tabela.

Não importa a forma em que a pesquisa foi definida:

  • Se a operação de busca vai levar algum tempo para ser executada, 4D mostra automaticamente uma mensagem contendo um termômetro de progresso. Estas mensagens podem ser ligados e desligadas usando os comandos MESSAGES ON y MESSAGES OFF. Se um termômetro de progresso for exibido, o usuário pode clicar no botão Parar para parar a pesquisa. Se a consulta for concluída, OK é definido como 1. Caso contrário, se a consulta for interrompida, OK é definido como 0 (zero).
  • Se nenhum campo objeto indexado não for indicado, a pesquisa é otimizada sempre que for possível (campos indexados são procurados primeiro), resultando em uma busca que leva o mínimo de tempo possível.

As datas são armazenadas nos objectos com base nos parâmetros do banco de dados e; por padrão, se considera o fuso horário (veja selector JSON use local time no comando SET DATABASE PARAMETER). 

!1973-05-22!"></span></span><span id="result_box" lang="pt"><span title="[#codeJS]!1973-05-22!">[#codeJS]!1973-05-22! -> "1973-05-21T23:00:00.000Z"

Essa configuração também é considerada durante a busca, assim você não precisa se preocupar com isso, se você usar sempre a sua base no mesmo lugar e se os parâmetros são os mesmos em todos os computadores que acessam os dados. Neste caso, a seguinte busca retorna corretamente os registros cujo atributo é
Birthday  igual a !1973-05-22! (Salvo como"1973-05-21T23:00:00.00Z"):

 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Birthday";=;!1973-05-22!)

Se você não quiser usar o parâmetro GMT, você pode modificar esses parâmetros com a seguinte declaração:


 SET DATABASE PARAMETER(JSON use local time;0)

Lembnre que o escopo deste parâmetro é limitado ao process.. Se você executar este comando,  01 de outubro de 1965 se armazenará como "1965-10-01T00: 00: 00.000Z", mas você deve definir o mesmo parâmetro antes de iniciar suas pesquisas:

 SET DATABASE PARAMETER(JSON use local time;0)
 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Birthday";=;!1976-11-27!)

Pode usar a propriedade virtual "comprimento" com este comando. Esta propriedade está disponível automaticamente para qualquer atributo do tipo array e retorna o tamanho do array, ou seja, o número de elementos que o array contém. Pode ser usado no contexto de execução do comando QUERY BY ATTRIBUTE  (veja exemplo 4).

Neste exemplo, o atributo de "age" (idade) é uma string ou um inteiro e queremos encontrar pessoas cujas idades estão entre 20 e 29. As  primeiras duas linhas procuram o atributo como um número inteiro (> = 20 e <30) e as última consultam o campo como uma string (começando com "2", mas é diferente de "2".)

 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"age";>=;20;*)
 QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"age";<;30;*)
 QUERY BY ATTRIBUTE([Persons];|;[Persons]OB_Info;"age";=;"2@";*)
 QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"age";#;"2") //sem * para lançar a execução

O comando QUERY BY ATTRIBUTE pode ser usado para encontrar registros nos quais alguns atributos são definidos (ou não). Para isso, deve usar um objeto vazio.

  //Pesquisar os registros onde o correio eletrônico é definida no campo objeto
 C_OBJECT($undefined)
 QUERY BY ATTRIBUTE([Persons];[Persons]Info;"email";#;$undefined)

  //Pesquisar os registros onde o CEP- código postal não está definido no campo objeto
 C_OBJECT($undefined)
 QUERY BY ATTRIBUTE([Persons];[Persons]Info;"zip code";=;$undefined)

Nota: Essa sintaxe específica não é ocmpatível com atributos do tipo array. Pesquisar por valores NULL em elementos array dá resultados inválidos.

Você quer encontrar um campo que contém os atributos do array. Com os dois registros a seguir:

{
    "name":"martin",
    "locations" : [ {
                "kind":"office",
                "city":"paris" 
            } ]
} , {
    "name":"smith",
    "locations" : [ {
                "kind":"home",
                "city":"lyon" 
            } , {
                "kind":"office",
                "city":"paris" 
            } ]
}

... QUERY BY ATTRIBUTE encontra pessoas com uma localização "paris" usando este comando:

  //indica o atributo array com a sintaxe ".[]"
 QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations.[].city";=;"paris")
  //Seleciona "martin"e  "smith"

Nota: Se você tiver definido diversos critérios no mesmo atributo array, os critérios coincidentes não se aplicam necessariamente ao mesmo elemento do array. No exemplo a seguir, a pesquisa retornará "smith", porque tem um elemento "locations" cujo "kind" (tipo) é "home" e um elemento "locations", cujas "city" é "paris" Mesmo se esse não for o mesmo elemento:

 QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations.[].kind";=;"home";*)
 QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field;"locations.[].city";=;"paris")
  //Selecciona "smith"

 Este exemplo ilustra o uso da propriedade virtual "comprimento". Seu banco de dados tem um campo de objeto  [Customer]full_Data com os dados abaixo:

Se quiser obter os registros para qualquer cliente que tenha duas ou mais crianças, pode escrever:

 QUERY BY ATTRIBUTE([Customer];[Customer]full_Data;"Children.length";>=;2)

Se a pesquisa é realizada corretamente, a variável sistema OK toma o valor 1.
A variável Ok toma o valor 0 se:

  • o usuário clicar em Cancelar na caixa de diálogo de pesquisa,
  • em modo "pesquisa e bloqueio"! (ver o comandoSET QUERY AND LOCK ), a pesquisa encontra, no mínimo, um registro bloqueado. Nese caso, igualmente, o conjunto sistema LockedSet é atualizado.



Ver também 

Estrutura dos objetos de linguagem 4D
QUERY SELECTION BY ATTRIBUTE

 
PROPRIEDADES 

Produto: 4D
Tema: Pesquisas
Número 1331

Este comando modifica a variável sistema OKO comando altera o registro atualO comando altera a seleção atualThis command can be run in preemptive processes

 
HISTÓRIA 

Criado por: 4D v15

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)