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

Access Discussion :

Transformer un temps sous forme de texte en valeur pour calcul


Sujet :

Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Transformer un temps sous forme de texte en valeur pour calcul
    Bonjour,

    Je suis débutant sous access, avec une bonne expérience des formules sous calc dans Libre Office.
    Je possède une base de donnée access, que je vais modifier au fur et a mesure pour pouvoir faire les requêtes souhaitées.

    Je visite beaucoup de forum et lis beaucoup de tutoriaux, mais ce n'est pas évident, c'est un vrai labyrinthe.

    Voici ma première question :
    J'ai un champ [chronos] sous cette forme : 3'17''82 (minute, seconde et centième) c'est un texte (ou une chaîne je crois).
    Ce temps correspond à une distance indiquée dans le champ [distance].
    Je souhaite créer un nouveau champ [reductionK] (réduction kilométrique) avec un calcul automatique : [chronos]/[distance]*1000

    Comme [chronos] est un texte, c'est impossible et je dois le convertir.

    J'ai trouvé un piste avec CDate, ou Val. Mais je n'arrive pas à mettre cela sous forme. J'ai aussi un souci avec les Champs calculés, lors de la création d'un champ, je peux demander un calcul automatique, mais je ne peux pas demander un calcul automatique à un champs déjà crée que j'aimerai modifier. Je trouve cela étrange.

    Si vous pouvez éclairer ma lanterne, merci d'avance.

  2. #2
    Modérateur

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

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

    Oui texte et chaîne sont des synonymes (en fait c'est chaîne de caractères).

    Pour ton problème de temps, il va falloir programmer toi-même la conversion.

    Ici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function ConvertirMinuteSecondeCentieme(prmTexte as string) as double
       'Converti le texte en secondes.
       dim result as double
     
       const I_MINUTE as long=0
       const I_SECONDE as long=1
       const I_CENTIEME as long=3
     
       dim t() as string:t=split(prmTexte,"'") 'Découpe en morceaux sur l'apostrophe
       result=val(t(I_MINUTE)) * 60 + val(t(I_SECONDE)) + val(t(I_CENTIEME))/100 'Utilise les morceaux pour faire le calcul.
       ConvertirMinuteSecondeCentieme=result
    end function
    prm est une abréviation perso pour "Paramètre" et me permet de savoir que cette valeur vient de l'extérieur de ma fonction.

    À mettre dans un module et appeler soit en VBA soit dans une requête.

    Pour le stockage dans la BD je le mettrai dans un champ de type réél double car les champs date/heure sont moins facile à utiliser quand on ne veut que la partie heure et qu'on veut faire afficher des choses comme 150h.

    Pour les champs calculés (dans une table) autant que je sache tu peux changer la façon dont ils sont calculés. Évidement tu peux pas modifier le résultat du calcul.
    Essaye d'éviter de mélanger les sujets questions pas reliés dans un même post. Idéalement il aurait fallu faire une question sur le calcul du temps et une question sur le problème des champs calculés.
    Cela donne plus de visibilité à tes problèmes.

    A+

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Oui texte et chaîne sont des synonymes (en fait c'est chaîne de caractères).

    Pour ton problème de temps, il va falloir programmer toi-même la conversion.


    À mettre dans un module et appeler soit en VBA soit dans une requête.

    A+
    Merci pour la réponse rapide, ça m'a l'air top.

    Par contre je nage complétement
    Comme j'ai dit, j'ai l'habitude des formules et là c'est vraiment un autre monde.
    Je suis confus entre Macro, Macro Access, VBA, voir Macro VBA, et code, et il y aussi la fenêtre SQL. Toutes mes lectures ne m'ont pas encore éclairées, mais ça prend forme.
    Là tu parles de module.

    J'ai donc pour le moment réussi à créer un module que j'ai nommé "TexteChronos" avec le code que tu m'as fourni.
    Mais je n'arrive pas à y faire appel dans ma requête. En plus dans les requêtes on peut basculer en mode SQL, où je pensais justement appeler le module.
    J'ai aussi essayé de créer dans la requête un nouveau champ [chronosV] (résultat de la conversion du texte de [chronos] ) Et essayé d'éditer tout ça avec Ctrl + F2
    Mais je bloque.

    Pas simple tout ça

  4. #4
    Modérateur

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

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

    Je suis confus entre Macro, Macro Access, VBA, voir Macro VBA, et code, et il y aussi la fenêtre SQL.
    Je ne suis pas vraiment surpris car c'est un peu mêlant, surtout que nous ne sommes pas très stricte sur l'usage.

    Ici quelques explications qui j'espère t'aideront.
    • Macro : ce peut être 2 choses, soit une macro pure et dure (objet de type Macro), soit du code VBA (objet de type module) appelé par un bouton ou autre chose,
      Note qu'une macro peut être dans un module ou dans une macro ou bien directement "dans" un formulaire ou un rapport.
    • Macro Access : à mon avis cela désigne les macros pures et dures.
    • Macro de données : disponible à partir de Access 2010, ce sont des macros (mais différentes des macros pures et dures) qui sont enregistrées dans et exécutées par les tables.
    • Code : terme générique pour toutes les sortes de programmation possible mais qui le plus souvent désigne du code VBA.


    la fenêtre SQL est simplement l'endroit où on peut voir et taper du code SQL pour une requête. Personnellement je m'en sert le moins souvent possible. L'éditeur de requête permet de faire 95% des choses dont on a besoin et l'éditeur de SQL est vraiment limité. Même Notepad est meilleur que lui.

    Pour en revenir à ton problème.

    Oui, il faut que tu crée un nouveau module, ce que tu sembles avoir fait.
    Ensuite tu double-cliques sur ce module pour accéder à l'éditeur de code VBA (ou simplement appelé Éditeur et parfois VBE).
    Tu copies le code et tu vérifies qu'il compile (menu débug / compiler). Je n'ai pas testé mon code donc il pourrait y avoir des erreurs et/ou des fautes de frappe.
    Une règle de bonne "hygiène" est de toujours avoir du code (VBA) qui compile sans erreur.
    C'est le 1er pas pour s'éviter des bugs et des ennuis en production.
    Une autre bonne règle est de toujours sauvegarder son code AVANT de l'exécuter. Cela évite d'avoir à refaire son travaille si Access plante soudainement à l'exécution.

    Aussi, avant de me lancer dans son usage réel, je crée généralement une procédure de test (dans mon module, juste au dessus de la fonction).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private sub Test_ConvertirMinuteSecondeCentieme()
        debug.print ConvertirMinuteSecondeCentieme("3'17''82")
    end sub
    Cela envoie le résultat de l'exécution dans la fenêtre d'exécution immédiate (pour la faire afficher [Ctrl][g]).
    Je peux ainsi valider que la fonction ou la procédure donne bien le résultat attendu.

    Pour l'utiliser dans une requête, il suffit de créer une nouvelle colonne et de lui donner un nom puis de mettre l'appel de la fonction.
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chronosV : ConvertirMinuteSecondeCentieme([NomTaTable].[chronosV])
    Tu peux le taper directement dans l'éditeur de requête, pas la peine de passer par l'éditeur de SQL.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Ça y est, mon premier flash !
    Le nom de la fonction a appeler dans le code est : ConvertirMinuteSecondeCentieme
    Je commence à comprendre. Passionnant. J'essayais d'appeler le nom du module et pas de la fonction.

    A suivre, je vais faire quelques essais.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par marot_r Voir le message

    Pour l'utiliser dans une requête, il suffit de créer une nouvelle colonne et de lui donner un nom puis de mettre l'appel de la fonction.
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chronosV : ConvertirMinuteSecondeCentieme([NomTaTable].[chronosV])
    Tu peux le taper directement dans l'éditeur de requête, pas la peine de passer par l'éditeur de SQL.

    A+
    Merci pour les infos, je comprends de mieux en mieux

    J'ai fait le test, ça fonctionne. C'est une bonne méthode.

    Ensuite j'ai créer une nouvelle colonne de requête (j'ai juste indiqué le nom de la table [dechronos] car je n'ai pas compris pourquoi mettre [dechronos].[chronosV] , la requête me demandait d'indiquer une valeur de champ si mes souvenirs sont bons, et il me semble que l'on est entrain de créer la table [chronosV] justement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chronosV : ConvertirMinuteSecondeCentieme([dechronos])
    Et j'ai une erreur 9
    le debug me revoit à la ligne 10 surlignée en jaune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = Val(t(I_MINUTE)) * 60 + Val(t(I_SECONDE)) + Val(t(I_CENTIEME)) / 100 'Utilise les morceaux pour faire le calcul.
    Je pense que c'est parce que dans le champ [dechronos], j'ai des cellules vides. Ça semble fonctionner pour les cellules avec un texte.
    Par contre tout bloque tant que je n'ai pas fait le debug

    Nom : bug_chronos.JPG
Affichages : 349
Taille : 76,3 KoNom : debug_chronos.JPG
Affichages : 367
Taille : 71,5 Ko


    Une idée ?

    De mon côté, je peux toujours faire ma requête en filtrant les cellules vides du champ [dechronos] mais je préfèrerais déboguer la requête.

  7. #7
    Modérateur

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

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

    La fonction ne teste pas si il n'y a pas de données.

    Tu peux le faire avant de l'appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iif(isnull([NomTaTable].[chronos]); Null; ConvertirMinuteSecondeCentieme([NomTaTable].[chronos]))
    Je t'invite à toujours préciser la source de ton champ (table ou requête) car même si Access peut s'en passer, si tu as plus d'une table source, cela facilite le débogage.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci, ça va beaucoup m'aider pour mes prochaines fonctions.
    Je pense que c'est un classique

    Je teste.
    @ +

Discussions similaires

  1. Affiché le fichier séléctionner sous forme de texte
    Par Jeremy0201 dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/07/2007, 15h45
  2. Réponses: 5
    Dernier message: 27/04/2007, 15h06
  3. Réponses: 3
    Dernier message: 20/04/2007, 17h26
  4. Réponses: 2
    Dernier message: 20/12/2006, 08h26
  5. [VBA-E] Probleme avec Nombre stocké sous forme de texte
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/07/2006, 01h46

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