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
Sommaire→ Designer→Définition des objetsPour 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_finFiltre : 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


