4D v16.3

Présentation des ensembles

Accueil

 
4D v16.3
Présentation des ensembles

Présentation des ensembles  


 

 

Les ensembles sont un moyen puissant et rapide de manipuler des sélections d'enregistrements. En plus de la possibilité de créer des ensembles, de les relier à la sélection courante, de les stocker, de les charger et de les effacer, 4D permet d'effectuer trois opérations standard sur les ensembles :

  • Intersection,
  • Union,
  • Différence.

Un ensemble est une représentation d'une sélection d'enregistrements. L'idée d'ensemble est intimement liée à celle de sélection courante. Les ensembles sont généralement utilisés pour les raisons suivantes :

  • Sauvegarder et ensuite restaurer une sélection lorsque l'ordre n'a pas d'importance,
  • Accéder à la sélection que l'utilisateur a faite à l'écran (l'ensemble UserSet),
  • Réaliser une opération logique entre des sélections.

La sélection courante est une liste de références qui pointent vers chaque enregistrement actuellement sélectionné. La liste existe en mémoire. Seuls les enregistrements sélectionnés sont dans la liste. Une sélection ne contient pas en réalité les enregistrements, mais seulement une liste de références à ces enregistrements. Chaque référence à un enregistrement utilise 4 octets en mémoire. Lorsque vous travaillez sur une table, vous travaillez toujours avec les enregistrements de la sélection courante. Lorsqu'une sélection est triée, seule la liste des références est réorganisée. Il n'y a qu'une sélection courante pour chaque table dans un process.

Comme une sélection courante, un ensemble représente une sélection d'enregistrements. Un ensemble le fait en utilisant une représentation très compacte pour chaque enregistrement. En effet, chacun est représenté par un bit (un huitième d'octet). Les opérations utilisant les ensembles sont très rapides parce les ordinateurs accomplissent très rapidement les opérations sur les bits. Un ensemble contient un bit pour chaque enregistrement de la table, que l'enregistrement soit inclus dans l'ensemble ou non. En fait, chaque bit est égal à 1 ou 0 — tout dépend si l'enregistrement est dans l'ensemble ou non.

Les ensembles sont très économiques en termes de mémoire RAM. La taille d'un ensemble, en octets, est toujours égale au nombre total des enregistrements dans la table divisé par huit. Ainsi, pour une table contenant 10 000 enregistrements, l'ensemble prend 1250 octets, ce qui fait environ 1,2 Ko de RAM.

Il peut exister plusieurs ensembles pour chaque table. En fait, les ensembles peuvent être sauvegardés sur disque indépendamment de la base. Pour modifier un enregistrement appartenant à un ensemble, vous devez d'abord utiliser l'ensemble comme sélection courante, puis modifier l'enregistrement.

Un ensemble n'est jamais trié — les enregistrements sont simplement marqués comme appartenant ou non à l'ensemble. En revanche, une sélection temporaire est triée, mais requiert davantage de mémoire dans la plupart des cas. Pour plus d'information sur les sélections temporaires, reportez-vous à la section Présentation des Sélections Temporaires.

Au moment de sa création, un ensemble “mémorise” l'enregistrement courant de la sélection.

ComparaisonSélection couranteEnsembles
Nombre par table1illimité
TriableOuiNon
Sauvegardable sur disqueNonOui
RAM par enreg. (en octets)Nb enreg. sélec*4Nb total enreg./8
CombinableNonOui
Contient enreg. courantOuiOui, celui du moment de création

L'ensemble que vous créez appartient à la table dans laquelle il a été créé. Les opérations sur les ensembles ne peuvent être effectuées qu'entre ensembles appartenant à la même table.

Les ensembles sont indépendants des données, ce qui signifie qu'après des modifications dans une table, un ensemble peut n'être plus exact. Bien des opérations peuvent rendre un ensemble inexact. Si vous créez un ensemble de tous les habitants de New York et changez ensuite les données de l'un des enregistrements par “New Jersey,” l'ensemble ne change pas puisqu'il est simplement la représentation d'une sélection d'enregistrements. L'ajout ou la suppression d'enregistrements peut également rendre un ensemble obsolète, de même que le compactage des données. Les ensembles ne sont exacts que tant que la sélection d'origine n'est pas modifiée.

