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
- Comment créer une formule ?
- Comment passer des secondes en hh : mm : ss ?
- Comment calculer la durée entre deux dates dans BO ?
- Comment se débarrasser de #MULTIVALEUR ?
- Comment trouver la plus petite valeur positive ?
- Comment réinitialiser les fonctions cumulatives ?
- Comment appliquer un contexte à une Somme cumulative ?
- XiR2 : Comment créer une date à partir du numéro de semaine ?
- Comment récupérer le premier jour du mois ?
- Comment obtenir une fonction Rang() inversée ?
- Comment calculer le nombre de mois entre 2 dates ?
Une formule :
-
Est une combinaison de fonctions, d'opérateurs, de variables.
-
Permet de faire des calculs sur les variables existantes.
-
Permet de réaliser des concaténations de variables de tous types (texte, numérique transformé en texte, date transformée en texte) pour obtenir une nouvelle variable alphanumérique.
Utilisation de la Barre de Formule :
Si la barre de formule n'est pas apparente, menu Affichage / Barre de formule (ou au menu contextuel sur l'une des barres d'outils) et choisissez Barre de formule
Pour insérer une formule dans un tableau ou une cellule :
- ll faut insérer une colonne (ou une cellule) ou en sélectionner une existante.
- Cliquer sur l'outil fx de la barre de formule.
Une fois dans la fenêtre Editeur de formule :
Il suffit d'un double clic sur les objets, fonctions, opérateurs et variables qui s'affichent dans les différentes zones pour mettre au point votre formule.
Au fur et à mesure de vos choix, la liste des opérateurs située à droite s'adapte de façon à vous proposer les seuls opérateurs compatibles avec ce que vous avez choisi.
S'il n'en propose qu'un, dites-vous bien que c'est parce qu'il est obligatoire.
Vous validez ensuite en cliquant sur OK.
Le résultat apparaît immédiatement et, s'il est correct, mieux vaut définir une variable dans la foulée (ce qui permettra à la colonne d'être dotée d'un entête et vous permettra d'utiliser cette nouvelle variable pour d'autres formules).
Pour cela, cliquez sur l'icône Définir en tant que variable. (Voir le sujet "Pourquoi et comment définir une variable")
Pour passer des secondes en hh:mm:ss dans BO, il faut :
- créer une formule, qui calcule d'abord le nombre d'heure (tps en secondes / 3600) ,
- puis calcule le nombre de minute dans le reste,
- et enfin le nombre de secondes dans le reste.
= Tronque(Somme([Tps en sec])/3600 , 0) & " h " & Tronque(Mod(Somme([Tps en sec]) , 3600)/60 , 0) & " m " & Mod(Somme([Tps en sec]) ,60) & " s"
Ensuite, on peut ajouter "SI NON ESTNUL() ALORS" , afin d'éviter d'afficher "h m s" lorsque le nombre de secondes est de zéro.
=SI NON ESTNUL([Tps en sec]) ALORS ( Tronque(Somme([Tps en sec])/3600 , 0)& " h "& Tronque(Mod(Somme([Tps en sec]) , 3600)/60 , 0) & " m " & Mod(Somme([Tps en sec]) ,60) & " s")
La difficulté réside dans la liste limitée de fonctions Date disponibles.
De plus la fonction JoursEntre([Date 1] ,[Date 2]) ne renvoie que des jours entiers.
La méthode exposée ci-dessous se propose de calculer la durée écoulée en secondes entre des date_heures_minutes_secondes (datetime):
- le même jour 13/12/2007 08:30 13/12/2007 12:00
- de jours différents mais jour et lendemain : 12/12/2007 08:30 13/12/2007 12:00
- espacées de plusieurs jours : 10/12/2007 08:30 13/12/2007 12:00
1) COMPRENDRE LE BESOIN :
Il nous faut d'abord tester si les dates couvrent des jours entiers.
[JOURS_ENTIERS_ENTRE] = Nb de jours entiers séparant les deux dates
Pour des Dates différentes
[PREMIER_JOUR] = 86400 secondes d'une journée de 24h - horaire exprimée en secondes
[JOURS_ENTRE] = Nb de jours entiers x 24h x 3600 secondes
[DERNIER_JOUR] = horaire exprimée en secondes
Pour des horaires à la même date :
[DUREE_MEME_JOUR] = horaire de fin - horaire de début exprimées en secondes
2) CREER LES VARIABLES :
[JOURS_ENTIERS_ENTRE] = JoursEntre([DDEB] ,[DFIN]) -1
[PREMIER_JOUR] = 86400 - ((EnNombre(FormatDeDate([DDEB] ,"HH"))* 3600)
+ (EnNombre(Droite(FormatDeDate([DDEB] ,"hhmm") ,2))* 60)
+ EnNombre(Droite(FormatDeDate([DDEB] ,"hhmmss") ,2)) )
[JOURS_ENTRE] = Si ([JOURS_ENTIERS_ENTRE] > 0) Alors 5 [JOURS_ENTIERS_ENTRE] * 24 * 3600) Sinon 0
[DERNIER_JOUR] = (EnNombre(FormatDeDate([DFIN] ,"HH"))* 3600)+ (EnNombre(Droite(FormatDeDate([DFIN] ,"hhmm") ,2))* 60)
+ EnNombre(Droite(FormatDeDate([DFIN] ,"hhmmss") ,2))
La Durée totale exprimée en secondes sera donc :
[DUREE_MEME_JOUR]
=
(
(EnNombre(FormatDeDate([DFIN] ,"hh"))* 3600)
+ (EnNombre(Droite(FormatDeDate([DFIN] ,"hhmm") ,2))* 60)
+ EnNombre(Droite(FormatDeDate([DFIN] ,"hhmmss") ,2))
)-(
(EnNombre(FormatDeDate([DDEB] ,"hh"))* 3600)
+ (EnNombre(Droite(FormatDeDate([DDEB] ,"hhmm") ,2))* 60)
+ EnNombre(Droite(FormatDeDate([DDEB] ,"hhmmss") ,2))
)
La Durée exprimée en secondes sera donc :
- soit cette [DUREE_MEME_JOUR]
- soit [PREMIER_JOUR] + [JOURS_ENTRE] + [DERNIER_JOUR]
[DUREE_EN_SECONDES]
= Si ([JOURS_ENTIERS_ENTRE] = -1) Alors [DUREE_MEME_JOUR] Sinon [PREMIER_JOUR] + [JOURS_ENTRE] + [DERNIER_JOUR]
Pour écrire une version texte du résultat en Heures Minutes Secondes :
Utiliser la fonction de bastoonet (honorable membre du Team BO)
=Tronque(Somme([DUREE_EN_SECONDES])/3600, 0) & " h "
& Tronque(Mod(Somme([DUREE_EN_SECONDES]), 3600)/60, 0) & " m "
& Mod(Somme([DUREE_EN_SECONDES]), 60) & " s"
Et en cadeau la durée en heures dans sa version décimale
[DUREE_HEURES_DECIMALES]
= Tronque( Somme([DUREE_EN_SECONDES]) / 3600 , 0) + (Mod(Somme([DUREE_EN_SECONDES]) , 3600) / 3600)
3) Tests et Vérifications :
Le SQL suivant nous fournira des exemples pour tester nos variables.
les DATETIME sont simplistes pour pouvoir vérifier mentalement.
select
'TEST1'
as
TEST, to_date
(
'20071210 08:30'
,'yyyymmdd hh24:mi'
)
as
DDEB, to_date
(
'20071213 12:00'
,'yyyymmdd hh24:mi'
)
as
DFIN
from
dual
UNION
select
'TEST2'
, to_date
(
'20071212 08:30'
,'yyyymmdd hh24:mi'
)
, to_date
(
'20071213 12:00'
,'yyyymmdd hh24:mi'
)
from
dual
UNION
select
'TEST3'
, to_date
(
'20071213 08:30'
,'yyyymmdd hh24:mi'
)
, to_date
(
'20071213 12:00'
,'yyyymmdd hh24:mi'
)
from
dual
VARIABLE | TEST1 | TEST2 | TEST3 |
DDEB | 10/12/2007 08:30 | 12/12/2007 08:30 | 13/12/2007 08:30 |
DFIN | 13/12/2007 12:00 | 13/12/2007 12:00 | 13/12/2007 12:00 |
JOURS_ENTIERS_ENTRE (Variable test) | 2 | 0 | -1 |
PREMIER_JOUR | 55 800 | 55 800 | 55 800 |
JOURS_ENTRE | 172 800 | 0 | 0 |
DERNIER_JOUR | 43 200 | 43 200 | 43 200 |
DUREE_MEME_JOUR | 12 600 | 12 600 | 12 600 |
DUREE_EN_SECONDES | 271 800 | 99 000 | 12 600 |
Une formule affiche #MULTIVALEUR lorsque elle fait référence à plusieurs lignes dans le tableau.
Cette erreur peut apparaitre dans :
- une cellule (titre de rapport.
- une section.
- un entête ou pied de tableau.
Vous avez deux méthodes pour y remédier :
-
Appliquer une fonction agrégation Min ou Max à la variable.
-
Poser un Tri sur cette cellule.
Dans une série de valeurs pouvant être négatives ou positives, il est simple de trouver la valeur maximum = max(variable)
Mais déterminer la plus petite valeur positive peut poser problème en présence de valeurs négatives.
L'astuce est la suivante : Substituer "Vide" au valeurs non positives
1) créer une variable [NBPourMin] dans une colonne à droite
= (Si (Signe([NB]) = 1) Alors [NB]
2) en pied de tableau
Min([NBPourMin])
- NombreCumulatif()
- SommeCumulative()
Soit un Tableau de données :
Année | Mois | Quantité | SommeCumulative([Quantité]) |
2006 | 01 | 10 | 10 |
2006 | 02 | 20 | 30 |
2006 | 03 | 10 | 40 |
2006 | 04 | 30 | 70 |
2007 | 01 | 20 | 90 |
2007 | 02 | 10 | 100 |
Pour réinitialiser ce cumul à chaque changement d'Année il faut compléter la formule de la façon suivante :
Cumul = SommeCumulative([Quantité] ; [Année])
Année | Mois | Quantité | SommeCumulative( [Quantité] ; [Année] ) |
2006 | 01 | 10 | 10 |
2006 | 02 | 20 | 30 |
2006 | 03 | 10 | 40 |
2006 | 04 | 30 | 70 |
2007 | 01 | 20 | 20 |
2007 | 02 | 10 | 30 |
CUMUL = SommeCumulative([Q])
ANNEE | TYPE | Quantité | SommeCumulative([Q]) |
2007 | A | 10 | 10 |
2007 | B | 20 | 30 |
2007 | C | 10 | 40 |
2008 | A | 30 | 70 |
2008 | B | 10 | 80 |
CUMUL A = SommeCumulative([Q]) Où ([TYPE] = "A")
On obtient ainsi le cumul des Quantité dans le contexte A
ANNEE | TYPE | Quantité | SommeCumulative([Q]) Où ([TYPE] = "A") |
2007 | A | 10 | 10 |
2007 | B | 20 | |
2007 | C | 10 | |
2008 | A | 30 | 40 |
2008 | B | 10 |
Dans BO il est simple de calculer la date du premier janvier de l'année en cours
En 2009 c'est le 01/01/2009
=EnDate("0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa")
On peut donc savoir quel jour de semaine tombe ce premier jour de l'année ici jeudi = 4
=NuméroDuJourDeLaSemaine(
EnDate("0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa"))
Sachant qu'une semaine est de 7 jours on peut trouver la date du 1er jour de la semaine 1 en enlevant (7-4 jours)= 29/12/2008
=DateRelative(
EnDate(
"0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa")
,-7+ NuméroDuJourDeLaSemaine(
EnDate("0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa")))
Il suffit ensuite d'ajouter le multiple de 7 (a X 7) que l'on désire pour obtenir le premier jour de la semaine a exemple +3 semaines on obtient le 19/01/2009 jour 1 de la semaine 4
=DateRelative(
EnDate(
"0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa")
,-7+ NuméroDuJourDeLaSemaine(
EnDate("0101"&FormatDeNombre(Année(DateCourante()) ,"0000") ,"jjmmaaaa")))
+(7*3)
Appliqué aux variables numériques suivantes : année = 2009, semnum = 4, journum = 5
=DateRelative(
EnDate(
"0101"&FormatDeNombre(<année> ,"0000") ,"jjmmaaaa")
,-7+ NuméroDuJourDeLaSemaine(
EnDate("0101"&FormatDeNombre(<année> ,"0000") ,"jjmmaaaa")))
+(7*(<semnum>-1)+(<journum>-1))
On obtient bien le 23/01/2009 jour 5 de la semaine 4 de l'année 2009
Mettre la formule suivante dans une cellule :
=EnDate(FormatDeNombre(NuméroDuMoisDeAnnée([Date].[MaDate]) ,"0")&"/"&FormatDeDate([Date].[MaDate] ,"aaaa") ,"mm/aaaa")
Créer une variable avec la formule suivante :
=(
Max
(
Rang(<
TaDimension>
,<
TonIndicateur>))
Dans Bloc +
1
)-
Rang(<
TaDimension>
,<
TonIndicateur>)
Il est souvent demandé s'il existe un équivalent dans BO à la fonction MONTHS_BETWEEN d'Oracle.
Malheureusement non, mais vous pouvez réussir à retrouver ce nombre avec la formule suivante.
Sans tenir compte du jour du mois :
=((
Année(<
Date
2
>)-
Année(<
Date
1
>))*
12
)+(
NuméroDuMoisDeAnnée(<
Date
2
>)-
NuméroDuMoisDeAnnée(<
Date
1
>))
En tenant compte du jour du mois (approximatif) :
=((
Année(<
Date
2
>)-
Année(<
Date
1
>))*
12
)+(
NuméroDuMoisDeAnnée(<
Date
2
>)-
NuméroDuMoisDeAnnée(<
Date
1
>))+(
Tronque(((
NuméroDuJourDuMois(<
Date
2
>)-
NuméroDuJourDuMois(<
Date
1
>)+
1
)/
30
)
,1
))