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 :

Compter dans un champ texte le nombre de fois où un caractère défini revient


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut Compter dans un champ texte le nombre de fois où un caractère défini revient
    Bonjour, je ne trouve aucune info qui me permette de compter le nombre de fois qu'un caractère prédéfini est insérer dans un champ de texte.

    Par exemple dans un champ "Nom" contenant "truc;machin;bidule;chose" j'aimerais savoir déterminer le nombre de ";" présent. Une piste ? Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut
    Ok j'ai obtenu un résultat en passant par une fonction. Je ne sais pas si c'est la meilleure solution ni la plus propre, mais ça fonctionne. J'utilise cette fonction avec en paramètre la valeur du champ texte :

    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
    Function fonctionVerificationVirgule(txtRecherche As String)
    Dim i, n, varNbVirgule, varPositionVirgule As Integer
     
        varNbVirgule = 1
        Do
            varPositionVirgule = InStr(varNbVirgule, txtRecherche, ";")
            If varPositionVirgule > 0 Then
                i = i + 1
                varNbVirgule = varPositionVirgule + 1
            Else
                MsgBox i
                Exit Do
            End If
        Loop
    End Function
    Maintenant que je sais par exemple que j'ai 3 ";", je voudrais récupérer distinctement les mots séparés par la ; dans des variables du style txt1, txt2, txt3, txt4.

    Le but étant d'obtenir, par exemple de la chaine Nom="truc;machin;bidule;chose", un ensemble de txt1="truc", txt2="machin", txt3="bidule", txt4="chose".

    C'est envisageable ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 628
    Points : 34 328
    Points
    34 328
    Par défaut
    salut,
    tu as plusiseurs méthodes pour compter le nombre d'occurences :
    - combinaison fonctions Split + Ubound
    - Len + Replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function NbOc(Chaine As String, Ch As String, Optional RC As Boolean = False) As Long
            If RC Then
               NbOc = (Len(Chaine) - Len(Replace(Chaine, Ch, "", , , 0))) / Len(Ch)
            Else
               NbOc = (Len(Chaine) - Len(Replace(Chaine, Ch, "", , , 1))) / Len(Ch)
            End If
    End Function
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut
    Salut, le problème avec ce genre de méthode c'est que ça ne me permet pas de récupérer dans des variables le texte compris entre chaque ";" il me semble.

    J'ai modifié légèrement ma fonction pour que ce que je cherche à obtenir soit plus simple à comprendre :

    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
    Function fonctionVerificationVirgule(txtRecherche As String)
    Dim i, varPositionDepart, varPositionArrivee As Integer
     
        varPositionDepart = 1
        Do
            varPositionArrivee = InStr(varPositionDepart, txtRecherche, ";")
            If varPositionArrivee > 0 Then
                i = i + 1
                varPositionDepart = varPositionArrivee + 1
     
                ' il faut récupérer à chaque tour le mot entre la position varPositionDepart et varPositionArrivee 
                ' dans une variable du style "txtTitre & i"
            Else
                Exit Do
            End If
        Loop
    End Function
    EDIT : Je viens de découvir la fonction "SPLIT", je ferais pas mieux de l'utiliser pour ce que je veux faire ?

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut jpcheck et nicolas2603,

    Citation Envoyé par jpcheck
    - combinaison fonctions Split + Ubound

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut
    Oui c'est bien ce que je me disais ! Effectivement j'arrive à récupérer facilement dans un tableau les différents éléments. Maintenant, c'est possible de sortir chaque élément (à chaque "for i=" je suppose) dans une variable incrémentée ?

    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
    Function fonctionVerificationVirgule(txtRecherche As String)
    Dim varTableau As Variant
    Dim i%
     
        varTableau = fSplit(txtRecherche, ";")
        If IsArray(varTableau) = False Then
            ' un seul mot
        Else
            For i = 0 To UBound(varTableau)
                txt1 =  varTableau(i)
                ' il faudrait que txt1 devienne txt2, puis txt3, etc...
                ' du genre "txt" & i
            Next
        End If
    End Function

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 628
    Points : 34 328
    Points
    34 328
    Par défaut
    salut,
    où est l'intérêt d'une "variable incrémentée" si tu as déjà tout dans ton tableau ?

    que veux-tu faire des données une fois extraites ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut
    En fait à la base je veux faire une recherche dans ma base en fonction du contenu d'un champ, "titre" par exemple. Mais je souhaite que ma recherche puisse trouver la correspondance, même si le titre tapé n'est pas entier.

    Par exemple dans ma base j'ai "Note interne concernant l'estimation des crues". Si je ne connais pas le nom exact j'aimerais que l'on puisse taper par exemple dans le champ titre "note concernant crues". J'ai donc une requête qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM BASE_documents
    WHERE BASE_documents!N <> 0 And BASE_documents!titre like ' " & titre & " ' "
    ORDER BY BASE_documents.N;
    Mais bien évidemment ça ne retourne aucun résultat, logique. J'ai donc opté pour remplacer les espaces par des *. Là ça me retourne le bon résultat, mais à condition que les mots soient dans le même ordre que dans la base. Cette solution me parait la meilleure si c'est possible de faire interpréter les mots dans n'importe quel ordre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    titre = Replace(titre, " ", "*")
    strSQL = strSQL & " And BASE_documents!titre like '*" & titre & "*' "
    Donc je me dis que pour que ça fonctionne au maximum, je récupère dans un tableau les différents mots (via SPLIT) et j'adapte ma requête en fonction du nombre de mots. Ce qui me donne par exemple si mon tableau contient 3 résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM BASE_documents
    SELECT *
    FROM BASE_documents
    WHERE BASE_documents!N <> 0 And BASE_documents!titre like '*" & txt1 & "*' And BASE_documents!titre like '*" & txt2 & "*' And BASE_documents!titre like '*" & txt3 & "*'"
    ORDER BY BASE_documents.N;
    Mais pour ça, il faut qu'à chaque boucle du tableau (post au dessus, avec à la place du ; un espace plutot) la valeur soit associée à la variable ! Je sais que c'est assez complexe (en tout cas à mon niveau il me semble) mais j'espère avoir été assez clair sur ce que je cherche à faire, et comment je procède !

  9. #9
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 628
    Points : 34 328
    Points
    34 328
    Par défaut
    ok,
    alors déjà concernant la partie critère de ta requete, je pense qu'un OR serait plus adéquat qu'un AND
    ensuite, rien ne t'empêche de générer une requete en passant dans une boucle :
    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
    Dim strSQL As String
    Dim i As Integer
    strSQL = "SELECT *
    FROM BASE_documents
    WHERE BASE_documents!N <> 0 And ("
     
    varTableau = fSplit(txtRecherche, ";")
    For i = 0 to UBound(varTableau)
             strSQL = strSQL & "BASE_documents!titre like '*" & varTableau(i) & "*' OR "
    Next i
    'ici on supprime le dernier OR en trop
    strSQL = Left(strSQL,Len(strSQL)-3)
    'et on poursuit la requete
    strSQL = strSQL & "ORDER BY BASE_documents.N;"
    'on affiche la requete générée pour vérifier
    Debug.Print strSQL
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  10. #10
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    autrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    critere = "([titre] Like '*" & Replace(champ, ";", "*') OR ([titre] Like '*") & "*')"
    avec comme séparateur ";" qui peut être remplacé par l'espace.
    avec: "... WHERE " & critere
    et peut être en rajoutant qq tests supplémentaires.


  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    581
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 581
    Points : 146
    Points
    146
    Par défaut
    là je dis "BRAVO". Je ne m'en suis pas sorti avec ta solution vodiem (mais bon je ne suis pas top doué non plus), par contre avec celle de jpcheck légèrement adapté à mon code fonctionne nickel ! Que je mettre 1 ou 150 mots, dans n'importe quel ordre, ça fonctionne !!!

    Merci bcp et franchement chapeau !

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

Discussions similaires

  1. [AC-2007] Sélection stricte des nombres dans un champ texte
    Par Razorback dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/08/2009, 09h32
  2. [MySQL] Limiter le nombre de caractères dans un champ texte
    Par bibi28 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/01/2008, 08h31
  3. résultat du nombre d'enregistrements dans un champ texte
    Par froutloops62 dans le forum Access
    Réponses: 2
    Dernier message: 02/08/2007, 23h20
  4. Réponses: 1
    Dernier message: 16/07/2007, 08h26
  5. Récupérer un nombre dans un champs texte
    Par mandou36 dans le forum Access
    Réponses: 18
    Dernier message: 05/09/2006, 19h11

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