Vous pouvez utiliser trois types d'ensembles :

  • Ensembles process : Un ensemble process n'est accessible que par le process dans lequel il a été créé. L'ensemble système LockedSet est un ensemble process. Les ensembles process sont effacés dès que la méthode du process est achevée. Les ensembles process ne requièrent pas de préfixe pour leur nom.
  • Ensembles interprocess : Un ensemble est interprocess lorsque son nom est précédé des symboles (<>) — le signe “inférieur à” suivi du signe “supérieur à”. Cette syntaxe est utilisable à la fois sous Windows et Mac OS. Sous Mac OS, vous pouvez aussi utiliser le symbole “diamant” (Option+v sur un clavier français).
    Un ensemble interprocess est “visible” par tous les process de la base.
    En client/serveur, un ensemble interprocess est “visible” par tous les process du poste sur lequel il a été créé (client ou serveur).
    Le nom d'un ensemble interprocess doit être unique dans la base.
  • Ensembles locaux/Ensembles client : Les ensembles locaux/client sont principalement destinés au mode client/serveur. Leur nom est toujours précédé du symbole dollar ($) — à l'exception de l'ensemble système UserSet. A la différence des autres types d'ensembles, un ensemble local/client est stocké sur le poste client.

Notes :

  • La taille maximale d'un nom d'ensemble est de 255 caractères (hors symboles <> et $).
  • Pour plus d'informations sur l'utilisation des ensembles en client/serveur, reportez-vous à la section 4D Server, ensembles et sélections dans le Guide de référence de 4D Server.

Le tableau suivant indique les principes de visibilité des ensembles en fonction de leur portée et de leur lieu de création :

Un ensemble peut être créé à l'intérieur d'une transaction. Il est donc possible de définir un "ensemble des enregistrements créés pendant la transaction" et un "ensemble des enregistrements créés ou modifiés en-dehors de la transaction". Une fois la transaction terminée, l'ensemble créé pendant la transaction doit être effacé car il pourrait ne plus être une représentation exacte des enregistrements, surtout si la transaction a été annulée.

Cet exemple détruit des enregistrements doublons dans une table. La table contient des informations sur des personnes. Une structure répétitive Boucle...Fin de boucle parcourt tous les enregistrements, comparant l'enregistrement courant à l'enregistrement précédent. Si le nom, l'adresse et le code postal sont identiques, l'enregistrement est ajouté à un ensemble. A la fin de la boucle, l'ensemble devient la sélection courante et l'ancienne sélection courante est détruite :

 CREATE EMPTY SET([Personnes];"Doublons")
  // Créer un ensemble vide pour les doublons
 ALL RECORDS([Personnes])
  // Tous les enregistrements
  // Trier les enregistrements par code postal, adresse et nom pour
  // que les doublons soient les uns à côté des autres
 ORDER BY([Personnes];[Personnes]CODEPOSTAL;>;[Personnes]Adresse;>;[Personnes]Nom;>)
  // Initialiser les variables conservant les champs des enregistrements précédents
 $Nom:=[Personnes]Nom
 $Adresse:=[Personnes]Adresse
 $CODEPOSTAL:=[Personnes]CODEPOSTAL
  // Aller au second enregistrement pour le comparer au premier
 NEXT RECORD([Personnes])
 For($i;2;Records in table([Personnes]))
  // Parcourir les enregistrements en partant à 2
  // Si nom, adresse et CODEPOSTAL sont identiques au
  // précédent enregistrement, alors c'est un doublon.
    If(([Personnes]Nom=$Nom) & ([Personnes]Adresse=$Adresse) & ([Personnes]CODEPOSTAL=$CODEPOSTAL))
  // Ajouter enregistrement (le doublon) à l'ensemble
       ADD TO SET([Personnes];"Doublons")
    Else
  // Garder les nom, adresse et CODEPOSTAL de cet enregistrement pour comparer avec le prochain
       $Nom:=[Personnes]Nom
       $Adresse:=[Personnes]Adresse
       $CODEPOSTAL:=[Personnes]CODEPOSTAL
    End if
  // Passer à l'enregistrement suivant
    NEXT RECORD([Personnes])
 End for
  // Utiliser doublons trouvés (en tant que sélection courante)
 USE SET("Doublons")
  // Détruire doublons
 DELETE SELECTION([Personnes])
  // Supprimer l'ensemble de la mémoire
 CLEAR SET("Doublons")

