Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo

precedent    sommaire    suivant   


Comment créer une formule ?
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 :

  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.

infoS'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")


Comment passer des secondes en hh : mm : ss ?
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")

Comment calculer la durée entre deux dates dans BO ?
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

Comment se débarrasser de #MULTIVALEUR ?
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.

Comment trouver la plus petite valeur positive ?
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.

ideaL'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])

Comment réinitialiser les fonctions cumulatives ?
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

Comment appliquer un contexte à une Somme cumulative ?
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

Comment Afficher le total global du rapport dans une section ?
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 :
= Somme(<Indicateur>)
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


precedent    sommaire    suivant   

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.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com