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 :

filtre numérique sur un champ texte


Sujet :

Access

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut filtre numérique sur un champ texte
    Bonjour,

    J'ai 2 champs dans ma table qui sont des dates mais qui sont au format texte car parfois il manque le jour et/ou le mois: donc dans ce cas, la date est écrit NR/05/2006 par exemple.

    Je dois calculer la différence entre ces 2 champs. ça fonctionne très bien avec DateDiff. Mais le résutat de la différence est au format texte, je crois. Car quand je veux faire un filtre sur cette différence, et dire par exemple supérieur à 15 jours (where diff > 15), ça me met data type mismatch. Si je mets "15" ou '15', ça ne change rien. Il n'arrive pas à me calculer texte>15.

    Avec des dates au vrai format date, le filtre sur la différence fonctionne bien.

    Donc savez vous comment faire
    - pour convertir la différence en chiffre pour que je puisse appliquer le filtre
    OU
    - pour faire le filtre "supérieur à 15" à partir d'un texte
    ?


    Merci

  2. #2
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    A priori une simple conversion de ton résultat texte en numérique devrait suffir.

    Par exemple :

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    L'aide en ligne VBA indique que DateDiff renvoie une valeur de type Variant Long.
    DateDiff("d", "01/05/2006", Now()) renvoie la valeur 3
    VBA a automatiquement converti "01/05/2006" en une date.
    par contre
    DateDiff("d", "NR/05/2006", Now()) -> Err 13 - Incompatibilité de type (=Type Mismatch)
    de même
    DateDiff("d", "31/04/2006", Now()) -> Err 13 - Incompatibilité de type
    Avril n'a que 30 jours, donc VBA n'a pas pû convertir de String vers Date.

    En résumé, je penses que le Type Mismatch vient de DateDiff.

    A+

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    slt,
    tt d'abord merci de vos réponses.

    Pour le DateDiff, c'est vrai qu'il me met error quand les dates comportent NR, ce qui est normal puisqu'il ne peut pas faire le calcul. Mais quand les dates sont "normales" et en format texte, le DateDiff fonctionne et ça me met le bon chiffre. Donc je pensais que ça convertissais tout seul en date. Mais en fait non, je ne peux pas travailler sur ce bon résultat: je ne peux pas faire de filtre, je ne peux pas trier...

    C'est pourquoi je cherchais un moyen de convertir ce bon résultat au format texte en nombre, pour pouvoir appliquer des filtres. J'ai testé clng mais ça me met invalid use of null

    Avez vous un autre moyen ? J'ai cherché sur google et j'ai vu sur un site que ce n'était pas possible de convertir du texte en numérique...J'espère qu'ils se trompent...

    Merci de votre aide

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je ne vois pas trop comment faire des calculs sur des champs non renseignés
    il te faut des régles de gestion qui spécifient quelles valeurs retenir
    à la place de NR
    ces régles peuvent être par exemple des valeurs de défaut et des déductions par rapport au champ connu
    par exemple si j'ai datenaissance 20/10/18nr
    et date décès 18/11/1891

    il est patent que nr est inférieur à 90 et supérieur à 0

    ceci étant si nr concerne des jours porter le nr à 15 ne vas pas trop abimer une durée exprimée en mois

    si tu donnes les règles nous pourrons t'aider

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    En fait, il n'y a pas de règles.

    Je ne veux pas me servir de ces dates avec NR. Elles existent mais je ne travaille pas dessus. Mais elles st dans ma table.

    Moi je voudrai un moyen de travailler (avec des filtres) sur le reste des dates, sans m'occuper des dates avec NR que je ne peux pas enlever.

    Donc quand j'ai des dates normales (format texte qd meme), le datediff fonctionne et j'ai un résultat. Quand j'ai des dates avec NR, le datediff met error: moi ce que je voudrais c'est pouvoir travailler avec les résultats du datediff où il n'y a pas error. Mais je ne peux appliquer aucun filtre (dans les données de la tables par un clic droit, ou directement dans une requete sql) car c'est là que ça me met type mismatch.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Points : 88
    Points
    88
    Par défaut
    En utilisant la fonction IsDate ça donne quoi ?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    et where not like "NR*" ?

  9. #9
    Membre actif Avatar de ActionAccess
    Inscrit en
    Mars 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 175
    Points : 213
    Points
    213
    Par défaut
    Bonsoir,

    La fonction DateDiff ne permettant pas de répondre au problème présenté ici, je propose la création d'une fonction qui permettra de faire la différence entre 2 dates si et seulement si il n'y a pas de "NR" dans les dates.

    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
    Public Function DateDiff2(Optional strDate1 As String, Optional strDate2 As String) As Variant
    Dim Date1 As Date
    Dim Date2 As Date
     
    If InStr(1, strDate1, "NR") = 0 Or IsNull(InStr(1, strDate1, "NR")) = True Then
    'Alors il n'y a pas de NR dans la date au format Texte
    Date1 = CDate(strDate1)
    Else
    DateDiff2 = Null
    Exit Function
    End If
     
    If InStr(1, strDate2, "NR") = 0 Or IsNull(InStr(1, strDate2, "NR")) = True Then
    'Alors il n'y a pas de NR dans la date au format Texte
    Date2 = CDate(strDate2)
    Else
    DateDiff2 = Null
    Exit Function
    End If
     
    DateDiff2 = DateDiff("d", Date1, Date2) 'différence en jour
    End Function
    Ensuite, dans une requête reprenant les 2 champs Date qui sont susceptibles de contenir des NR, j'ai ajouté un champ avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Différence :
    VraiFaux(EstNull(DateDiff2([DateDébut];[DateFin]))=Faux;CLong(DateDiff2([DateDébut];[DateFin]));Null)
    Au final, quand les deux dates sont valides, on a bien la différence, sinon on a une valeur Null.

    Evidemment, tout ceci est fortement améliorable (gestion d'erreur et autres...) car codé en quelques minutes.
    Espérant avoir répondu à la question,

  10. #10
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Je suis vraiment dsl de poser cette question qui va vous paraitre très stupide (mais je précise qd meme que je ne connais pas le visual basic )
    le code que tu as mis ActionAccess, à quel endroit faut il le mettre ?
    Pour moi, le visual basic se trouve pour les actions dans les formulaires. Moi ici, je n'ai pas de formualire, juste une table et une requete.

    En utilisant le not like NR, j'élimine tous les NR, mais je ne peux tjs pas appliquer de filtre dans ma requete car data type mismatch.

    En utilisant IsDate (que je dois surement mal utiliser), j'ai aussi data type mismatch. Je mets le IsDate dans le where de ma requete pour que ça fasse: where IsDate(date1_au_format_texte) et pr que ça donne vrai quand il y a bien une date sans NR.

    Voilà. Merci encore de votre aide.

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Pas besoin de code supplémentaire. Il suffit de créer une requête qui epurera les NR par exemple avec IsDate ou un like ... Et aprés tu réalises tes calculs sur le résultat de cette requête

  12. #12
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    salut!

    jusque là, j'avais pas fait dans ce sens là...

    j'avais fait une requete où je faisais à la fois datediff et le filtre pour pas avoir les NR: donc ça marchait mais je ne pouvais pas du tout travailler sur les résultats du DateDiff (pas possible de faire un filtre, de trier... car data type mismatch)

    là, j'ai fait en 2 étapes comme tu as dis: d'abord, je vire les NR dans une première requete. Puis, dans une 2eme requete, je fais un dateDiff sur les résultats de ma 1ère requete. ça fonctionne: je peux trier et appliquer des filtres. Mais seulement des filtres de type texte. car j'ai toujours le datediff qui a l'air de se trouver au format texte. Je ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where datediff(...) >15
    mais je peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where datediff(...) like '15'
    donc comment faire pour avoir la possibilité de faire
    datediff(...) >15
    ?

    merci

  13. #13
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Datediff retourne un numérique.Je ne vois pas pourquoi ça marche pas

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Citation Envoyé par Tofalu
    Datediff retourne un numérique.Je ne vois pas pourquoi ça marche pas
    Essaye voir d'utiliser la fonction CDATE pour convertir tes données en date ...

  15. #15
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    slt,

    Dans ma requete 1, j'ai converti mes données date avec CDate et ça marche. Après, dans ma requete 2, quand je fais un DateDiff sur les dates de ma requete 1, j'ai les bonnes différences mais je ne peux toujours pas faire de filtre. ça me met invalid use of null que je fasse un filter by selection sur 15, sur 0, ou que je fasse >15...

    Bon , c'est pas grave, je vous ai assez embêtée avec tout ça. Merci à tous pour votre aide.

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    A ce stade, met la partie de ton .mdb concerné en pièce-jointe et hop !

    philippe

Discussions similaires

  1. Contrôle de champ numérique sur des champs texte
    Par CinePhil dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 07/11/2013, 10h44
  2. [AC-2007] requete filtre sur un champ texte
    Par redwarf dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/11/2009, 14h04
  3. requete sur un champs text
    Par sam01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2006, 13h41
  4. Probleme d'UPDATE sur un champ text
    Par Nip dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/07/2005, 11h35
  5. Boucler sur des champs texte
    Par syl2095 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2004, 16h15

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