F.A.Q. Business-Objects
F.A.Q. Business-ObjectsConsultez toutes les FAQ
Nombre d'auteurs : 15, nombre de questions : 101, dernière mise à jour : 15 juin 2021
- Pourquoi trois types d'objets dans les univers ?
- Comment modifier le SQL d'une requête ?
- Comment récupérer uniquement les n premières lignes de résultat d'une requête ?
- Comment combiner des requêtes ? (union / intersect / minus)
- Pourquoi et comment modifier les listes de valeurs ?
- Comment avec une invite "Quelle Année ?" obtenir N et N-1 ?
- Comment limiter la requête aux 12 mois précédant la date demandée en invite ?
- Comment n'afficher que les lignes communes des requêtes synchronisées ?
- A quoi correspondent les opérateurs et opérandes dans l'éditeur de requête ?
- Comment utiliser une invite en SQL à la carte ?
- Comment afficher une série d'informations même si elles sont vides ?
- Dimension (en forme de cube bleu).
-
Information (en forme de pyramide verte).
- Indicateur (en forme de sphère rose).
Objets Dimension (cubes bleus) : Sont des données alphanumériques qui permettent d'organiser les résultats.
Ces objets répondent aux questions que l'utilisateur se pose :
Quel est le chiffre d'affaires par vendeur, le salaire moyen par fonction, le nombre de commandes par fournisseur ou les dépenses engagées par mois ...
Objets Information (pyramides vertes) : Sont des données alphanumériques rattachées à un et un seul objet Dimension.
Ils apportent des informations complémentaires à l'objet Dimension auquel ils se rattachent.
Le N° de fax du Fournisseur, sa raison sociale, son adresse.
Le libellé d'un produit, l'intitulé d'un compte ...
Objets indicateurs (sphères roses) : Sont des données numériques, résultat d'un dénombrement (nombre de) ou mesure d'une quantité.
Ils sont susceptibles de se voir appliquer toutes les opérations arithmétiques nécessaires aux calculs souhaités.
Nombre de commandes, Montant de la facture, Quantité en stocks ...
Ces objets numériques sont en général pourvus d'une fonction de sommation automatique qui adapte leur valeur lorsque l'on change de niveau d'agrégation.
Une requête BO créée avec l'éditeur de requête génère une sélection en langage SQL. Il s'agit du langage universel utilisé pour interroger les bases de données (SQL : Short Query Language).
Une requête SQL basique est construite de la manière suivante :
- une partie SELECT qui permet de choisir les données à récupérer.
- une partie FROM qui indique dans quelles tables récupérer ces données.
- un partie WHERE qui permet de poser des des clauses restrictives (conditions) et de définir les jointures entre les tables.
SELECT
nom, prénom, poste FROM
utilisateurs WHERE
poste =
'vendeur'
;
Selon vos droits attribués dans le Superviseur / CMC, vous pouvez ou non avoir accès à ce code SQL au niveau de l'éditeur de requête, un bouton " SQL " vous permet alors de l'afficher.
Vous pouvez ensuite grâce à l'éditeur SQL de BO, regénérer, valider ou enregistrer-sous le code SQL.
Si vous désirez modifier le SQL, pour exécuter ensuite la requête avec votre code, vous devez cocher la case " Ne pas générer le SQL avant l'exécution ".
Attention, il faut toujours que le nombre d'objets dans la clause SELECT soit le même que le nombre d'objet sélectionnés dans la requête BO.
De plus si vous remplacez un champ par un autre dans la clause SELECT, à l'affichage dans BO, la valeur de la cellule sera celle du SQL, mais l'entête de la colonne sera celle de l'objet BO.
Dans l'éditeur de requêtes, utiliser le bouton " Option " situé en bas à gauche.
Vous pouvez choisir ici de ne récupérer que les 10, 20 ou n premières lignes de la requête (max = 9999999999 ).
Attention, il s'agit là de limiter les résultats de la requête et non de masquer des données récupérées par une requête.
Si vous avez une somme dans votre rapport sur cette requête, elle sera alors basée sur ces n lignes.
Pour combiner des requêtes, il faut se placer au niveau de l'éditeur de requête, et une fois la requête principale créée, cliquer sur l'icône représentant 2 cercles imbriqués.
Une deuxième requête est alors créée dans le même fournisseur de données, on peut naviguer entre ces requêtes grâce aux onglets situés en bas de l'éditeur.
Par défaut, la combinaison de requêtes créée est un « UNION » (symbole U), mais en cliquant sur le symbole, on peut changer le type de combinaison et choisir un « INTERSECT » (symbole n) ou un « MINUS »( symbole - )
On peut combiner au maximum 8 requêtes, en précisant la combinaison entre chaque requête.
Les requêtes combinées doivent contenir les mêmes objets et ne peuvent différer que par la partie « Conditions ».
Soit 2 requêtes Toto et Tata tel que :
- Toto récupère les données suivantes : A, B, C, D.
- Tata récupère les données suivantes : B, C, D, E.
- Toto UNION Tata = Tata UNION Toto = A, B, C, D, E.
- Toto INTERSECT Tata = Tata UNION Toto = B, C, D.
- Toto MINUS Tata = A.
- Tata MINUS Toto = E.
Il arrive bien souvent que le Designer qui a créé l'univers n'ait pas prévu, dans les listes de valeurs, d'associer aux codes leurs libellés.
Vous pouvez améliorer ces listes de la façon suivante :
- Menu Outils / Commande Univers.
- Dans la boîte de dialogue qui s'affiche.
- Sélectionnez l'univers qui contient la liste de valeurs à modifier.
- Cliquez sur la liste de valeurs.
- Dans la boîte de dialogue Listes de valeurs, ouvrez la classe contenant l'objet sur lequel porte la liste de valeurs.
- Cliquez sur Editer.
- Dans l'éditeur de requête ajoutez l'objet Libellé correspondant.
- A ce stade, il vous est possible de choisir si le tri de la liste restera sur le code ou si vous préférez organiser cette liste par un tri alphabétique sur les libellés.
- Cliquez sur Exécuter pour remplir la liste de valeurs dans sa nouvelle version.
- Pour visualiser la liste, cliquez sur Afficher.
- Cliquez sur OK pour fermer la boîte de dialogue.
Avantage de la méthode:
Les modifications apportées aux listes de valeurs sont stockées dans leurs fichiers qui sont reconnaissables par leur extension .lov qui signifie list of values.
Ces fichiers se trouvent par défaut dans des sous-répertoires du répertoire UserDocs en versions 5 et 6.
Ces fichiers sont automatiquement créés lorsque vous affichez la liste de valeurs.
Ils sont utilisés chaque fois que vous utilisez l'univers auquel les listes sont rattachées.
Objectif : A partir d'une invite de type "Quelle année ?", rapatrier automatiquement les données de l'année et celles de l'année précédente. (N et N-1)
Méthode : Il suffit de créer un objet personnel qui permette d'utiliser la même invite pour N et N-1.
La création d'un objet personnel peut se faire dans une requête ou en passant par Menu Outils / Commande Univers / Objets personnels.
Prenons l'exemple de notre requête dans laquelle nous avons déjà posé la condition sur un objet Dimension ANNEE tiré de la classe CALENDRIER
ANNEE Egal à Invite ('Quelle Année ?')
Avant toute chose, déterminez si l'objet Année tiré de votre univers est de type caractère ou numérique, cela vous sera utile par la suite.
Si vous ne savez pas :
- Allez dans le Gestionnaire de données.
- Sélectionnez l'objet dans son fournisseur de données.
- Passez sur l'onglet Définition.
- Relevez le type de l'objet.
Création de l'objet personnel ANNEEPLUS1 :
De retour dans votre requête :
- Cliquez sur le bouton Objets personnels (à droite du bouton SQL).
- Cliquez sur Ajouter.
- Dans l'onglet Définition nommez votre nouvel objet ANNEEPLUS1.
- L'objet ANNEE déposé dans la condition étant de type dimension, donnez également le type Dimension à l'objet personnel.
- Passez dans l'onglet Formule.
Formule = En_caractère ( En_nombre ( [CALENDRIER\ANNEE} ) +1 )
Formule = [CALENDRIER\ANNEE} + 1
Validez avec la touche OK.
L'objet personnel est maintenant disponible dans la classe Objets personnels dans toute requête utilisant le même univers.
Utilisation de l'objet personnel ANNEEPLUS1 :
- Créer avec cet objet une 2ème condition.
- Faites glisser dans la zone condition l'objet personnel ANNEEPLUS1.
- Double clic sur Egal à ...
- Double clic sur Afficher une liste d'invites ...
- Choisir la même invite que pour la 1ère condition Invite('Quelle Année ?').
Vous avez maintenant deux conditions articulées par ET
- Double clic sur ET le transforme en OU.
- Exécutez votre requête.
- Répondez à l'invite.
Les données obtenues sont celles de l'année choisie en invite et de l'année précédente
La plage des douze mois antérieurs à une date choisie peut être obtenue à l'aide de deux objets personnels posés en condition :
DATE1 demandée par invite et DATE12Mois calculée à partir de DATE1
Ces objets personnels mis au point seront réutilisable dans toutes les requêtes à venir pointant sur le même univers.
Pour créer les deux objets personnels dans l'éditeur de la requête :
1) objet personnel DATE1 de type Date et Qualification Dimension
Invite Date ( "QUELLE DATE ?" )
2) objet personnel DATE12Mois de type Date et Qualification Dimension
Ajouter mois ( [Objets personnels\DATE1] , 12 )
Remarquer au passage qu'on ne met pas de signe = dans la formule
Puis dans la condition de la requête il suffit de choisir l'objet Date et de lui appliquer l'opérateur Entre:
[Date] Entre [DATE1] et [DATE12Mois]
Les objets personnels se trouvent dans la dernière classe de la liste : Classe Objets personnels
La synchronisation de deux fournisseurs de données permet d'afficher dans un même tableau les données provenant de requêtes différentes en évitant tout produit cartésien.
Pour cela, les dimensions communes aux deux requêtes sont liées entre elles.
Exemple : Deux requêtes BO ramènent des infos relatives à des clients.
Client est un objet dimension qui a été lié entre R1 et R2
- Des Clients présents dans R1 et R2.
- Des Clients présents uniquement dans R1.
- Des Clients présents uniquement dans R2.
- Puis ramener pour chaque Client les infos lorsqu'elles existent dans R1, dans R2 ou dans R1 et R2..
SELECT
R.Client
, R1.infos, R2.Infos
FROM
R2, R1,
(
SELECT
Client
FROM
R1
UNION
SELECT
Client
FROM
R2)
R
WHERE
R.Client
=
R1.Client
(+)
AND
R.Client
=
R2.Client
(+)
)
Si la dimension étudiée est présente dans l'une des requêtes mais absente de la deuxième, aucune info n'est ramenée de cette dernière.
Noter au passage que BO remplace les listes des clients de R1 et R2 par la liste exhaustive (sous requête R dans le SQL).
Pour n'afficher que les clients présents dans le résultat des deux requêtes, le plus simple est de mettre en place un double filtre complexe (c'est-à-dire basé sur une condition à vérifier plutôt qu'une simple valeur de l'objet).
- Cliquer en dehors du tableau (sur le fond blanc) pour déselectionner tout objet
- Clic droit Formater les filtres.
- Ouvrir le dossier correspondant au tableau en cliquant sur +.
- Cliquer sur Ajouter.
- Dans "Variables à filtrer", choisir une variable info de R1.
- Cliquer sur Définir.
- Entrer la formule suivante :
= Non (EstNul([Info(R1)]))
- Valider par OK.
- De retour dans la boite dialogue Filtres, cliquer sur Appliquer.
- Cliquer sur Ajouter.
- Dans "Variables à filtrer", choisir une variable info de R2.
- Cliquer sur Définir.
- Entrer la formule :
=Non (EstNul([Info(R2)]))
- Valider par OK.
- OK pour Sortir.
Votre tableau ne contient plus que les lignes communes aux deux requêtes.
Mise en garde : Le choix des variables à filtrer doit se porter sur des objets toujours renseignés.
Le principe de base d'une condition est d'assurer la pertinence des informations recherchées par l'utilisateur.
Il s'agit donc de limiter le nombre de lignes ramenées en définissant les critères de la condition (appelée aussi clause restrictive).
Pour cela, BO met à notre disposition :
- des opérateurs qui définissent la mise en relation des données avec la/les valeurs de critère.
- des opérandes qui déterminent le mode d'établissement des valeurs de critère.
Les opérateurs se distinguent de la façon suivante :
Opérateur | Permet de retourner les lignes dont les valeurs sont |
---|---|
Egal à | égales à la valeur définie par l'opérande |
Différent de | toutes différentes de la valeur définie par l'opérande |
supérieur, supérieur ou égal, inférieur, inférieur ou égal | fonction de la relation choisie |
Entre | comprises entre les valeurs définies par l'opérande 1 et l'opérande 2 |
Pas entre | comprises entre les valeurs définies par l'opérande 1 et l'opérande 2 |
Dans liste | égales à une des valeurs de la liste à définir |
Pas dans liste | égales à aucune des valeurs de la liste d'opérandes |
Renseigné | renseignées (c'est-à-dire non null) |
Non renseigné | non renseignées (c'est-à-dire null) |
Correspond au modèle | semblables à un modèle de chaine de caractères pré défini. La chaîne de caractères peut être complétée par des caractères joker ? % ? (quelque soient les caractères) et ? _ ? (quelque soit le caractère à cette position). |
Différent du modèle | différentes de ce modèle de chaine de caractères (usage de "%" et "_" identique) |
A la fois | égales aux valeurs obtenues à la fois par l'opérande 1 et par l'opérande 2 (correspond à une intersection). |
Sauf | Moins celles obtenues par l'opérande (correspond à un minus sur 2 requêtes) |
Selon l'opérateur choisi, un ou plusieurs opérandes vous seront proposés aux significations suivantes :
Saisir une nouvelle constante | Saisir la (les) valeurs auxquelles l'objet sera comparé |
---|---|
Afficher la liste de valeurs | Choisir la (les) valeurs parmi la liste de valeurs existantes pour cet objet |
Saisir une nouvelle invite | Définir le libellé de la question qui sera posée à l'utilisateur à chaque rafraichissement de la requête. L'utilisateur pourra y répondre par une ou des valeurs (selon l'opérateur choisi précédemment) saisie(s) ou choisie(s) dans une liste lorsqu'elle existe. |
Afficher une liste d'invites | Affiche une invite ou une liste d'invite(s) déjà créée(s) dans le même document quelque soit la requête. Dans ce cas, la question ne sera posée qu'une fois pour toutes les requêtes du document lors du rafraichissement. |
Sélectionner un objet | Limiter aux valeurs d'un objet personnel. |
Créer une sous requête | Limiter aux valeurs rapatriées par une sous requête Un onglet est créé pour définir la sous requête |
Calcul | Tenir compte du résultat d'un calcul défini à l'aide d'un assistant. |
Sélectionner les résultats de la requête | Limiter aux valeurs d'un objet équivalent ramenées par une requête déjà créée dans le même document. |
Les invites sont des variables communes accessibles à tous les fournisseurs de données d'un même document BO.
La preuve en est que si on fait une nouvelle requête et que l'on essaie de créer une invite avec un libellé déjà utilisé, BO refusera de le faire en signalant qu'elle existe déjà.
On peut donc parfaitement poser des invites date1 et date2 dans un SQL à la carte :
select
*
from
table1
where
date
between
@variable(
'date1'
)
and
@variable(
'date2'
)
Il est conseillé de libeller toujours les invites avec un point d'interrogation ce qui permet de les repérer parmi les autres variables.
De la même façon signaler entre parenthèses le pluriel indique la possibilité de choisir des valeurs multiples dans le cas d'un Dans liste au lieu de Egal à
@variable('Quelle Année ?') une seule réponse
@variable('Quelle(s) Année(s) ?') une ou plusieurs réponses
Par exemple, comment afficher tous les mois dans un tableau, même s'il n'y a rien eu certains mois ?
A) Soit, il existe quelque part ailleurs dans une table le même champ où cette donnée existe
(par exemple peut-être que vous n'avez pas vendu l'article X ce mois-là, mais que si on prend la table avec tous les articles vendus, vous en avez vendu d'autres durant le mois en question).
Dans ce cas-là, faites une seconde requête, avec moins de conditions, qui ramène uniquement la donnée dont vous avez besoin (par exemple, dans la table avec vos ventes, ramenez uniquement le champ de date, sans condition d'objet).
Cela va créer dans BO une donnée synchronisée, et dans votre tableau utilisez-la à la place de la donnée créée par votre requête principale.
B) Soit, la donnée manquante n'existe nulle part ailleurs (votre entreprise est fermée en juillet, vous ne vendez jamais rien ce mois-là).
Dans ce cas, créez un faux tableau croisé, mettez en tête de colonne le nom que vous voulez faire apparaître (vos 12 mois par exemple) et dans le corps du tableau, sous chaque colonne, mettez une formule comme :
=IF([donnée]="tete de colonne";[résultat];0)
Autre solution, si la donnée manquante est dans une liste de valeurs courte, on peut créer une requête SQL pour gérer le problème de la même façon que dans A), par exemple pour les mois :
SELECT
1
AS
Mois FROM
dual
UNION
ALL
SELECT
2
AS
Mois FROM
dual
UNION
ALL
SELECT
3
AS
Mois FROM
dual
UNION
ALL
SELECT
4
AS
Mois FROM
dual
UNION
ALL
SELECT
5
AS
Mois FROM
dual
UNION
ALL
SELECT
6
AS
Mois FROM
dual
UNION
ALL
SELECT
7
AS
Mois FROM
dual
UNION
ALL
SELECT
8
AS
Mois FROM
dual
UNION
ALL
SELECT
9
AS
Mois FROM
dual
UNION
ALL
SELECT
10
AS
Mois FROM
dual
UNION
ALL
SELECT
11
AS
Mois FROM
dual
UNION
ALL
SELECT
12
AS
Mois FROM
dual