Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
ogautier62
Specialist II
Specialist II

Sélections à la souris

Bonjour à tous,

Cet article a pour objectif d’illustrer les possibilités de sélection à la souris sans nécessairement passer par des set analysis ; ceux-ci sont aussi indiqués.

Le set analysis est vraisemblablement le sujet le plus important en nombre faisant l’objet de questions sur le forum. A contrario il y a très peu de question sur la navigation et la sélection interactive à l’interface. A croire que toutes ces sélections sont encapsulées dans des expressions complexes, au risque de présenter à l’utilisateur final une interface « presse bouton » où toute la force de QV en terme de dataviz se trouverait sous utilisée.

Sujets et exemples de sélections illustrés :

  • - Blancs, nulls, non intégrité
  • - ET entre valeurs d’un même champ ; OU sur des champs différents, OU exclusif
  • - Quantificateurs : tous/aucun, toujours/jamais
  • - Le top (le plus d’occurrences)
  • - Associations
  • - Exclusions

Reportez vous de préférence au pdf en PJ comportant l'ensemble des copies d'écran.

Le texte ci-dessous est un extrait sans les copies de l'interface.

Le jeu de données est aussi en PJ sous Excel.

  • Modèle de Données :

personnel:
LOAD  * FROM epicerie.xlsx
(
ooxml, embedded labels, table is Personnel);
article:
LOAD  * FROM epicerie.xlsx
(
ooxml, embedded labels, table is Article)   ;
ticket:
LOAD  * FROM epicerie.xlsx
(
ooxml, embedded labels, table is Ticket) ;
role:
LOAD  * FROM epicerie.xlsx
(
ooxml, embedded labels, table is Role);

Le jeu d’essai représente des achats effectués dans une épicerie. La table « ticket » représente une ligne d’achat (identifiant : ID) d’un article (id : IDarticle), un achat regroupant plusieurs articles et est identifié par « NoTicket ». La table « role » représente les actions effectuées par le personnel (id : IDNom) sur l’achat, soit la vente (RoleNom = « vendeur »), soit la livraison (RoleNom = « livreur »).

datamodel.png

Certain champs sont dupliqués (IDarticle/Article ; IDNom/RoleNom) pour permettre d’afficher le compte dans ces champs (l’affichage du compte dans la liste de sélection n’étant pas possible pour les champs clef servant de lien entre tables).

  • Etats alternatifs : $,1  - valeurs possibles et exclues P(),E()

Nous allons créer deux tableaux simples pour visualiser les résultats de sélection.

  1. Quels sont les tickets et lignes de ticket sélectionnés ? :

'Nb de tickets sélectionnés : ' & count(distinct NoTicket) &
' lignes sélectionnées  : ' & count(ID)

  1. Quel est le détail complet des tickets sélectionnés (nonobstant la sélection) ? :

'Nb Tickets sélectionnés : '    & count({1<NoTicket = P({$} )  >} distinct NoTicket) &
'       lignes totales   : ' & count({1<NoTicket = P({$} ) >}  ID)

Avec comme expression pour Article (même chose pour Montant):

= only( {1<NoTicket = P({$} )   >} Article)

P({$}) prend les tickets liés à l’article sélectionner

{1} permet d’avoir toutes les lignes nonobstant l’article sélectionné

On arriverait au même à la souris sans set analysis en faisant :

-Sélectionner les valeurs possibles dans NoTicket

-Effacer les autres champs dans NoTicket

  1. Quelles sont les lignes de ticket exclues de la sélection ? :

C’est le complémentaire exact de la sélection a)

'Nb de tickets exclus de la sélection        : ' & count({1<NoTicket = E({$} ) >} distinct NoTicket) & '  ' &

'Lignes d''articles exclues de la sélection : ' & count({1<ID = E({$} ) >}  ID)

 

                                                 

Avec comme expression :

= only( {1<ID = E({$} ) >} Article)

A la souris :

-Sélectionner les valeurs exclues dans ID

  1. Quel est le détail complet des tickets exclus de la sélection ?

'Nb de tickets exclus de la sélection    : ' & count({1<NoTicket = E({$} ) >} distinct NoTicket) & '  ' &
'Lignes d''articles des tickets exclus : ' & count({1<NoTicket = E({$} ) >}  ID)

Avec comme expression :

= only( {1<NoTicket = E({$} )   >} Article)

A la souris :

-Sélectionner les valeurs exclues dans NoTicket

-Effacer les autres champs dans NoTicket

C’est le complémentaire exact de la sélection b)

  • Sélections de base :

De base :

Le OU s’applique sur les valeurs d’une même liste de sélection

Le ET s’applique entre des sélections sur des champs différents

