IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Calcul d'un champ Text avec un champ Numérique [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Calcul d'un champ Text avec un champ Numérique
    Bonjour,
    J'aimerais multiplier 2 champs entre eux via une requete: Le probleme étant que l'un des deux champs et de type texte (Ce que je ne peux pas changer car ce champs est rempli via VBA qui va chercher du texte sur un page web). Les valeur pouvant se trouver dans le champs de type texte peuvent resembler a cela:
    3.17B*
    7.32B
    1.59B
    465.92M


    Les B et les M etant pour Millions et Milliard (Billions en Anglais) et le "." étant la pour delimiter les décimales et sachant qu'il faudrait une fois le calcul réaliser remettre les B et les M a leur place.

    Donc du coup je ne sais pas trop comment m'y prendre.. quelqu'un pourrait-il m'aider SVP ?

    Cordialement

    TH

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Déjà il va falloir éliminer les B pour ne conserver que les chiffres puis convertir tes chiffres en nombre.

    Je te propose la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public function ConvertirMillion(prmValeur as string) as double
      dim result as double
      dim t as string:t=prmValeur
      dim multiplcateur as double
     
      if prmValeur like "*B*" then
         multiplicateur=1000000000.00
      elseif prmValeur like "*M*"  then
         multiplicateur=1000000.00
       else
         multiplicateur=1
      end if
     
      t=replace(t, "B", "") 'Supprime le B
      t=replace(t, "M", "") 'Supprime le M
     
      if right(t,1)="*" then
        t=left(t,len(t)-1) 'Supprime l'étoile
      end if
     
      result=val(t) 'Converti le texte en nombre. Val() utilise toujours le "." comme séparateur décimal
      result=result *  multiplicateur
      ConvertirMillion=result
    end function
    Example d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print ConvertirMillion("3.17B*")
    A+

  3. #3
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Bonjour tout d'abord merci de ta réponse,
    Je suis assez nouveau sur Access, je crée en ce moment ma premiere base de donnée; du coup je vais avoir besoin de quelques indications supplémentaire;
    Peux-tu préciser sur l'utilisation de la fonction --> Dois utiliser le code dans la requete que j'ai créé pour l'occasion?
    Il faut aussi savoir que je dois faire l'opération pour tout les enregistrement qui se trouve dans le champs [MarketCap] du coup est-ce que cela change quelque chose au niveau de la fonction ou est-ce que cela se passera au niveau de l'execution? Une fois faite il faut que je multiplie le résultat par un autre champs numérique et ce résultat sera renvoyédans un table.

    Encore merci pour ta réponse
    Dis moi si tu as besoin de plus d'info

    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Déjà il va falloir éliminer les B pour ne conserver que les chiffres puis convertir tes chiffres en nombre.

    Je te propose la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public function ConvertirMillion(prmValeur as string) as double
      dim result as double
      dim t as string:t=prmValeur
      dim multiplcateur as double
     
      if prmValeur like "*B*" then
         multiplicateur=1000000000.00
      elseif prmValeur like "*M*"  then
         multiplicateur=1000000.00
       else
         multiplicateur=1
      end if
     
      t=replace(t, "B", "") 'Supprime le B
      t=replace(t, "M", "") 'Supprime le M
     
      if right(t,1)="*" then
        t=left(t,len(t)-1) 'Supprime l'étoile
      end if
     
      result=val(t) 'Converti le texte en nombre. Val() utilise toujours le "." comme séparateur décimal
      result=result *  multiplicateur
      ConvertirMillion=result
    end function
    Example d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print ConvertirMillion("3.17B*")
    A+

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Comme c'est une fonction publique tu peux t'en servir n'importe où que de soit dans une requête ou du code et autant de fois que tu en as besoin sans modification.

    Elle retourne un double soit un nombre réel à la précision maximale que peut supporter Access.

    Comme c'est un nombre tu peux te servir du résultat comme un autre nombre. Ex : ConvertirMillion("1M")/2 va te donner 500000.

    Si tu as beaucoup de données tu auras peut-être des problèmes de rapidité d'exécution car une fonction publique empêche Access de faire des optimisation mais c'est peu probable.
    Si c'était le cas il faudrait envisager de soit remplacer la fonction par une combinaison de fonctions internes soit de procéder différemment.

    Attention à propos des réels sur les ordinateurs : tu n'as jamais une précision infinie sur un ordinateur. À un moment ou un autre il va stocker une "bonne" approximation de ton nombre. Par exemple 2.0 pourrait devenir 1.9999999999999999 ce qui mathématiquement est très proche de 2.0. Ce n'est pas spécifique à Access ou aux PC et c'est dû au codage du nombre en mémoire.
    Ce n'est généralement pas un soucis sauf si on fait des additions nombreuses car on peut finir par avoir des erreurs d'arrondi sur les décimales.

    A+

  5. #5
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut RE
    Salut,
    Merci pour les explications supplémentaire, cependant je penses avoir loupé quelque chose, en fait mon probleme c'est que je ne vois pas ou utiliser la fonction public dans ma requete... Comment je fais pour appliquer la fonction pour un champs [MarketCap] dont le resultat sera renvoyé dans un champs different de la requete ? N'ai-je pas des références a ajouter sur ma base? car quand j'essai d'utiliser la fonction dans la ligne Critere de l'assistant de création requete Access affiche un message d'erreur a l'excecution disant "Fonction non définie dans l'expression".. saurais-tu a quoi cela est du?

    Merci encore pour ton aide !

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Non il n'y a pas de référence à ajouter. VBA est un morceau de Access et est donc déjà référencé.

    Peux-tu poster une copie d'écran de ta colonne de requête avec les critères visibles ?

    A+

  7. #7
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Re,
    okay merci pour la precision sur les références.
    Je joins la capture d'ecran de ma requete mais le probleme c'est que la fonction n'apparait nul part etant donné que je ne sais pas ou et comment l'utiliser..

    Merci pour ton aide

    Cordialement

    TH
    Images attachées Images attachées  

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Normalement si tu utilises l'assistant de création d'expression tu devrais la voir dans la catégorie des fonctions personnelles.

    Juste pour être sûr, as-tu bien copié le code de la fonction dans un module ?

    Sinon pour l'utiliser dans une requête, tu as juste à créer un champ calculé qui ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TonChampCalcule : ConvertirMillion([NomTaTableSource].[NomTonChampSoure])
    Et il sera peut-être intelligent de changer le nom de la fonction puisqu'elle ne convertit pas que les millions.

    A+

  9. #9
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Re:
    Bonjour,
    Tout d'abord un GRAND merci cela fonctionne a merveille !

    Maintenant une fois que j'ai utilisémon champs pour le calculer j'aimerai faire la meme opération mais dans le sens inverse.. du coup a quoi ressemblerai le module pour y arriver ?

    Et merci encore pour l'aide que tu m'as dors et deja fourni

    Cordialement

    TH

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public function ConvertirEnTexte(prmValeur as double) as string
       dim result as string
       dim diviseur as double
       dim unite as string
     
       select case prmValeur 
          case < 100000 'Pas encore un million, donc pas de changement d'unité.
             diviseur=1
             unite=""
     
          case < 100000000  'Pas encore un milliard, donc en millions
             diviseur=1000000.00 'Million
             unite="M"
     
          case else 'Si aucun n'est vrai avant alors c'est au moins un milliard
             diviseur=1000000000.00 'Milliard
             unite="B"
     
       end select
     
       result=format(prmValeur/diviseur, "0.00")
       result=replace(result, ",", ".") 'Remplace la virgule par un point
       result=result & unite 'Ajoute M ou B selon le besoin
     
       ConvretirEnTexte=result
    end function
    Comme je ne sais pas à quoi correspond l'étoile en fin de B dans ton exemple je ne l'ai pas traité.

    Dans un select case ... end case, dès qu'un cas est vrai le code exécute les instructions associées et sort du case sans regarder les autres donc l'ordre de traitement est important.

    Pour la production de result on aurait pu tout combiner en une seule ligne mais je trouve cela moins lisible et plus difficile à débugger.

    Ici ce que cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result=replace(format(prmValeur/diviseur, "0.00"), ",", ".") & unite
    A+

  11. #11
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Re
    Salut !
    Du coup j'ai créer un nouveau module et dans la requete j'essaie de l'appliquer a un nouveau champs mais j'ai comme un probleme (Cf les images jointes)
    Nom : Requete currency2.PNG
