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
Pour créer un objet il faut faire « click droit / objet » sur une classe dans la fenêtre de gauche du designer « classe et objets ».
Ensuite dans la fenêtre des « propriétés de l'objet, il existe 3 / 5 onglets selon la version de BO :
- Définition.
- Propriétés.
- Paramètres avancées.
- Clés (depuis la version XI).
- Sources d'information (depuis la version XI).
1 - Définition : dans cet onglet vous allez définir l'objet selon 5 champs :
- Le nom : c'est le nom de l'objet que l'utilisateur visualisera. Le nombre de caractères est limité à 35 en V5, mais n'est plus limité en XI.
- Le type : il existe 4 types (date, alphanumérique, numérique, texte long), ce type doit obligatoirement correspondre au type du champ interrogé dans la base de données (clause SELECT).
- La description : celle-ci est limitée environ à 30 000 caractères et permet à l'utilisateur lors de la création d'une requête d'avoir des détails sur l'objet utilisé.
- Le SELECT : cela correspond à la clause « SELECT » ajoutée au SQL lors de l'utilisation de cet objet dans une requête BO.
- Le WHERE : cela correspond à la clause WHERE ajoutée au SQL lors de l'utilisation de cet objet dans une requête BO.
- Les tables : ce bouton permet de choisir parmi les tables supplémentaires de l'univers à ajouter à la requête SQL lors de l'utilisation de cet objet dans une requête BO.
2 - Propriétés : dans cet onglet on définit :
- le type de l'objet : Dimension (en forme de cube bleu), Information (en forme de pyramide verte) et Indicateur (en forme de sphère rose). (voir " Pourquoi trois types d'objets dans les univers ?").
- la liste de valeurs de l'objet : ce sont les valeurs associées à cet objet qui seront affichées dans l'éditeur de requête, notamment lors de l'utilisation d'invites. Il y a également diverses options relatives à cette liste (actualisation automatique, export avec l'univers, affichage hiérarchique, droit de modification à l'utilisateur).
3 - Paramètres avancés : dans cet onglet on définit :
- le niveau de sécurité : public, contrôlé, restreint, confidentiel ou privé.
- le mode d'utilisation : au niveau de la requête, dans résultat, conditions, tri.
- le format de la base de données.
4 - Clés : cet onglet permet de définir une clé primaire et une clé étrangère pour l'objet
5 - Sources d'information : permet de notifier des informations sur l'objet (informations techniques, mise en correspondance et enregistrement en ligne)
Une fois défini, on peut analyser l'objet grâce au bouton « analyser » afin de vérifier si le SQL généré est OK.
Les filtres proposés dans la suite du message permettent de filtrer les contrats de travail d'une société.
Pour des raisons de clarté la table des contrats utilisée est simplifiée.
CREATE
TABLE
contrat
(
id_contrat NUMBER
(
3
)
PRIMARY
KEY
,
date_debut DATE
NOT
NULL
,
date_fin DATE
NOT
NULL
)
;
Etape 1 : Création des invites types
Les invites types pourront être réutilisés plusieurs fois sans devoir être réécrits à chaque utilisation et simplifient donc la maintenance en cas de modification.
Dans une classe INVITE, créer les objets suivants
Nom : Date observation
Qualification : Dimension
Type : Date
Description : Date d'observation utilisée
Select : @Prompt('Date observation ?','D',,MONO,FREE)
Nom : Date début observation
Qualification : Dimension
Type : Date
Description : Date de début de la période d'observation utilisée
Select : @Prompt('Date début observation ?','D',,MONO,FREE)
Nom : Date fin observation
Qualification : Dimension
Type : Date
Description : Date de fin de la période d'observation utilisée
Select : @Prompt('Date fin observation ?','D',,MONO,FREE)
Etape 2 : Création des filtres
Filtre : Contrats à la date du jour
SYSDATE
BETWEEN
contrat.date_debut AND
contrat.date_fin
Filtre : Contrats à la date d'observation
contrat.date_debut <= @Select(INVITE\Date observation)
AND contrat.date_fin >= @Select(INVITE\Date observation)
Filtre : Contrats dans la période d'observation
contrat.date_debut < = @Select(INVITE\Date fin observation)
AND contrat.date_fin >= @Select(INVITE\Date début observation)
ATTENTION !! Dans le cas où les dates peuvent être à NULL, alors les filtres doivent être adaptés car l'opérateur BETWEEN ne fonctionne pas avec une expression NULL.
Dans notre exemple, si la date de fin des contrats peut être NULL, alors le filtre Contrats à la date d'observation devient
contrat.date_debut <= @Select(INVITE\Date observation)
AND NVL(contrat.date_fin,TO_DATE('31/12/9999','DD/MM/YYYY')) >= @Select(INVITE\Date observation)
ou
contrat.date_debut <= @Select(INVITE\Date observation)
AND (contrat.date_fin >= @Select(INVITE\Date observation) OR contrat.date_fin IS NULL)
Réduire le nombre de lignes retournées par la base de données
Lorsque l'utilisateur exécute une requête, BusinessObjects génère le SQL de cette requête à partir des objets et filtres choisis par l'utilisateur, des jointures et contextes définis dans l'univers et aussi des différentes conditions posées par l'utilisateur. Le SQL généré est ensuite soumis à la base de données qui renvoie à BusinessObjects les différentes lignes résultant de la requête. Ces lignes constituent la source de données de BusinessObjects, source à partir de laquelle les rapports sont constitués.
- le nombre de données transférées sur le réseau est réduit
- la source de données de BusinessObjects contient moins de lignes
- BusinessObjects doit traiter moins de lignes pour la constitution des rapports
- entraînant une réduction du temps d'exécution.
- En privilégiant les conditions dans les requêtes aux filtres dans les rapports
- En optimisant les indicateurs dans l'univers
Comment optimiser les indicateurs dans l'univers ?
Les indicateurs sont très souvent associés à une fonction pour l'agrégation des données dans BusinessObjects : Max, Min, Moyenne, Nombre ou Somme.
Optimiser les indicateurs consiste à les associer à des fonctions d'agrégation SQL pour qu'une première agrégation des données soit réalisée par le SGBD.
Les fonctions d'agrégation SQL correspondant aux fonctions d'agrégation BusinessObjects Max, Min, Moyenne, Nombre ou Somme sont respectivement MAX, MIN, AVG, COUNT et SUM.
Une seconde agrégation est ensuite réalisée par BusinessObjects lorsque l'utilisateur décide de ne pas utiliser toutes les dimensions présente dans la source de données.
Exemple :
Notre exemple utilisera la base données simplifiée des restaurants d'un groupe international.
Les restaurants sont répartis par spécialité, par ville et par pays.
Pays | Ville | Spécialité | Nombre |
---|---|---|---|
FRANCE | LILLE | FRANCAISE | 2 |
FRANCE | LILLE | TURQUE | 1 |
FRANCE | PARIS | CHINOISE | 2 |
FRANCE | PARIS | FRANCAISE | 10 |
FRANCE | PARIS | ITALIENNE | 5 |
FRANCE | PARIS | TURQUE | 3 |
FRANCE | TOULOUSE | CHINOISE | 2 |
FRANCE | TOULOUSE | ITALIENNE | 2 |
FRANCE | TOULOUSE | TURQUE | 1 |
ITALIE | ROME | ITALIENNE | 7 |
USA | NEW YORK | CHINOISE | 2 |
USA | NEW YORK | FRANCAISE | 5 |
USA | NEW YORK | ITALIENNE | 4 |
USA | WASHINGTON | CHINOISE | 3 |
USA | WASHINGTON | FRANCAISE | 6 |
USA | WASHINGTON | ITALIENNE | 4 |
USA | WASHINGTON | TURQUE | 3 |
Pour n'afficher que la répartition des restaurants par pays, l'utilisateur n'utilise que les objets Pays et Nombre.
Le résultat obtenu dans le rapport est le suivant :
Pays | Nombre |
---|---|
FRANCE | 28 |
ITALIE | 7 |
USA | 27 |
Lorsque l'indicateur Nombre est associé uniquement à la fonction d'agrégation Somme() de BusinessObjects, alors la source de données est la suivante :
FRANCE | 10 |
FRANCE | 3 |
FRANCE | 5 |
FRANCE | 2 |
FRANCE | 2 |
FRANCE | 1 |
FRANCE | 1 |
FRANCE | 2 |
FRANCE | 2 |
USA | 5 |
USA | 4 |
USA | 2 |
USA | 6 |
USA | 3 |
USA | 4 |
USA | 3 |
... | ... |
ITALIE | 7 |
17 lignes retournées par le SGBD pour 3 lignes affichées dans le rapport BusinessObjects.
Lorsque que l'indicateur Nombre est associé à la fonction d'agrégation Somme de BusinessObjects mais aussi la fonction d'agrégation SQL SUM (ajout de SUM dans le Select de l'objet) alors la source de données est la suivante :
Pays | Nombre |
---|---|
FRANCE | 28 |
ITALIE | 7 |
USA | 27 |
3 lignes retournées par le SGBD pour 3 lignes affichées dans le rapport BusinessObjects.
Pour afficher la répartition des restaurants par pays, ville et spécialité l'utilisateur utilise maintenant les objets Pays, Ville, Spécialité et Nombre
Le résultat obtenus dans le rapport est le suivant
Pays | Ville | Spécialité | Nombre |
---|---|---|---|
FRANCE | LILLE | FRANCAISE | 2 |
FRANCE | LILLE | TURQUE | 1 |
FRANCE | PARIS | CHINOISE | 2 |
FRANCE | PARIS | FRANCAISE | 10 |
FRANCE | PARIS | ITALIENNE | 5 |
FRANCE | PARIS | TURQUE | 3 |
FRANCE | TOULOUSE | CHINOISE | 2 |
FRANCE | TOULOUSE | ITALIENNE | 2 |
FRANCE | TOULOUSE | TURQUE | 1 |
ITALIE | ROME | ITALIENNE | 7 |
USA | NEW YORK | CHINOISE | 2 |
USA | NEW YORK | FRANCAISE | 5 |
USA | NEW YORK | ITALIENNE | 4 |
USA | WASHINGTON | CHINOISE | 3 |
USA | WASHINGTON | FRANCAISE | 6 |
USA | WASHINGTON | ITALIENNE | 4 |
USA | WASHINGTON | TURQUE | 3 |
La source de données contient les mêmes lignes que le rapport et la fonction d'agrégation SQL n'a donc pas d'effet puisque que la requête n'a pas dimension sur laquelle faire de groupements. Par contre, dans le rapport si l'utilisateur décide ne plus afficher la dimension Spécialité alors c'est la fonction d'agrégation Somme de BusinessObjects qui réalise l'agrégation des données. Les données sont agrégées dans le rapport et non pas dans la source de données.
Pays. | Ville | Nombre |
---|---|---|
FRANCE | LILLE | 3 |
FRANCE | PARIS | 20 |
FRANCE | TOULOUSE | 5 |
ITALIE | ROME | 7 |
USA | NEW YORK | 11 |
USA | WASHINGTON | 16 |
Remarque importante : Les fonctions d'agrégation SUM, AVG, MAX ou MIN renvoient le marqueur NULL lorsqu'il n'y a aucune valeur dans la colonne, contrairement à COUNT qui renvoie zéro.
Méthode 1 : Utiliser les règles de détermination des années bissextiles
- Une année est bissextile lorsqu'elle est
- soit un multiple de 400
- soit un multiple de 4 mais pas un multiple de 100
Méthode 2 : Compter le nombre de jours dans l'année
Une année bissextile comporte 366 jours tandis qu'une année non bissextile n'en comporte que 365.
Méthode 3 : Déterminer le dernier jour du mois de février
Dans une année bissextile le mois de février comporte 29 jours tandis que dans une année non bissextile il n'en comporte que 28
Implémentation SQL
La requête suivante permet de lister les année 1900 à 3000 et détermine si elles sont bissextiles ou pas en utilisant les 3 méthodes.
--Environnement d'exécution : Oracle 9i
SELECT
annee,
CASE
WHEN
MOD
(
annee,400
)
=
0
OR
(
MOD
(
annee,4
)
=
0
AND
MOD
(
annee,100
)
<>>
0
)
THEN
'bissextile'
END
AS
methode1,
CASE
WHEN
TO_DATE
(
'31/12/'
||
TO_CHAR
(
annee)
, 'DD/MM/YYYY'
)
-
TO_DATE
(
'01/01/'
||
TO_CHAR
(
annee)
, 'DD/MM/YYYY'
)
+
1
=
366
THEN
'bissextile'
END
AS
methode2,
CASE
WHEN
EXTRACT
(
DAY
FROM
LAST_DAY
(
TO_DATE
(
'02/'
||
TO_CHAR
(
annee)
, 'MM/YYYY'
)))
=
29
THEN
'bissextile'
END
AS
methode3
FROM
(
SELECT
1900
+
(
ROWNUM
-
1
)
AS
annee
FROM
dual
CONNECT
BY
1900
+
(
ROWNUM
-
1
)
<=
3000
)
;
Extrait du résultat obtenu
ANNEE | METHODE1 | METHODE2 | METHODE3 |
1900 | |||
1901 | |||
1902 | |||
1903 | |||
1904 | bissextile | bissextile | bissextile |
1905 | |||
1906 | |||
1907 | |||
1908 | bissextile | bissextile | bissextile |
1909 |
Implémentation dans un univers BusinessObjects
On souhaite déterminer si l'année de naissance des agents d'une société est bissextile ou pas.
La date de naissance des agents est stockée dans le champs date_naissance de la table agent de la base de données (dans notre exemple Oracle 9i)
Dans la classe AGENT de notre univers TEST
Nom : Année de naissance
Qualification : Dimension
Type : Numérique
Description : Année de naissance de l'agent
Select : EXTRACT(YEAR FROM agent.date_naissance)
Nom : Année Bissextile
Qualification : Information
Dimension associée : Année de naissance (AGENT)
Type : Alphanumérique
Description : Indique si l'année de naissance de l'agent est une année bissextile
oui : l'année est bissextile
non : l'année n'est pas bissextile
Decode
(
CASE
WHEN
MOD
(
@Select
(
AGENT\Année de naissance)
,400
)
=
0
OR
(
MOD
(
@Select
(
AGENT\Année de naissance)
,4
)
=
0
AND
MOD
(
@Select
(
AGENT\Année de naissance)
,100
)
<>
0
)
THEN
'bissextile'
END
, NULL
, 'non'
, 'oui'
)
Pour calculer l'âge d'un individu, il suffit de compter le nombre d'années entières entre la date de naissance et la date du jour.
Implémentation dans un univers BusinessObjects
La date de naissance des individus est stockée dans le champs date_naissance de la table individu de la base de données (dans notre exemple Oracle 9i).
Dans la classe INDIVIDU de notre univers TEST...
Nom : Date de naissance
Qualification : Dimension
Type : Date
Description : Date de naissance de l'individu
Select : individu.date_naissance
Nom : Age
Qualification : Dimension
Type : Numérique
Description : Age de l'individu à la date du jour (en nombre d'années entières)
FLOOR
(
MONTHS_BETWEEN
(
SYSDATE
, @Select
(
INDIVIDU\Date
de naissance))/
12
)
Dans l'hypothèse où certaines dates de naissance pourraient être non renseignées ou supérieures à la date du jour, le Select peut être légèrement modifié pour ne pas obtenir des âges négatifs.
CASE
WHEN
@Select
(
INDIVIDU\Date
de naissance)
IS
NOT
NULL
AND
@Select
(
INDIVIDU\Date
de naissance)
<=
SYSDATE
THEN
FLOOR
(
MONTHS_BETWEEN
(
SYSDATE
, @Select
(
INDIVIDU\Date
de naissance))/
12
)
ELSE
0
END