Le NON, la négation, s’obtient en sélectionnant les valeurs exclues

Valeurs à blanc

La valeur « blanc » apparait en tant que telle, et il y aura autant d’occurrences que de chaînes à blanc de longueur différente :

On sélectionne les valeurs à blanc dans Fournisseur pour trouver les articles correspondants :

Il y a donc deux articles avec un fournisseur à blanc et de longueurs différentes.

Valeurs nulles

La valeur nulle n’est pas une valeur en tant que telle, et n’apparait donc pas dans la liste de sélection.

Il faut passer par une exclusion sur les valeurs possibles pour voir apparaitre dans un autre champ lié les valeurs nulles d’un champ particulier.

Quels sont les articles ayant un fournisseur « null » ? :

-‘Sélectionner tout’ dans la liste de sélection fournisseur

Les articles sans fournisseur (valeur à Null) apparaitront en gris :

Pour sélectionner les articles sans fournisseur (valeur nulle),

Faire ‘Sélectionner les valeurs exclues’ dans NomArticle

Liens d’intégrité :

Le traitement des liens d’intégrité est similaire au traitement des valeurs nulles :

Quels sont les articles qui n’ont pas été achetés ?

-‘Sélectionner tout’ dans NoTicket :

Les articles non vendus apparaissent en gris,

Faire : ‘Sélectionner les valeurs exclues’ dans NomArticle pour les sélectionner

Quels sont les articles achetés non présents dans la table article ?

-Sélectionner tout dans NomArticle

-Sélectionner les valeurs exclues dans NoTicket :

Kiwi est donc un article identifié dans un ticket, mais non présent dans la table Article

Si on regarde le champ faisant le lien :

Il y a aussi un article à blanc.

Une troisième ligne d’article pose un problème d’intégrité car sa valeur est nulle

Dans ce cas :

Sélectionner les valeurs exclues dans ID (identifiant de la ligne de ticket) :

Deux lignes de ticket ont effectivement une valeur nulle d’article.

Il y a donc trois cas de non intégrité :

  • - Le champ servant de lien est non renseigné à null
  • - Le champ servant de lien est non renseigné à blanc
  • - Le champ servant de lien est renseigné, mais sa valeur est absente de la table de référence liée.

  • Exprimé avec un set analysis
  • Non renseignés :

= count({<NomArticle = {"=len(trim(Fournisseur))=0"} >} NomArticle)

  • Nulls :

= count({<NomArticle = {"=isNull(Fournisseur)"} >} NomArticle)

  • Blancs (et non nulls)

= count({<NomArticle = {"=len(trim(Fournisseur))=0  and not(isnull(Fournisseur))"} >} NomArticle)

    Le ET :

Par défaut le ET s’applique entre des champs différents :

Ex : Quels sont les articles du rayon Fruit et dont le fournisseur est Amazon ?

  • Le OU

Par défaut le OU s’applique sur un même champ :

Ex : Quels sont les tickets contenant des bananes ou des pommes ?

-Sélectionner ‘banane’ dans Article

-Sélectionner ‘pomme’ dans Article par Ctrl-click (pour conserver banane)

  • Sélections complémentaires :

Le ET sur un même champ :

Pour un ET, il faut procéder en deux étapes :

Ex : Quels sont les tickets contenant à la fois des bananes et des pommes ?

-Sélectionner ‘banane’ dans Article

-Sélectionner les valeurs possibles dans NoTicket

-Sélectionner pommes dans Article

2 articles ont disparus (vs le OU) les tickets 1 et 5 n’apparaissent plus (car pas de pomme)

Le OU sur des champs différents :

Comme on ne sait faire que du ET sur des champs différents il faut passer par une double négation sachant que :

A ou B est équivalent à : non (non A et non B)

Ex : Quels sont les articles du rayon Fruit ou fournis par Amazon :

-Sélectionner F dans Rayon

-Sélectionner les valeurs exclues dans Rayon

-Sélectionner Amazon dans Fournisseur

-Sélectionner les valeurs exclues dans Fournisseur

-Sélectionner les valeurs exclues dans Article

-Effacer les autres champs dans Article :

Le OU exclusif :

Cela revient à faire :

A OUexc B =   (A ou B) – (A et B   )

Ex : Quels sont les tickets contenant des bananes ou des pommes (mais pas les deux à la fois) ?

On commence par éliminer (A et B), puis l’on fait le OU :

-Sélectionner banane dans Article

-Sélectionner les valeurs possibles dans NoTicket

-Sélectionner pomme dans Article

-Effacer les autres champs dans NoTicket

-Sélectionner les valeurs exclues dans NoTicket

-Vérrouiller

-Sélection banane dans Article

