ORDA – Genealogia – 2º Episódio

Tradução automática de Deepl

No primeiro episódio desta trilogia, demonstrámos o básico da ORDA utilizando caixas de listagem, entidades, e selecções de entidades. Hoje, vamos um pouco mais fundo, fazendo algumas perguntas que aproveitarão as relações recursivas. Também vamos dar uma vista de olhos rápida sobre como exibir caixas de listagem usando a propriedade “meta info expression “.

Descarregar Genealogia – Episódio dois

cenário de utilização de caixas

Seleccionei uma pessoa numa lista muito grande, e agora quero encontrar os seus pais e avós. Também quero os seus irmãos … e filhos, se os tiverem! Porque não tias e tios … e primos?
Será que tudo isso levará uma eternidade? Vamos descobrir.

comecemos pelo princípio!

A selecção da entidade pessoas conterá pessoas nascidas depois de 1 de Janeiro de 1960, e serão salvas dentro do objecto Forma:

Form.people:=ds.PEOPLE.query("Birthday >= :1";!1960-01-01!).orderBy("Birthday asc, Lastname asc, Firstname asc")

Note este formato de consulta altamente recomendado, utiliza placeholders (:1) e parâmetros (!1960-01-01!).

CONFIGURAR A CAIXA DE LISTAGEM

Como vimos no post anterior, a selecção da entidade(Form.people) é criada no início como a propriedade de selecção da entidade.

A caixa de listagem, com base numa selecção de entidade, tem um par de novas propriedades. Iremos descrever três delas: Item actual, itens seleccionados, e expressão Meta info.

O item actual, bem como os itens seleccionados, serão automaticamente actualizados quando o utilizador alterar a selecção da caixa de listagem:

O item Actual conterá a entidade seleccionada (OU a última adicionada, em caso de múltiplas selecções). Se não houver nenhum item seleccionado na lista, esta entidade será nula.

blank

O item seleccionado é uma selecção de entidade. Irá conter todos os itens seleccionados na lista, independentemente da forma como foram seleccionados (shift+click, control+click, etc.). Esta selecção de entidade existirá sempre, mas pode estar vazia.

blank

A expressão Meta info é descrita abaixo, no final deste post.

MEMBROS DA FAMÍLIA

Durante o evento de mudança de selecção da caixa da lista principal, precisamos de encontrar os pais, as crianças, e os irmãos das pessoas seleccionadas:

Form.parents:=GetParents (Form.persons)
Form .children:=GetChildren (Form.persons)
Form .siblings:=GetSiblings (Form.persons)

Depois, uma vez criadas estas selecções de entidades, é realmente fácil encontrar avós, tios e tias, bem como primos. Os avós são os pais dos pais, tios e tias são os irmãos dos pais, e primos são os filhos dos tios e tias!

Form.grandParents:=GetParents (Form.parents)
Form .auntsAndUncles:=GetSiblings (Form.parents)
Form .cousins:=GetChildren (Form.auntsAndUncles)

Consultas

Encontrar membros relacionados é realmente fácil quando se usa ORDA. Cada método “Get” recebe uma selecção de entidade como parâmetro e devolve outra selecção de entidade (com base no conteúdo ou no recebido).

Pais

O método GetParents recebe o Form.parents como parâmetro de $1. Vamos dar-lhe o nome de $_pessoas.
(O sublinhado está aqui apenas para ajuda visual para fazer uma distinção fácil entre “entidade” e “selecção de entidade”).

Só para lembrar, Mãe e Pai são as entidades definidas nas definições da relação. São os nomes das relações “N a 1”.

A magia da ORDA é que pode devolver ou uma única entidade ($person.Mother, $person.Father, $person.Partner) quando utilizada com uma única entidade ($person) OU uma selecção de entidade quando utilizada com outra selecção de entidade ($_persons).

$_pessoas:=$1
$_pais:=$_pessoas.Mãe.or($_pessoas.Pai)
$0:=$_pais

crianças

O mesmo se aplica às selecções de entidades definidas para as relações “1 a n”.

// Note: the text below fits on a single line
$_crianças:=$_pessoas.ChildrenAsFather (...)
.or($_persons.ChildrenAsMother) (...)
.orderBy("Birthday asc")

Os irmãos

Para os irmãos, precisamos de usar para múltiplos relacionamentos. Primeiro para encontrar o Pai, depois para encontrar os Filhos do Pai, seguido de um“ou” lógico aplicado às Mães, depois um“menos” lógico para remover pessoas das suas listas de irmãos(os pais de Paulo têm dois filhos, Paulo e João, mas Paulo tem apenas um irmão, João…)

// Note: the text below fits on a single line
$_siblings:=$_persons.Pai.Filhos-Pai (...)
.or($_persons.Mãe.Filhos-Mãe) (...)
.minus($_persons)

Resultado final

Agora que encontramos os membros da família por categoria, vamos exibi-los noutras caixas de listagem (com o mesmo tipo de informação que a caixa de listagem principal). Depois, tudo o que temos de fazer é duplicar as caixas de listagem e alterar os nomes das suas propriedades de selecção de entidades para Form.grandParents, Form.parents, Form.siblings, Form.children, etc.

blank

Expressão meta-intérprete

A expressão Meta info é um Método 4D que (geralmente) recebe isto como primeiro parâmetro e devolve um objecto. Nas figuras acima, este método é utilizado para desenhar fundos de linhas azul e rosa.

O objecto devolvido tem um par de propriedades que são aqui definidas. Neste caso, a única propriedade que utilizamos é o preenchimento.

$person:=$1
$meta :=New object()
$even :=(($person.indexOf()%2)=0) // is it an even or and odd row ?
If ($person.Gender=True) // women
If ($even)
$meta .fill:="#FFF0F0" // women light
Else
$meta .fillEnd if:="#FFE8E8" // women a bit darker

End if
Else // man fill If ($even)
$meta .fill:="#E8F8FF" // men light
Else
$meta . :="#E0F0FF"// men a bit darker
End if

$0:=$meta

Conclusão

Esta base de dados contém basicamente SEVEN linhas de código!

A primeira consulta para preencher o Form.people, depois uma linha de código dentro dos seis métodos “Get…”. Simples e poderoso.

Então porque é que tenho a sensação de me ter esquecido de alguma coisa? Oh sim … é rápido? O tempo médio para encontrar as seis categorias de familiares para uma única pessoa dentro de um grupo de muitos milhares de outras pessoas é de cerca de 1 ms (testado num iMac 4.2Ghz Core i7 16Gb).

blank

Se a selecção de pessoas for muito maior(digamos, 7284), o tempo médio é de 6 ms.

blank

Experimente-o você mesmo. Descarregue a demonstração e aprecie ORDA !

Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.