F.A.Q. Business-ObjectsConsultez toutes les FAQ

Nombre d'auteurs : 15, nombre de questions : 101, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaire Reporter / Desktop Intelligence (Client lourd)Utilisation des Formules

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 :

  1. ll faut insérer une colonne (ou une cellule) ou en sélectionner une existante.
  2. 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")

Créé le 9 décembre 2007  par Bruno2r

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.
 
Sélectionnez
= 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.

 
Sélectionnez
=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")
Créé le 8 décembre 2007  par bastoonet

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 :

 
Sélectionnez
[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 :

 
Sélectionnez
[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]
 
Sélectionnez
[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)

Variable texte
Sélectionnez
=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

 
Sélectionnez
[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.

 
Sélectionnez
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
Créé le 14 janvier 2008  par Bruno2r

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.
Créé le 25 janvier 2008  par Bruno2r

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

 
Sélectionnez
= (Si (Signe([NB]) = 1) Alors [NB]

2) en pied de tableau

 
Sélectionnez
Min([NBPourMin])
Créé le 4 février 2008  par Bruno2r
Deux fonctions cumulatives sont disponibles dans la classe Fonctions d'agrégats :
  • 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 :

 
Sélectionnez
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
Créé le 10 avril 2008  par Bruno2r
Soit un tableau de chiffre utilisant la formule :
Sélectionnez
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
On peut réserver le calcul du cumul aux seules lignes de Type A de la façon suivante :
Sélectionnez
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
Créé le 10 avril 2008  par Bruno2r

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

 
Sélectionnez

=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

 
Sélectionnez

=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

 
Sélectionnez

=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

 
Sélectionnez

=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

 
Sélectionnez

=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

Créé le 10 juillet 2013  par Bruno2r

Mettre la formule suivante dans une cellule :

 
Sélectionnez

=EnDate(FormatDeNombre(NuméroDuMoisDeAnnée([Date].[MaDate]) ,"0")&"/"&FormatDeDate([Date].[MaDate] ,"aaaa") ,"mm/aaaa")
Créé le 10 juillet 2013  par TomDuBouchon

Créer une variable avec la formule suivante :

 
Sélectionnez

=(Max(Rang(<TaDimension> ,<TonIndicateur>)) Dans Bloc +1)-Rang(<TaDimension> ,<TonIndicateur>)
Créé le 10 juillet 2013  par TomDuBouchon

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 :

 
Sélectionnez

=((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) :

 
Sélectionnez

=((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))
Créé le 10 juillet 2013  par TomDuBouchon
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.