-Sélection de la valeur supplémentaire pomme dans Article (ctrl-click)

  • Utilisation des favoris :

Quelles sont les tickets vendus par Paul ? :

-Sélectionner Vendeur dans Role

-Sélectionner Paul dans RoleNom

- Ajouter un favori dans l’objet de favori :

On procède de même pour les articles livrés par Linda que l’on enregistre dans un favori : LivLinda

Quelles sont les tickets vendus par Paul ou livrés par Linda ? :

On tape l’expression suivante dans la loupe de recherche de NoTicket :

Opérateur : + pour OU

Quelles sont les tickets vendus par Paul et livrés par Linda ? :

Opérateur : * pour ET

Quelles sont les tickets vendus par Paul ou (exclusif)  livrés par Linda ? :

A noter que le symbole \ ne semble pas fonctionner

  • Questions avec « tous les » ou « aucun » / « toujours » ou « jamais »

Quels sont les tickets ne contenant aucun fruit ?

-Sélectionner Fruit dans Rayon

-Sélectionner les valeurs exclues dans NoTicket :

Quels sont les tickets dont tous les articles sont des légumes ?

-Sélectionner L dans Rayon,

-Sélectionner les valeurs exclues dans Rayon

-Sélectionner les valeurs exclues dans NoTicket

Pour éliminer les valeurs nulles, ainsi que kiwi posant un pb d’intégrité,

-Sélectionner L dans Rayon :

1 seul ticket répond à la question

De même pour le crêmerie : on trouverait le ticket 7 (lait)

Quels sont les tickets dont tous les articles sont du même rayon ?

Dans la loupe du champ NoTicket on tape l’expression :

=count(distinct Rayon)=1

Quelles sont les personnes n’ayant jamais livré ?

Sélectionner ‘Livreur’ dans Role

Les personnes répondant à la question apparaissent en gris :

Nb : Max n’apparait pas dans RoleNom car il n’a jamais eu d’activité

Quelles sont les personnes ayant toujours joué le rôle de vendeur uniquement ?

Dans ce cas c’est la même réponse que précédemment mais en regardant uniquement la table RoleNom (il faut donc éliminer Max)

Quelles sont les Tickets vendus et livrés par la même personne ?

Dans la loupe de la liste de sélection NoTicket :

= count(distinct RoleNom)=1 and count(RoleNom)=2

Quelles sont les personnes n’ayant jamais livré ce qu’elles ont vendu ? :

On part de la sélection précédente,

Puis on fait : Sélectionner les valeurs exclues dans RoleNom

Quelles sont les Tickets vendus et livrés par des personnes différentes ?

Dans la loupe NoTicket taper :

= count(distinct RoleNom)=2

Quelles sont les personnes n’ayant jamais travaillé ensemble ?

C’est la négation de la question précédente

La réponse est en grisé :

Ce qui revient aussi à la question : Quelles sont les personnes ayant toujours travaillé seule ? (ce qui élimine Max), il reste Bob

Quelles sont les personnes ayant toujours travaillé avec Maryam ?

-Sélectionner Maryam dans RoleNom

-Sélectionner les valeurs exclues dans NoTicket

-Sélectionner les valeurs exclues dans RoleNom :

Jean répond à la question

(NB Paul qui a travaillé avec Maryam a travaillé aussi avec Linda)

  • Les associations (en même temps)

Ex : Quels sont les articles vendus avec, ou en association avec (présents sur un même ticket) des courgettes ?

-Sélectionner courgette dans Article

-Sélectionner les valeurs possibles dans NoTicket

-Effacer les autres champs dans NoTicket

Ce que l’on peut aussi vérifier dans :

On peut aussi se poser la question inverse :

Quels sont les articles qui n’ont jamais été vendus avec des courgettes ?

-Sélectionner courgette dans Article

-Sélectionner les valeurs possibles dans NoTicket

-Sélectionner les valeurs exclues dans Article

Y a t il des articles qui ont toujours été vendus exclusivement avec des courgettes ?

Il faut pour cela éliminer les articles des tickets ne comprenant pas de courgette :

-Sélectionner courgette dans article

-sélectionner les valeurs exclues dans NoTicket

-Sélectionner les valeurs exclues dans Article                                                          

Ce sont les articles possibles, mais encore faut il qu’ils aient été aussi vendus avec des courgettes,

  • Sélectionner les valeurs possibles dans NoTicket, ce qui donne :

La réponse est donc : NON

Y a t il des articles qui ont toujours été vendus avec des courgettes ?

-Sélectionner courgette dans Article

-Sélectionner les valeurs possibles dans NoTicket

-Effacer dans le champ Article

Il nous reste 2 Tickets,

  • - Dans le champ NomArticle on tape la condition :

