4D v16

Ensembles et sélections temporaires

Accueil

 
4D v16
Ensembles et sélections temporaires

Ensembles et sélections temporaires    


 

 

En complément des manipulations expliquées dans la vidéo, il faut noter que :

En termes de mémoire :

  • une sélection nécessite 4 octets par enregistrement de la sélection, quel que soit le nombre d’enregistrements dans la table (contrairement aux ensembles).
  • Un ensemble nécessite 1 bit par enregistrement de la table
    Les ensembles sont constitués d’une série de Bits. Un ensemble contient donc autant de bits qu’il y a d’enregistrements dans la table. Chaque bit d’un ensemble correspond à l’état "inclus dans la sélection" ou "non inclus" du énième enregistrement de la table au moment où l’ensemble est constitué.

Se référer au tableau ci-dessous résume les possibilités des ensembles et des sélections temporaires :

ThèmeEnsembleSélection temporaire
Espace mémoire pour 1 enregistrement1 bit4 octets
Conserve le triNonOui
Conserve l'enregistrement courantNonOui
RéunionOuiNon
IntersectionOuiNon
DifférenceOuiNon
Enregistrer sur disqueOuiNon
Taille mémoire d'une sélection de 10 enregistrements sur 20 00020 000 bits soit 2500 octets10 x 4 octets = 40 octets
PortéeLocal, Process, InterprocessProcess, Interprocess

On ne peut comparer que des ensembles d’une même table.

Attention : le fonctionnement d’un ensemble implique une utilisation dans un temps limité et éventuellement la pose de sémaphores (voir la documentation 4D à ce sujet).

En effet, un ensemble fait correspondre un bit à la position physique de chaque enregistrement de la table, or en cas de suppression puis d’ajout d’enregistrements, l’ancien contenu d’un enregistrement physique sera peut-être remplacé par le nouveau contenu qui n’est plus en cohérence avec ce que l’ensemble est censé représenter.

Soyez méthodiques dans l’utilisation des ensembles, qui demeurent un moyen efficace et rapide de comparer des sélections.

Pour conserver une sélection, une troisième solution consiste à utiliser un tableau qui contient vos identifiants via la commande SELECTION VERS TABLEAU.

Vous pouvez utiliser une quatrième solution avec des clusters stockés par exemple dans des BLOBs.

Bien évidemment, lorsque les ensembles et les sélections ne vous servent plus, vous pouvez libérer la mémoire en les effaçant

 EFFACER ENSEMBLE("NomEnsemble")
 EFFACER SELECTION("NomdeSelection")

Bonjour,

dans cette vidéo nous allons apprendre à conserver une sélection et effectuer des croisements (réunion, intersection, différence).

Les ensembles constituent un moyen simple de croiser des listes d'enregistrements d’une même table.

Ils sont un des moyens qui permettent de mettre en attente une sélection pour la réutiliser ultérieurement.
En réalisant une opération sur 2 ensembles, on obtient un ensemble contenant le résultat de l’opération effectuée (selon le fonctionnement classique de la théorie des ensembles)

Nous allons mettre en pratique tout de suite sur la liste des interventions dans le formulaire de navigation ces principes. Pour constituer un ensemble il suffit de partir d'une sélection courante.

Nous allons créer un bouton qui recherchera toutes les interventions qui ont commencé avant 9:00.

La méthode du bouton sera celle-ci :

 CHERCHER([Interventions];[Interventions]Heure_Intervention<!--?09:00:00?)</code-->

et nous allons créer un 2è bouton qui lui, nous donnera toutes les interventions dont le % de réalisation est inférieur à 100%. Que nous allons programmer de la sorte :

 CHERCHER([Interventions];[Interventions]Avancement<100)

Il se trouve qu'actuellement dans le fichier que nous avons importé l'avancement n'est pas renseigné.

Donc au préalable nous allons appliquer une formule sur l'ensemble des interventions. Donc là nous avons bien une sélection de 11732 interventions à laquelle nous allons appliquer une formule et lui dire que :

  • l'avancement est égal à l'Arrondi du Modulo de Hasard (qui renvoie une valeur de 0 à 32767), le Modulo par 100 arrondi à la dizaine la plus proche.

