ORDA – Genealogía – Cuarto episodio (a petición)

Traducido automáticamente de Deepl

En el primer, segundo y tercer episodio de esta serie, demostramos el poder de ORDA y lo simple que es manejar personas relacionadas con una sola tabla altamente recursiva.

El episodio de hoy se centra en la interfaz de usuario para ayudarle a crear listas y cuadrículas de aspecto agradable.

Descargar Genealogía – Episodio cuatro

Cuadros de lista y texto con estilo

Los cuadros de lista basados en matrices y selecciones permiten mostrar columnas de texto con estilo. Esto nos lleva a preguntarnos : «¿Puedo hacer lo mismo con los cuadros de lista basados en colecciones y selecciones de entidades?»

Como habrás adivinado la respuesta es , pero puede que no sepas cómo hacerlo.

Por supuesto, si los atributos de sus entidades ya tienen estilo, entonces «This.myStyledAttribute» hará el trabajo sin ninguna programación (siempre y cuando la propiedad «multi-style» de la columna esté marcada). Pero cuando tienes varios atributos (nombre, apellido, código postal, teléfono, etc.), tu objetivo es más bien…

mostrar esto… …en lugar de esto!

blank

¿Magia? en realidad no, pero sigue siendo fácil

En los dos casos anteriores, tenemos un cuadro de lista basado en una selección de entidades creada mediante DS (ver episodios anteriores). En lugar de mostrar un solo atributo (por ejemplo: Este.nombre) o incluso una expresión como «Este.Nombre+» «+Este.Apellido», la expresión de la columna es un método 4D que devuelve un texto completo.

En uno, el texto estáestilizado. En el otro, no.

Texto simple (sin estilo)

$text:=""
$text: =$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
$text:
=$text+This.Address+Char(Carriage return)
...
$text: =$text+"email: "+This.email+Char(Carriage return)
$0 : =$text

Texto con estilo basado en una plantilla

El truco aquí es crear una plantilla de texto con estilo. Para ello, basta con utilizar un área de texto con estilo como la que se muestra a la izquierda en el ejemplo siguiente.

El área de la derecha se muestra para recordarle que el texto con estilo se basa en las etiquetas span. Debe evitar las etiquetas span dentro de sus propias etiquetas. La cadena «[Lastname]» debe ser recuperada usando el comando replace string. . Esto no es posible con [Lastname] o [Lastname] (es decir, el primer carácter en estilo diferente de diferente color).

blank

$text
:=template
$text :=Replace string($texto;"[título]";This.Title)
$text :=Replace string($text;"[nombre]";This.Firstname)
...
$text :=Replace string($text;"[celda]";This.Cell)$text:=Replace string($text;"[correo electrónico]";This.email)
$0: =$text

Selecciones de entidades vs. Colecciones

«¿Qué? ¿Por qué tengo que compararlas? Son completamente diferentes».

«Sí, tienes razón. Pero espera…»

Los cuadros de lista basados en selecciones de entidades son geniales. Pueden contener miles de entidades, mostrarlas de forma muy rápida y agradable con tantas columnas como sea necesario. Pueden mostrar datos compactos (como se ve arriba) o atributos separados, etc.

Lo único que no pueden hacer es mostrar cuadrículas (matrices) de datos. No pueden mostrar un grupo de personas de 1 a 100 en una primera columna, luego continuar el grupo de 101 a 200 en una segunda columna, etc. Para ser honesto, los cuadros de lista basados en una colección tampoco pueden hacer eso, sin embargo hay una buena manera de hacerlo con muy poca programación.

Digamos que nuestro objetivo es mostrar un grupo de personas como este:

blankLa lista de arriba muestra sólo 9 personas, pero hay más en la selección de entidades, digamos que hay 28.

Un poco de matemáticas

Lo primero que tenemos que hacer es encontrar una manera de tener un número único de 0 a 28 para cada celda. Ya sea de izquierda a derecha, fila por fila; de arriba a abajo, o columna por columna.

blank

Para ello, basta con llamar a una función con dos parámetros: el número de fila y el número de columna. En este caso, el NúmeroDeColumnas es 3 ($colNum de 0 a 2) y el NúmeroDeFilas necesario es 10 ($rowNum de 0 a 9). Sabiendo esto, el cálculo es fácil:
Caso «A»: $rowNum+($colNum*NúmeroDeFilas)
Caso «B»: ($rowNum*NúmeroDeColumnas) + $colNum

El propio cuadro de lista mostrará una colección llena de números del 0 al 9 que representarán los números de las filas. Ahora es aún más sencillo; no es necesario enviar el número de fila a la función. ¡Cada vez que se llama a la función, el número de fila está representado por This.value! Así que sólo tienes que enviar el número de columna a la función para que pueda calcular el ID de acuerdo con el número de fila.

¿Y adivina qué? Eso es todo. En lugar de devolver el $i calculado como un longint, ¡sólo devuelve la información que necesitas como myEntity[$i].name como un texto! (sólo asegúrese de que el valor de $i es inferior a myEntities.length)

Ejemplo de código para el caso «A»:

Las expresiones para las columnas serán

CalcID(«vertical»;0) para la primera columna
CalcID(«vertical»;1) para la segunda columna
CalcID(«vertical»;2) para la 3ª columna
(etc; si hay más de 3 columnas)

¡Ahora veamos cómo es el método CalcID!

C_TEXT($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value // This.value is the current value of the collection (0,1,2,3,...)
$colNum :=$2 // $2 is given by the expression
Si ($1="vertical")
$0 :=$rowNum+($colNum*numberOfRows) // numberOfRows is a previously calculated value (ex: 10)
Else

$0 :=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")

End if

un truco más …

No es necesario crear funciones individuales por cada tipo de resultado que necesites. Simplemente envía un parámetro que determinará lo que necesitas a cambio y haz que tu función devuelva un objeto con el atributo solicitado rellenado.

En lugar de crear tres métodos (getName, getPicture, getBirthday para devolver un text, un picture y un date) y escribirlos en expresiones de columna…

getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date

… crear un único método getAttributeque devolverá un objeto rellenado según el parámetro enviado.

Pregunta: Dígame el nombre de la persona
Respuesta: ¡Aquí tienes un objeto con un atributo nombre que contiene lo que has pedido!

Este es un ejemplo del método getAttribute :

C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1="nombre")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="retrato")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1="cumpleaños")
$result .birthday:=contact.birthday
// birthday is requested: returned as attribute of $result
End case
$0:=$result

Una vez escrito este método, puedes llamarlo en expresiones de columna:

getAttribute("nombre").nombre // getAttribute returns an object
getAttribute ("retrato").portrait // getAttribute returns an object
getAttribute("cumpleaños").birthday // getAttribute returns an object

Diviértete y deja volar tu imaginación.

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.