3 articles ont donc été systématiquement vendus avec des courgettes

Le top : occurrence apparaissant le plus

Ex : Quel est l’article le plus vendu ?

Dès lors que l’on dispose d’un champ lié à article sur la ligne de commande qui ne serve pas de lien, il est possible d’y indiquer le compte, et la réponse est alors immédiate :

Les plus vendus : banane (6 occurrences)

Puis tomate et pomme (5 occurrences)

Quel est le légume le plus vendu ?

Il suffit de sélectionner le rayon L et on obtient le top pour les légumes :

Quel est l’article le plus vendu en association avec l’article le plus vendu ?

A l’interface :

-Sélectionner banane dans Article (6 occurrences le max)

-Sélectionner les valeurs possibles dans NoTicket

-Effacer dans le champ Article

Soit :

Ce sont donc les pommes : 3 click à la souris !!!!!

  • Même sélection par set analysis :

On utilise l’expression FirstSortedValue

Dans une boîte texte :

= FirstSortedValue(Article, -aggr(count(NoTicket),Article)) & ' ' & max(aggr(count(NoTicket),Article)) & ' occurrences'

Pour avoir le Top global :

=concat(aggr(FirstSortedValue(Article, -aggr(count(NoTicket),Article)),Article) , '\n')

Pour obtenir les tickets contenant l’article le plus vendu :

=concat(aggr(only({<Article = {"$(=FirstSortedValue(Article, -aggr(count(NoTicket),Article)))"} >} NoTicket),NoTicket),'*')

Soit :

Les produits vendus avec le plus vendu :

=concat(aggr(only({<NoTicket = P({<Article = {"$(=FirstSortedValue(Article, -aggr(count(NoTicket),Article)))"} >} ) >} Article),Article),'*')

D’où ensuite pour trouver le produit le plus vendu en association avec le produit le plus vendu :

= FirstSortedValue(Article, -aggr(count({<NoTicket = P({<Article = {"$(=FirstSortedValue(Article, -aggr(count(NoTicket),Article)))"} >}) >} Article),Article),2)

NB : indice 2 dans le FirstSortedValue puisque le 1 correspondrait à banane

Avec la quantité :

et l’expression :

= FirstSortedValue(aggr(count({<NoTicket = P({<Article = {"$(=FirstSortedValue(Article, -aggr(count(NoTicket),Article)))"} >}) >} Article),Article), -aggr(count({<NoTicket = P({<Article = {"$(=FirstSortedValue(Article, -aggr(count(NoTicket),Article)))"} >}) >} Article),Article),2)

Soit au final : une expression de trois-quatre lignes dont la mise au point est sportive ; contre trois click à la souris pour le même résultat !!

Autre utilisation de FirstSortedValue :

Quel est le ticket ayant le montant le plus élévé ?

=FirstSortedValue(NoTicket, -aggr(sum(Montant),NoTicket)) & '\n' &
max(aggr(sum(Montant),NoTicket))

  • Exemple final

Pour terminer une petite synthèse de ce que l’on a vu :

Quels sont les articles n’ayant jamais été vendus ensembles ?

A titre de vérification on peut utiliser les deux formules suivantes :

  1. Le max d’articles par Ticket répondant à la sélection doit être de 1 maximum
  2. Le compte total de Ticket doit être la somme du compte de tickets par article

Banane et carotte ont été vendus ensemble une fois

Avec les expressions :

'Max Articles        : ' & max(aggr(count(Article),NoTicket)) & '\n' &
'Différence count : ' & (sum(aggr(count(NoTicket),Article))  - count(distinct NoTicket))

Pour les articles recherchés le max article doit être de 1 et la différence de 0

La recherche va s’effectuer de façon incrémentale article par article, nous allons créer une expression nous donnant les choix possibles d’articles suivant :

= only({1<NoTicket = E({1<Article = P( {1<NoTicket = P ({$}) >}) >}) >} Article)

Cette expression nous donne les articles des tickets ne comprenant pas des articles liés aux tickets comprenant des articles liés à la sélection

Exemple : Si je pars de poireau, vont être affichés les articles possibles n’étant jamais présents sur un ticket comprenant poireau :

Sélectionnons ensuite fromage :

Puis salade, qui ne nous donne plus qu’un choix possible avec kiwi :

Fromage, kiwi, poireau et salade forment un ensemble d’articles n’ayant jamais été vendus ensemble deux à deux.

(il reste en fait la ligne de ticket avec article à blanc)

2 Replies
OmarBenSalem

Bravo pour cet article fort intéressant; je ne peux que saluer l'effort !

ogautier62
Specialist II
Specialist II
Author

merci Omar,

j'avais une petite indigestion de set analysis, ça va mieux 😉