Donc si maintenant on fait un état pour vérifier quels sont les avancement qui ont été renseignés nous avons bien des avancement de 0 à 100.

Bien évidemment si nous cliquons sur le 1er bouton puis sur le 2è nous aurons perdu la sélection créée lors du 1er clic.
Il peut donc être intéressant dans le 1er bouton, après la recherche, de conserver l'information dans un ensemble que nous allons appeler "Interventions_Matin"

 NOMMER ENSEMBLE([Interventions];"Interventions_matin")

De la même manière ici, après avoir récupéré l'ensemble des interventions qui ne sont pas terminées, nous allons les appeler "Interventions_en_cours".

 NOMMER ENSEMBLE([Interventions];"Interventions_en_cours")


À partir de là il nous est possible de comparer les ensembles :

  • soit en les ajoutant pour obtenir l'ensemble des interventions du matin + les interventions en cours.
    Je duplique le bouton et indique que ce sont les interventions avant 9:00 + celles qui ne sont pas terminées;
    Et il suffit d'écrire
     REUNION("Interventions_Matin";"Interventions_En_Cours";"Interventions_Resultat")

    dans un 3 è ensemble, pour ne pas écraser les 2 premiers, qui s'appelle Interventions_Resultat
  • Si on souhaite les interventions du matin toujours en cours, il est nécessaire de comparer la partie commune des 2 ensembles, donc nous avons toutes les interventions du matin en cours. La commande à utiliser n'est pas REUNION, mais INTERSECTION.
  • Et si nous souhaitons obtenir les interventions terminées, il faudra faire la DIFFERENCE entre les 2 ensembles : toutes les interventions du matin moins les interventions en cours nous donne l'ensemble résultant.

Nous allons tester ces possibilités en exécutant le formulaire de navigation.
On prend toutes les interventions, on en a 11732 et ici (après clic sur les boutons de recherche) on en a toujours 11732.

Pourquoi ? Souvenez-vous dans les vidéos précédentes nous avions ajouté dans la fonction Navigation_Fonction, tout en bas, cette ligne qui nous donnait le nombre d'enregistrements trouvés suite à la création d'une nouvelle sélection.

 vNbRecords:=Enregistrements trouves([Interventions])

Nous allons donc recopier ce code et l'appliquer aux 2 boutons de recherche.
Il se trouve ici que le pointeur table nous n'en avons pas actuellement, nous allons traiter les interventions.

Ensuite cette ligne de code nous pouvons la recopier sur les 4 autres boutons.

  • sur la différence
  • l'intersection
  • la réunion, nous verrons que sur ces 3 boutons il manque quelque chose
  • et également ici surle bouton de recherche.

Maintenant si nous retournons dans le formulaire navigation, nous avons :

  • 631 interventions avant 9:00
  • 11192 interventions qui ne sont pas terminées

Les interventions avant 9:00 + les 100%, les interventions de 9:00 en cours ou 9:00 terminées,  semblent ne pas changer le nombre qui est ici.

Pourquoi, tout simplement parce que la création d'un ensemble n'implique pas son utilisation.
Il faut donc dans le bouton qui est ici, après avoir créé la réunion qui nous a bien créé un 3è ensemble indiquer qu'il faut utiliser tel ou tel ensemble.

Nous allons donc modifier le code et

  • ici rajouter la commande UTILISER ENSEMBLE.
  • Copier, nous irons le mettre par la site ans les 2 autres boutons.
  • donc je rajoute la ligne d'utilisation de l'ensemble sur les 2 autres boutons

et on peut ainsi tester :

  • les interventions en cours nous en avons 601
  • les interventions terminées nous en avons 30
  • ce qui correspond bien aux interventions avant 9:00 soit 631

Pour compléter cette approche nous allons refermer le formulaire et relancer la méthode Navigation pour vérifier le fonctionnement.
Si nous cliquons sur un des 3 boutons à droite, un message d'erreur nous indique que les ensembles n'existent pas. Il est en effet nécessaire que les ensembles existent avant de les utiliser.
Nous allons tracer la création de ces ensembles en cliquant sur le 1er bouton de recherche.

Nous voyons dans la liste à gauche le thème "ensembles" qui présente la liste des ensembles existants dans le process en cours de trace. Actuellement aucun ensemble n'est créé.

