ORDA – Genealogía – Segundo episodio

Traducido automáticamente de Deepl

En el primer episodio de esta trilogía, demostramos los fundamentos de ORDA utilizando cuadros de lista, entidades y selecciones de entidades. Hoy, vamos a profundizar un poco más ejecutando algunas consultas que aprovecharán las relaciones recursivas. También echaremos un vistazo rápido a cómo mostrar los cuadros de lista de forma agradable utilizando la propiedad «meta info expression».

Descargar Genealogía – Episodio dos

caso de uso

He seleccionado una persona en una lista muy grande, y ahora quiero encontrar a sus padres y abuelos. También quiero a sus hermanos… ¡y a sus hijos si los tiene! ¿Y por qué no los tíos y tías… y los primos?
¿Tomará todo eso una eternidad? Averigüémoslo.

¡empecemos por el principio!

La selección de la entidad people contendrá las personas nacidas después del 1 de enero de 1960, y se guardará dentro del objeto Form:

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

Tenga en cuenta que este formato de consulta es muy recomendable, ya que utiliza marcadores de posición (:1) y parámetros (!1960-01-01!).

CONFIGURAR EL CUADRO DE LISTA

Como vimos en el post anterior, la selección de entidad(Form.people) se configura al principio como la propiedad de selección de entidad.

El cuadro de lista, basado en una selección de entidad, tiene un par de propiedades nuevas. Describiremos tres de ellas: Elemento actual, Elementos seleccionados y Meta info expresión.

Tanto el elemento actual como los elementos seleccionados se actualizarán automáticamente cuando el usuario cambie la selección del cuadro de lista:

El elemento actual contendrá la entidad seleccionada (O la última añadida, en caso de selecciones múltiples). Si no hay ningún elemento seleccionado en la lista, esta entidad será nula.

blank

El elemento Seleccionado es una selección de entidades. Contendrá todos los elementos seleccionados en la lista, sea cual sea la forma en que hayan sido seleccionados (shift+clic, control+clic, etc.). Esta entidad de selección siempre existirá, pero puede estar vacía.

blank

La expresión Meta info se describe más abajo, al final de este post.

MIEMBROS DE LA FAMILIA

Durante el evento de cambio de selección del cuadro de lista principal, necesitamos encontrar los padres, los hijos y los hermanos de las personas seleccionadas:

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

Entonces, una vez que hemos creado estas selecciones de entidades, encontrar a los abuelos, tíos y tías, así como a los primos, es realmente fácil. Los abuelos son los padres de los padres, los tíos son los hermanos de los padres y los primos son los hijos de los tíos.

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

Consultas

Encontrar miembros relacionados es realmente fácil cuando se utiliza ORDA. Cada método «Get» recibe una selección de entidades como parámetro y devuelve otra selección de entidades (basada en el contenido o en el recibido).

Padres

El método GetParents recibe el parámetro Form.parents como $1. Llamémoslo $_personas.
(El guión bajo está aquí sólo como ayuda visual para distinguir fácilmente entre «entidad» y «selección de entidades»).

Sólo un recordatorio, Madre y Padre son las entidades definidas en las definiciones de relación. Son los nombres de las relaciones «N a 1».

La magia de ORDA es que puede devolver una sola entidad ($persona.Madre, $persona.Padre, $persona.Compañero) cuando se utiliza con una sola entidad ($persona) O una selección de entidades cuando se utiliza con otra selección de entidades ($_personas).

$_personas:=$1
$_padres:=$_personas.Madre.o($_personas.Padre)
$0:=$_padres

hijos

Lo mismo ocurre con las selecciones de entidades definidas para las relaciones «1 a n».

// Note: the text below fits on a single line
$_hijos:=$_personas.HijosComoPadre (...)
.or($_personas.HijosComoMadre) (...)
.orderBy("Cumpleaños asc")

Hermanos

Para los hermanos, necesitamos usar múltiples relaciones. Primero para encontrar al Padre, luego para encontrar a los Hijos del Padre, seguido de un « lógico aplicado a las Madres, luego un«menos» lógico para eliminar a las personas de sus listas de hermanos(los padres de Pablo tienen dos hijos, Pablo y Juan, pero Pablo sólo tiene un hermano, Juan…)

// Note: the text below fits on a single line
$_hermanos:=$_personas.Padre.HijosComoPadre (...)
.or($_personas.Madre.HijosComoMadre) (...)
.minus($_personas)

Resultado final

Ahora que hemos encontrado los miembros de la familia por categoría, los mostraremos en otros cuadros de lista (con el mismo tipo de información que el cuadro de lista principal). Entonces, todo lo que tenemos que hacer es duplicar los cuadros de lista y cambiar sus nombres de propiedades de selección de entidades a Form.grandParents, Form.parents, Form.siblings, Form.children, etc.

blank

Expresión Meta info

La expresión Meta info es un Método 4D que (normalmente) recibe This como primer parámetro y devuelve un objeto. En las imágenes de arriba, este método se utiliza para dibujar fondos de fila azules y rosas.

El objeto devuelto tiene un par de propiedades que se definen aquí. En este caso, la única propiedad que utilizamos es fill.

$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 .fill:="#FFE8E8" // women a bit darker
End if
Else // man
If ($even)
$meta .fill:="#E8F8FF" // men light
Else
$meta .fill:="#E0F0FF"// men a bit darker
End if
End if
$0:=$meta

Conclusión

¡Esta base de datos contiene básicamente SIETE líneas de código!

La primera consulta para llenar Form.people, luego una línea de código dentro de los seis métodos «Get…». Simple y poderoso.

Entonces, ¿por qué tengo la sensación de haber olvidado algo? Ah, sí… ¿es rápido? El tiempo medio para encontrar las seis categorías de parientes para una sola persona dentro de un grupo de muchos miles de otras personas es de aproximadamente 1 ms (probado en un iMac 4.2Ghz Core i7 16Gb).

blank

Si la selección de personas es mucho mayor(digamos, 7284), el tiempo medio es de 6 ms.

blank

Pruébalo tú mismo. ¡Descarga la demo y disfruta de ORDA !

Roland Lannuzel
- Propietario de Producto y Experto en 4D - Después de estudiar electrónica, Roland se dedicó a la informática industrial como desarrollador y consultor, construyendo soluciones para clientes con una variedad de bases de datos y tecnologías. A finales de los años 80 se enamoró de 4D y lo ha utilizado para escribir aplicaciones de negocio que incluyen sistemas de contabilidad, facturación y correo electrónico.Eventualmente se unió a la compañía en 1997, las valiosas contribuciones de Roland incluyen el diseño de especificaciones, herramientas de prueba, demos, así como la formación y hablar con la comunidad 4D en muchas conferencias. Continúa dando forma activamente al futuro de 4D definiendo nuevas características y herramientas de desarrollo de bases de datos.