ORDA – Généalogie – Episode quatre (sur demande !)

Traduit automatiquement de Deepl

Dans les premier, deuxième et troisième épisodes de cette série, nous avons démontré la puissance d’ORDA et la simplicité de la gestion des personnes liées à l’aide d’une seule table, hautement récursive.

L’épisode d’aujourd’hui se concentre sur l’interface utilisateur pour vous aider à créer de belles listes et grilles !

Télécharger Généalogie – Episode quatre

Boîtes de liste et texte stylisé

Les boîtes de liste basées sur des tableaux et des sélections permettent d’afficher des colonnes de texte stylisé. D’où la question suivante : « Puis-je faire la même chose avec des boîtes de liste basées sur des collections et des sélections d’entités ? ».

Comme vous l’avez sans doute deviné, la réponse est oui, mais vous ne savez peut-être pas comment faire !

Bien sûr, si les attributs de vos entités sont déjà stylisés, alors « This.myStyledAttribute » fera le travail sans aucune programmation (tant que la propriété « multi-style » de la colonne est cochée). Mais lorsque vous avez plusieurs attributs (nom, prénom, code postal, téléphone, etc.), votre objectif est plutôt…

d’afficher ceci… …plutôt que cela !

blank

Magique ? pas vraiment, mais TOUJOURS facile

Dans les deux cas ci-dessus, nous avons une boîte de liste basée sur une sélection d’entités créée à l’aide de DS (voir épisodes précédents). Plutôt que d’afficher un seul attribut (ex : This.name) ou même une expression comme « This.Firstname+ » « +This.Lastname », l’expression de la colonne est une méthode 4D qui renvoie un texte complet.

Dans l’une, le texte eststylé. Dans l’autre, il ne l’est pas.

Texte simple (non stylé)

$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

Texte stylé basé sur un modèle

L’astuce ici consiste à créer un modèle de texte stylé. Pour ce faire, il suffit d’utiliser une zone de texte stylé comme indiqué à gauche dans l’exemple ci-dessous.

La zone de droite est présentée pour vous rappeler que le texte stylé est basé sur des balises span. Vous devez éviter les balises span dans vos propres balises. La chaîne « [Lastname] » doit être récupérée à l’aide de la commande replace string. . Cela n’est pas possible avec [Lastname] ou [Lastname] (c’est-à-dire le premier caractère dans un style différent ou une couleur différente).

blank

$text:=template
$text :=Replace string($text; "[title]" ;This.Title)
$text :=Replace string($text; "[firstname]" ;This.Firstname)
...
$text :=Replace string($text; "[cell]" ;This.Cell)
$text :=Replace string($text; "[email]" ;This.email)
$0: =$text

Sélections d’entités vs Collections

 » Quoi ? Pourquoi devrais-je les comparer ? Elles sont complètement différentes ! »

« Oui, vous avez raison. Mais attendez… »

Les boîtes de liste basées sur les sélections d’entités sont géniales. Elles peuvent contenir des milliers d’entités, les afficher très rapidement et joliment avec autant de colonnes que nécessaire. Elles peuvent afficher des données compactes (comme ci-dessus) ou des attributs séparés, etc.

La seule chose qu’ils ne peuvent pas faire est d’afficher des grilles (matrices) de données. Elles ne peuvent pas afficher un groupe de personnes de 1 à 100 dans une première colonne, puis continuer le groupe de 101 à 200 dans une deuxième colonne, etc. Pour être honnête, les boîtes de liste basées sur une collection ne peuvent pas faire cela non plus, mais il existe une façon agréable de le faire avec très peu de programmation.

Disons que notre objectif est d’afficher un groupe de personnes comme ceci :

blankLa liste ci-dessus ne montre que 9 personnes, mais il y en a plus dans la sélection d’entités, disons qu’il y en a 28.

Un petit calcul

La première chose que nous devons faire est de trouver un moyen d’avoir un nombre unique de 0 à 28 pour chaque cellule. Soit de gauche à droite, ligne par ligne; de haut en bas, ou colonne par colonne.

blank

Pour ce faire, il suffit d’appeler une fonction avec deux paramètres : le numéro de ligne et le numéro de colonne. Dans ce cas, le NumberOfColumns est 3 ($colNum de 0 à 2) et le NumberOfRows nécessaire est 10 ($rowNum de 0 à 9). Sachant cela, le calcul est facile :
Cas « A » : $rowNum+($colNum*NumberOfRows)
Cas « B » : ($rowNum*NombreDeColonnes ) + $colNum

La zone de liste elle-même affichera une collection remplie de chiffres de 0 à 9 qui représenteront les numéros de ligne. Maintenant, c’est encore plus simple : il n’est pas nécessaire d’envoyer le numéro de ligne à la fonction. Chaque fois que la fonction est appelée, le numéro de ligne est représenté par This.value ! Il suffit donc d’envoyer le numéro de colonne à la fonction pour qu’elle puisse calculer l’ID en fonction du numéro de ligne !

Et devinez quoi ? C’est tout ! Plutôt que de renvoyer le calcul de $i sous forme de longint, il suffit de renvoyer les informations dont vous avez besoin comme myEntity[$i].name sous forme de texte! (assurez-vous simplement que la valeur de $i est inférieure à myEntities.length)

Exemple de code pour le cas « A » :

Les expressions pour les colonnes seront

CalcID(« vertical » ;0) pour la 1ère colonne
CalcID(« vertical » ;1) pour la 2ème colonne
CalcID(« vertical » ;2) pour la 3ème colonne
(etc ; si plus de 3 colonnes)

Voyons maintenant à quoi ressemble la méthode 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
If ($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

Une autre astuce…

Il n’est pas nécessaire de créer des fonctions individuelles pour chaque type de résultat dont vous avez besoin. Il suffit d’envoyer un paramètre qui déterminera ce dont vous avez besoin en retour et de faire en sorte que votre fonction renvoie un objet avec l’attribut demandé rempli !

Plutôt que de créer trois méthodes (getName, getPicture, getBirthday pour retourner un text, un picture et un date) et de les taper dans des expressions de colonnes…

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

… créer une seule méthode getAttributequi retournera un objet rempli selon le paramètre que vous avez envoyé.

Question : Donnez-moi le nom de la personne !
Réponse : Voici un objet avec un attribut nom contenant ce que vous avez demandé !

Voici un exemple de la méthode getAttribute :

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

Une fois cette méthode écrite, vous pouvez l’appeler dans des expressions de colonnes :

getAttribute("name").name // getAttribute returns an object
getAttribute ("portrait").portrait // getAttribute returns an object
getAttribute("anniversaire").birthday // getAttribute returns an object

Amusez-vous bien et laissez libre cours à votre imagination !

Roland Lannuzel
- Product Owner & 4D Expert - Après avoir étudié l'électronique, Roland s'est lancé dans l'informatique industrielle en tant que développeur et consultant, créant des solutions pour les clients avec une variété de bases de données et de technologies. À la fin des années 80, il est tombé amoureux de 4D et l'a utilisé pour écrire des applications commerciales, notamment des systèmes de comptabilité, de facturation et de messagerie électronique. Il a rejoint la société en 1997 et a contribué à la conception de spécifications, d'outils de test et de démonstrations, ainsi qu'à la formation et à la présentation de la communauté 4D lors de nombreuses conférences. Il continue à façonner activement l'avenir de 4D en définissant de nouvelles fonctionnalités et des outils de développement de bases de données.