ORDA – Genealogia – Episodio 4 (su richiesta!)

Tradotto automaticamente da Deepl

Nel primo, secondo e terzo episodio di questa serie, abbiamo dimostrato la potenza di ORDA e la semplicità con cui è possibile gestire le persone correlate con un’unica tabella altamente ricorsiva.

L’episodio di oggi si concentra sull’interfaccia utente per aiutarvi a creare elenchi e griglie dall’aspetto gradevole!

Scarica Genealogia – Episodio 4

Caselle di riepilogo e testo stilizzato

Le caselle di riepilogo basate su array e selezioni consentono di visualizzare colonne di testo stilizzato. Ciò fa sorgere la domanda: “Posso fare lo stesso con le caselle di riepilogo basate su collezioni e selezioni di entità?”.

Come avrete intuito, la risposta è , ma potreste non sapere come farlo!

Naturalmente, se gli attributi delle entità sono già stilizzati, allora “This.myStyledAttribute” farà il lavoro senza alcuna programmazione (purché la proprietà “multi-style” della colonna sia selezionata). Ma quando si hanno diversi attributi (nome, cognome, codice postale, telefono, ecc.), l’obiettivo è più…

visualizzare questo… …piuttosto che questo!

blank

Magico? Non proprio, ma comunque facile

In entrambi i casi sopra descritti, abbiamo una casella di riepilogo basata su una selezione di entità creata con DS (vedere le puntate precedenti). Invece di visualizzare un singolo attributo (es. This.name) o anche un’espressione come “This.Firstname+” “+This.Lastname”, l’espressione della colonna è un metodo 4D che restituisce un testo completo.

In uno, il testo èstilizzato. Nell’altro, non lo è.

Testo semplice (non stilizzato)

$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

Testo stilizzato basato su un modello

Il trucco consiste nel creare un modello di testo stilizzato. Per farlo, è sufficiente utilizzare un’area di testo stilizzata, come mostrato a sinistra nell’esempio sottostante.

L’area a destra è mostrata per ricordare che il testo stilizzato si basa sui tag span. È necessario evitare i tag span all’interno dei propri tag. La stringa “[Cognome]” deve essere recuperata con il comando replace string. Questo non è possibile con [Cognome] o [Nome] (cioè, il primo carattere con uno stile diverso e un colore diverso).

blank

$text:=template
$text :=Replace string($testo;"[titolo]";This.Title)
$text :=Replace string($text;"[nome]";This.Firstname)
...
$text :=Replace string($text;"[cella]";This.Cell)
$text :=Replace string($text;"[email]";This.email)
$0: =$text

Selezioni di entità vs. collezioni

“Cosa? Perché dovrei confrontarle? Sono completamente diverse!”.

“Sì, hai ragione. Ma aspettate…”

Le caselle di riepilogo basate sulla selezione delle entità sono fantastiche. Possono contenere migliaia di entità, visualizzarle in modo molto rapido e gradevole con tutte le colonne necessarie. Possono visualizzare dati compatti (come visto sopra) o attributi separati, ecc.

L’unica cosa che non possono fare è visualizzare griglie (matrici) di dati. Non possono visualizzare un gruppo di persone da 1 a 100 in una prima colonna, poi continuare il gruppo da 101 a 200 in una seconda colonna, ecc. A dire il vero, nemmeno le caselle di riepilogo basate su un insieme possono farlo, tuttavia esiste un modo simpatico per farlo con pochissima programmazione.

Supponiamo di voler visualizzare un gruppo di persone come questo:

blankL’elenco qui sopra mostra solo 9 persone, ma nella selezione delle entità ce ne sono di più, diciamo che ce ne sono 28.

un po’ di matematica

La prima cosa da fare è trovare un modo per avere un numero unico da 0 a 28 per ogni cella. Da sinistra a destra, riga per riga; dall’alto in basso o colonna per colonna.

blank

Per farlo, basta chiamare una funzione con due parametri: il numero di riga e il numero di colonna. In questo caso, il Numero di colonne è 3 ($colNum da 0 a 2) e il Numero di righe necessario è 10 ($rowNum da 0 a 9). Sapendo questo, il calcolo è facile:
Caso “A”: $rowNum+($colNum*NumberOfRows)
Caso “B”: ($rowNum*NumberOfColumns) + $colNum

La casella di riepilogo stessa visualizzerà un insieme di numeri da 0 a 9 che rappresenteranno i numeri delle righe. Ora è ancora più semplice: non è necessario inviare il numero di riga alla funzione. Ogni volta che la funzione viene chiamata, il numero di riga è rappresentato da This.value! Quindi è sufficiente inviare il numero di colonna alla funzione, in modo che possa calcolare l’ID in base al numero di riga!

E indovinate un po’? Ecco fatto! Invece di restituire il valore calcolato di $i come longint, basta restituire le informazioni necessarie come myEntity[$i].name come testo! (assicurarsi che il valore di $i sia inferiore a myEntities.length)

Esempio di codice per il caso “A”:

Le espressioni per le colonne saranno

CalcID(“verticale”;0) per la prima colonna
CalcID(“verticale”;1) per la seconda colonna
CalcID(“verticale”;2) per la 3a colonna
(ecc. se ci sono più di 3 colonne)

Ora vediamo come si presenta il metodo 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
Se ($1= "verticale")
$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 altro trucco …

Non è necessario creare funzioni individuali per ogni tipo di risultato richiesto. Basta inviare un parametro che determini ciò che si desidera in cambio e fare in modo che la funzione restituisca un oggetto con l’attributo richiesto riempito!

Invece di creare tre metodi (getName, getPicture, getBirthday per restituire un text, un picture e un date) e digitarli nelle espressioni di colonna…

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

… creare un singolo metodo getAttributeche restituirà un oggetto riempito in base al parametro inviato.

Domanda: Dammi il nome della persona!
Risposta: Ecco un oggetto con un attributo name contenente ciò che avete chiesto!

Ecco un esempio del metodo getAttribute :

C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1="nome")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="ritratto")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1="compleanno")
$result .birthday:=contact.birthday
// birthday is requested: returned as attribute of $result
End case
$0:=$result

Una volta scritto questo metodo, è possibile richiamarlo nelle espressioni di colonna:

getAttribute("nome").nome // getAttribute returns an object
getAttribute ("ritratto").portrait // getAttribute returns an object
getAttribute("compleanno").birthday // getAttribute returns an object

Divertitevi e date sfogo alla vostra immaginazione!

Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.