Lors de l'exécution de la méthode :

  • nous nommons un premier ensemble
  • nous allons en nommer un 2è en exécutant celle-ci
  • ce qui va nous permettre en trace de voir la création du 3è ensemble dès l'exécution de la 1ère ligne.

Et là on va voir puisque l'ensemble existe déja, juste la quantité change.

Il faut donc bien comprendre qu'un ensemble n'est qu'une liste d'enregistrement qui n'est pas forcément la sélection courante puisqu'actuellement la sélection courante de la table interventions contient 601 enregistrements.

Lorsque nous allons passer sur la commande UTILISER ENSEMBLE la sélection a bien maintenant un nombre d'enregistrement correspondant au nombre indiqué dans l'ensemble et la variable vNbRecords va s'adapter également.


Une autre utilisation des ensembles qui est très pratique consiste à sélectionner un certain nombre d'enregistrements puis à indiquer qu'on souhaite en faire la sélection courante c'est-à-dire qu'il n'y ait plus que ces N enregistrements en cliquant sur le bouton.

Pour celà nous devons :

  • programmer le bouton
  • indiquer que nous souhaitons une sélection
  • recopier une entrée dans la méthode
  • et écrire le code correspondant.

Le code ressemblera à ceci :

 $NomEnsemble:="Userset_"+Chaine(Nombre de millisecondes)
 LIRE ENREGISTREMENTS MARQUES($PointeurTable->;$NomEnsemble)
 UTILISER ENSEMBLE($NomEnsemble)
 vNbRecords:=Enregistrements trouves($PointeurTable->))

C'est à dire que nous allons :

  • créer un nom d'ensemble (c'est à dire une partie de texte + la conversion en texte du nombre de millisecondes)
  • lire les enregistrements marqués, c'est-à-dire ceux sur lesquels on a cliqué dans la table en question et créer l'ensemble correspondant 
  • utiliser l'ensemble
  • recalculer le nombre d'enregistrements auxquels ça correspond
  • puis effacer l'ensemble afin de libérer la mémoire.

Nous pouvons tester :

  • toutes les interventions
  • j'en choisis quelques unes
  • je trace le bouton sélection

à ce niveau nous avons :

  • un nom d'ensemble
  • l'ensemble va être créé ici, nous avons donc bien 3 éléments dans cet ensemble.
  • nous l'utilisons pour qu'il devienne la sélection courante de la table interventions
  • nous recalculons le nombre d'enregistrments
  • puis on efface l'ensemble.

Nous obtenons bien dans notre tableau la liste des enregistrements que nous avions sélectionnés.

Un ensemble est composé d'un bit par enregistrement et en conséquence ne permet pas de conserver l'ordre de tri.

Lorsqu'il est nécessaire de conserver cette information, il faut utiliser sur un principe identique les commandes liées aux sélections temporaires
COPIER SELECTION et UTILISER SELECTION

Nous allons ajouter ici un bouton permettant de :

  • créer une première sélection (sélection temporaire T1)
  • le code va être de copier la sélection temporaire
  • et de dupliquer le bouton : T2

À partir de là nous disposons d'une possibilité de stocker 2 sélections qui tiendront compte de l'ordre de tri.

Elles existeront en mémoire mais ne seront pas utilisées.

Nous allons donc

  • dupliquer ces boutons
  • modifier leur formule pour demander à utiliser les sélections
    (et là il n'est pas nécessaire de préciser la table.)

Voyons tout de suite par l'exemple. Si on prend toutes les interventions

  • prenons les 1ères
  • Sélection
  • trions-les par date et heure d'intervention
  • créons une 1ère sélection
  • reprenons la même sélection
  • nous allons la trier par objet et heure d'intervention
  • et nous créons la 2è sélection.

Maintenant :

  • si nous rappelons la 1ère sélection, elle revient bien triée selon les critères indiqués : date et heure
  • si nous cliquons sur le 2è bouton elles sont bien triées comme nous l'avions demandé par objet puis par date.

 
 

 
PROPRIÉTÉS 

Produit : 4D
Thème : Ensembles et sélections temporaires
Nom intl. : Sets and named selections

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

Autoformation ( 4D v16)