Au lieu de supprimer immédiatement les enregistrements à la fin de la méthode, vous pouvez les afficher à l'écran ou les imprimer si des comparaisons plus fines doivent être menées.

4D gère un ensemble système local/client nommé UserSet. UserSet contient automatiquement l'ensemble des derniers enregistrements marqués (“surlignés”) à l'écran par l'utilisateur dans un formulaire en liste. Ainsi, vous pouvez afficher un groupe d'enregistrements avec MODIFY SELECTION ou DISPLAY SELECTION , demander à l'utilisateur d'en sélectionner certains et retourner le résultat de cette sélection manuelle dans un ensemble que vous nommez ou dans une sélection.

Il existe un seul UserSet par process. Les tables ne disposent pas de leur propre UserSet. Le UserSet n'est associé à une table que lorsqu'une sélection d'enregistrements est affichée pour cette table.

4D gère l'ensemble UserSet pour les formulaires liste affichés en mode Développement et via les commandes MODIFY SELECTION ou DISPLAY SELECTION. En revanche, ce mécanisme n'est pas actif pour les sous-formulaires.

La méthode ci-dessous illustre comment afficher des enregistrements pour permettre à l'utilisateur d'en sélectionner quelques-uns, et ensuite utiliser le UserSet pour afficher les enregistrements sélectionnés :

  ` Afficher tous les enregistrements et permettre à l'utilisateur d'en sélectionner un certain nombre.
  ` Puis afficher cette sélection en utilisant UserSet pour modifier la sélection courante.
 FORM SET OUTPUT([Personnes];"Display") ` Choisir le formulaire sortie
 ALL RECORDS([Personnes]) ` Sélection de toutes les personnes
 ALERT("Appuyer Ctrl ou Commande + Clic pour sélectionner des enregistrements.")
 DISPLAY SELECTION([Personnes]) ` Afficher les personnes
 USE SET("UserSet") ` Utiliser les personnes sélectionnées
 ALERT("Vous avez choisi les personnes suivantes.")
 DISPLAY SELECTION([Personnes]) ` Afficher les personnes sélectionnées

4D Server : Bien que son nom ne débute pas par le caractère "$", l'ensemble système UserSet est un ensemble client. Par conséquent, lors de l'utilisation des commandes INTERSECTION, UNION et DIFFERENCE, veillez à ne comparer UserSet qu'à d'autres ensembles clients. Pour plus d'informations, reportez-vous aux descriptions de ces commandes ainsi qu'à la section 4D Server, ensembles et sélections dans le Guide de référence de 4D Server.

Les commandes APPLY TO SELECTION, DELETE SELECTION, ARRAY TO SELECTION et JSON TO SELECTION créent un ensemble système nommé LockedSet lorsqu'elles sont utilisées en environnement multiprocess.
Les commandes de recherche créent également un ensemble système LockedSet lorsqu'elles trouvent des enregistrements verrouillés dans le contexte de 'recherche et verrouillage' (cf. commande SET QUERY AND LOCK).
LockedSet indique quels enregistrements étaient verrouillés lors de l'exécution d'une commande.



Voir aussi  

Identifiants

 
PROPRIÉTÉS 

Produit : 4D
Thème : Ensembles

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)