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

Contribuez Discussion :

Construction de critères texte pour requêtes SQL


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Support technico réglementaire
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Support technico réglementaire
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Par défaut Construction de critères texte pour requêtes SQL
    Depuis mes débuts en Access, en 1998, j'ai vu de nombreux utilisateurs s'arracher le cheveux lorsqu'il s'agit de créer un critère "texte" à insérer dans une requête SQL.
    Voici une fonction qui me donne satisfaction depuis 1999 et qui peut être utilisée soit dans des modules VBA, soit dans l'interface de création de requêtes (les explications sont dans l'entête de procédure) :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    '===============================================================================
    Public Function VarChaînePourSQL(ByVal Chaîne As Variant) As Variant
     
    'CRÉATION :         06 février 1999 © AUTINOR - Hervé Mary
    'MODIFICATIONS :    23 février 2002 - Hervé Mary
    '                   * CORRECTION DE BUG :
    '                     La technique, développée dans le "Guide du développeur"
    '                     Sybex par Paul Litwin, et qui consistait à encadrer la
    '                     chaîne d'apostrophes et à doubler les apostrophes à l'in-
    '                     térieur de la chaîne NE FONCTIONNE PAS. Par exemple, le
    '                     moteur de base de données JET ne trouve pas la chaîne
    '                     "GUIDE D'EMPLOI", car il cherche en réalité la chaîne
    '                     "GUIDE D''EMPLOI".
    '                     La fonction a été modifiée pour donner satisfaction même
    '                     lorsque la chaîne inclue simultanément des guillemets et
    '                     des apostrophes.
    'DESCRIPTION :
    '   Cette fonction reçoit une chaîne de caractères et retourne cette chaîne
    'après l'avoir formatée de manière à ce qu'elle puisse servir de critère à une
    'requête SQL utilisée par le moteur de base de donnée JET.
    'Elle retourne Null si la variable reçu était Null ou Empty.
    'Par exemple, s'il faut chercher les enregistrement dont le champ "MotsClé"
    'contient un mot contenu dans la variable "MotCherché", la requête correspon-
    'dante sera construite à partir des instruction :
    '   FindFirst("MotsClé=" & VarChaînePourSQL(MotCherché)
    '
    'Pour ce faire :
    '* Si la chaîne comporte des apostrophes (') mais pas de guillemets ("), la
    '  fonction encadre la chaîne de guillemets (") ;
    '* Si la chaîne comporte des guillemets (") mais pas d'apostrophes ('), la
    '  fonction encadre la chaîne d'apostrophes (') ;
    '* Si la chaîne comporte à la fois des apostrophes et des guillemets, la fonction
    '  la scinde en 2 chaînes qu'elle sépare du caractère de concaténation (&) et
    '  s'appelle de manière récursive pour chacune de ces chaînes.
    '
    'Exemples :
    ' si la fonction reçoit : Le roi d'Afrique
    '         elle retourne : "Le roi d'Afrique"
    ' si la fonction reçoit : '"roi" d'Afrique
    '         elle retourne : "'" & '"roi d" & "'Afrique"
    ' si la fonction reçoit : Le "roi" du monde
    '         elle retourne : 'Le "roi" du monde'
    ' si la fonction reçoit : Le "roi" d'Afrique
    '         elle retourne : 'Le "roi" d' & "'Afrique"
    ' si la fonction reçoit : Le "roi" d'afrique et le "prince" d'angleterre
    '         elle retourne : 'Le "roi" d' & "'Afrique et le" & '"prince" d' & "'angleterre"
    '
    'INFORMATIONS REÇUES :
    '   Chaîne : chaîne à traiter
    '
    'CONDITIONS ET EXCEPTIONS :
    '   La fonction s'appelle de manière RECURSIVE
    '-------------------------------------------------------------------------------
     
    Dim Chaîne1  As String
    Dim Chaîne2  As String
    Dim PosApos  As Long
    Dim PosGuill As Long
    Dim Scission As Long
     
        VarChaînePourSQL = Null  'Présumer une erreur d'argument
     
        If IsEmpty(Chaîne) Or IsNull(Chaîne) Then Exit Function
        'Vérifier que le variant est vraiment un chaîne de caractères
        On Error GoTo Err_VarChaînePourSQL:
        Chaîne = CStr(Chaîne)
     
        VarChaînePourSQL = ""   'Présumer une chaîne vide
        If Chaîne = "" Then Exit Function
     
        PosApos = InStr(1, Chaîne, "'", vbBinaryCompare)
        PosGuill = InStr(1, Chaîne, """", vbBinaryCompare)
     
        If PosApos > 0 And _
           PosGuill > 0 Then
            'Apostrophe et guillements
            'Scinder la chaîne avant le second caratère particulier
            If PosApos > PosGuill Then Scission = PosApos Else Scission = PosGuill
            'Si la scission doit avoir lieu avant le premier caractère de la chaîne
            'l'appel récursif n'aura pas de fin et provoquera un débordement de pile
            'Normalement ce cas ne peut pas se produire, mais on ne sait jamais.
            If Scission = 1 Then GoTo Err_VarChaînePourSQL
            Chaîne1 = Mid(Chaîne, 1, Scission - 1)
            Chaîne2 = Mid(Chaîne, Scission)
            VarChaînePourSQL = VarChaînePourSQL(Chaîne1) & _
                               " & " & _
                               VarChaînePourSQL(Chaîne2)
        ElseIf PosApos > 0 Then
            'Apostrophe uniquement
            VarChaînePourSQL = """" & Chaîne & """"
        Else
            'Guillemets uniquement
           VarChaînePourSQL = "'" & Chaîne & "'"
        End If
    Err_VarChaînePourSQL:
    End Function 'VarChaînePourSQL
    La même pour 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
    '===============================================================================
    Public Function DatePourSQL(ByVal VariableDate As Date) As String
     
    'CREATION :         30 janvier 1999
    'REVISIONS :        17 octobre 1999
    '                   * Date sur 4 chiffres en prévision de l'an 2000
    'DESCRIPTION :
    '   Cette fonction retourne une chaîne de caractères correspondant à la date qui
    'lui est fournie, formatée pour pouvoir être utilisée dans une requête SQL.
    'SQL n'accepte que les dates au format "yy/mm/dd" ("aa/mm/jj") encadrées de "#".
    '
    'INFORMATIONS RECUES:
    '   DateIndiquée : Date à insérer dans une requête
    '-------------------------------------------------------------------------------
     
        'Mettre la date au format AA/MM/JJ (Merci ACCESS !)
        DatePourSQL = "#" & Format(VariableDate, "yyyy/mm/dd") & "#"
     
    End Function 'DatePourSQL

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 415
    Par défaut
    Bonjour et merci de cette contribution.

    Personnellement j'utilise toujours le guillemet comme délimiteur de chaîne et je double les guillemets dans le paramètre.

    Cela donne quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... & """" & replace(MaChaîneParametre, """", """""") & """" & ...
    cela fait beaucoup de " mais cela évite d'avoir à tester si il y a une apostrophe ou un guillemet dans la chaîne.

    Note : il me semble que Replace n'existe pas dans les versions antérieures à 2000.

    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.

Discussions similaires

  1. Récupération de variables de menus déroulants pour requète SQL
    Par Thibaut_Dupont dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/07/2006, 14h24
  2. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 08/06/2006, 23h16
  3. [MySQL] Problème récupération variable pour requête SQL !!
    Par mLk92 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2006, 16h08
  4. Variable invisible pour requête SQL !?
    Par yopuke dans le forum Langage
    Réponses: 26
    Dernier message: 11/05/2006, 16h44
  5. TEdit.Text dans Requête SQL?!?
    Par zarbydigital dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2005, 09h37

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