4D v16Ensembles et sélections temporaires |
||||||||||||||||||||||||||||||||
|
4D v16
Ensembles et sélections temporaires
|
Thème | Ensemble | Sélection temporaire |
Espace mémoire pour 1 enregistrement | 1 bit | 4 octets |
Conserve le tri | Non | Oui |
Conserve l'enregistrement courant | Non | Oui |
Réunion | Oui | Non |
Intersection | Oui | Non |
Différence | Oui | Non |
Enregistrer sur disque | Oui | Non |
Taille mémoire d'une sélection de 10 enregistrements sur 20 000 | 20 000 bits soit 2500 octets | 10 x 4 octets = 40 octets |
Portée | Local, Process, Interprocess | Process, 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 :
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")
REUNION("Interventions_Matin";"Interventions_En_Cours";"Interventions_Resultat")
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.
Maintenant si nous retournons dans le formulaire navigation, nous avons :
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
et on peut ainsi tester :
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 :
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 :
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 :
Nous pouvons tester :
à ce niveau nous avons :
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 :
À 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
Voyons tout de suite par l'exemple. Si on prend toutes les interventions
Maintenant :
Produit : 4D
Thème : Ensembles et sélections temporaires
Nom intl. : Sets and named selections
Autoformation ( 4D v16)