
| | auteur : Bruno2r | 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")
|
| | auteur : bastoonet | 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")
|
|
| | auteur : Bruno2r | 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)
| Variable texte | =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 |
|
| | auteur : 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.
|
| | auteur : 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 = (Si (Signe([NB]) = 1) Alors [NB]
|
2) en pied de tableau |
| | auteur : 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 :
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 |
|
| | auteur : Bruno2r | | Soit un tableau de chiffre utilisant la formule : | 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 : | 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 |
|
|
| | auteur : Bruno2r |
Problème :
Lorsque vous faites glisser en en-tête de section un objet indicateur (doté par défaut de la fonction d'agrégation Somme), le résultat obtenu est celui de la valeur totale de cet indicateur ... dans cette section.
C'est BO qui fait tout le boulot.
| Apparemment la formule est : | |
| Mais en fait il applique un contexte de calcul : | = Somme(<Indicateur> Dans Corps) Dans <Section>
|
Pour visualiser cette formule il suffit d'approcher le pointeur de la souris de la barre de formule, celle-ci apparaît en infobulle un court instant.
Autre méthode, cliquer sur l'outil - Définir en tant que Variable - :
En choisissant - Formule dans son contexte - on voit la formule exacte élaborée par BO.
Solution :
Si vous voulez afficher en en-tête de chaque section la valeur totale du rapport, le moyen le plus simple est de vous familiariser avec les formules contextuelles.
| Pour le total Global la formule est : | = Somme(<Indicateur> Dans Corps) Dans Rapport
|
- Dans Corps - est le contexte d'Entrée du calcul
- Dans Rapport - est le contexte de Sortie
|
Consultez les autres F.A.Q's
Les sources présentés sur cette pages sont libre de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©2008
Developpez LLC. Tout 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'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérets.
Cette page est déposée à la SACD.
|