Affichages : 242
Taille : 15,7 Ko
    Le probleme est que quand je run la requete voila le message que je recois:
    Nom : Requete currency3.PNG
Affichages : 241
Taille : 8,2 Ko

    Me serais-je encore trompé sur l'excecution ?

    Comme je ne sais pas à quoi correspond l'étoile en fin de B dans ton exemple je ne l'ai pas traité.
    Sinon tu as parfaitement bien fait c'est le texte de la page web qui met des etoiles quand la Market Cap n'est pas en Dollar probleme que justement nous sommes en train de traiter
    Merci encore une fois pour ton aide

    Cordialement

    TH

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Essaye en gardant simplement [usdmc]. Quand tu te refères à un champ de la requête dans la requête elle-même il n'est pas nécessaire de le préfixer.

    Sinon il va falloir que tu remettes le calcul au complet (décodage et multiplication) dans entre les parnthèses de ConvretirEnTexte().

    Et je t'invite à changer ConvertirMilion() en ConvretirEnNombre(), ce sera plus représentatif de ce que fait la fonction.

    A+

  13. #13
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Re
    Bonjour,
    Du coup j'ai suivi ton conseil et changé le nom de la fonction pour quelle soit plus explicit.

    Sinon j'ai essayé de faire comme tu m'as dis pour appliquer la fonction ConvertirEnTexte() en essayant bien des deux facons mais cela ne fonctionne pas
    Voila ce que j'obtiens sur ma requete: Nom : QueryCurrency1.PNG
Affichages : 236
Taille : 8,3 Ko

    Et voici les trois champs calculé en mode création:Nom : QueryCurrency_Champs_Calculés.PNG
Affichages : 239
Taille : 8,7 Ko

    Aurais-je fais une erreur ?

    En tout cas merci pour ton temps c'est franchement sympathique de ta part

    Cordialement
    TH

  14. #14
    Membre du Club
    Homme Profil pro
    Process Improvment
    Inscrit en
    Mai 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Process Improvment
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Re
    C'est bon j'ai trouvé ou été le pépin !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ConvretirEnTexte = result 'Au lieu de ConvERtirEnTexte bien évidement
    End Function
    Une erreur c'etait glissé dans la fonction publique mais maintenant tout fonctionne a merveille !! MERCI !

    Une derniere toute petite question: Comment puis-je faire pour renvoyer la valeur de ce champs calculé dans un champs donné de ma table [Opportunities] ?

    Merci encore pour ton aide précieuse

    Cordialement

    TH

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2009, 11h10
  2. [MySQL] affichages resultats requête avec un champ texte
    Par carelha dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/04/2006, 13h06
  3. Probleme avec un champ texte
    Par Seth77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 23/02/2006, 13h14
  4. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 00h55
  5. Verrouiller un champ texte avec condition
    Par uskiki85 dans le forum Access
    Réponses: 5
    Dernier message: 09/09/2005, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo