Toute l'actualité de [self-access.com] en direct sur votre ordinateur !  Vous êtes ici : Accueil » Visual Basic » Initiation à VB » L'art de la concaténation » Concaténation et SQLConnexion
 


Dans cet article... 
  • Concaténation et instruction SQL
  • Etape 1
  • Etape 2
  • Etape 3
  • Etape 4
  • Etape 5
  • Etape 6
  •  Article mis à jour le 16/03/2010

    Concaténation et instruction SQL

    Dans l'article précédent, vous avez vu les bases de la concaténation, en Visual Basic classique.

    Revenons un peu à de l'Access concret : l'un des intérêts de la concaténation est de permettre la construction dynamique d'instructions SQL. Il peut s'agir d'instructions partielles (une clause WHERE pour filtrer un formulaire, par exemple) ou complètes (une instruction SELECT, INSERT, UPDATE, DELETE entre autres).

    Info
    Si vous ne connaissez pas le langage SQL, allez faire un tour dans la section SQL du site !

    Imaginez que nous ayons une requête SQL qui vide une ligne de table, ligne dont le champ clef a la valeur 12 (une clef de 12, pouf pouf). En SQL pur, la ligne s'écrit :

    DELETE * FROM [la table] WHERE [la clef] = 12;

    Maintenant, si on intègre la ligne dans un programme VB, en l'exécutant automatiquement, on obtient :

    1. Sub ExecutionSQL()
    2.   Dim sql As String
    3.  
    4.   ' Initialisation de la variable
    5.   sql = "DELETE * FROM [la table] WHERE [la clef] = 12;"
    6.  
    7.   ' Exécution de l'instruction SQL
    8.   CurrentDb.Execute sql
    9. End Sub

    Soit. Mais généralement, la valeur 12 provient de l'extérieur : une variable ou un champ de formulaire, par exemple. Prenons le cas d'une variable. Voici ce que pourrait devenir le listing... et ça ne marche pas !

    1. Sub ExecutionSQL()
    2.   Dim sql As String
    3.   Dim valeur As Long
    4.  
    5.   ' Initialisation des variables
    6.   valeur = 12
    7.   sql = "DELETE * FROM [la table] WHERE [la clef] = valeur;"
    8.  
    9.   ' Exécution de l'instruction SQL
    10.   CurrentDb.Execute sql
    11. End Sub

    ... ça ne marche pas parce le contenu de la variable n'est pas remplacé dans la chaîne SQL. Vous demandez donc au moteur SQL d'Access de chercher une égalité du type [la clef] = valeur, au lieu de [la clef] = 12. Access va essayer de chercher un champ ou un paramètre de requête qui s'appelle valeur, sans le trouver bien sûr. D'où une erreur à l'exécution.

    Conseil
    Lorsque vous avez des problèmes de ce type sur une chaîne SQL (entre autres), pensez à afficher le résultat à l'écran. Vous pouvez ajouter un MsgBox sql ou un Debug.Print sql en ligne 8, juste après avoir construit la phrase SQL.

    Normalement, vous devez obtenir une instruction SQL correcte. Or ici, on obtiendrait : DELETE * FROM [la table] WHERE [la clef] = valeur;

    Vous souhaitez en fait injecter la valeur 12 dans la chaîne SQL, pour retrouver la chaîne qui servait d'exemple au départ. Et qu'est-ce qui permet de faire ça ? La concaténation, bien sûr !

    Pour que tout fonctionne, aménagez le programme comme ceci :

    1. Sub ExecutionSQL()
    2.   Dim sql As String
    3.   Dim valeur As Long
    4.  
    5.   ' Initialisation des variables
    6.   valeur = 12
    7.   sql = "DELETE * FROM [la table] WHERE [la clef] = " & valeur & ";"
    8.  
    9.   ' Exécution de l'instruction SQL
    10.   CurrentDb.Execute sql
    11. End Sub

    Etape 1

    Si vous avez manqué quelque chose dans le film, voici comment reproduire la concaténation étape par étape. Je suppose toujours que le champ clef est de type Numérique (on verra des exemples sur les autres types de données ultérieurement).

    L'étape 1 consiste à penser SQL avant de penser Visual Basic. Donc, en langage SQL, notre instruction s'écrit comme ceci :

    Normalement, vous pouvez taper cette instruction dans une requête (en mode SQL) et exécuter la requête : elle doit fonctionner... Sinon, si votre code SQL est déjà incorrect, ça va être compliqué en Visual Basic !

    Note
    Le point-virgule final est facultatif, l'instruction SQL fonctionnera sans problème sous Access. Mais comme c'est un caractère de fin dans la plupart des dialectes SQL, autant s'y habituer !

    Etape 2

    Maintenant que vous avez l'instruction SQL, vous pouvez l'intéger en Visual Basic. Ce qui donne :

    Plus précisément :

    1. Vous êtes dans une procédure ou une fonction Visual Basic.
    2. Vous avez déclaré une variable appelée sql, de type String.
    3. Vous alimentez cette variable en lui fournissant l'instruction SQL. Comme on manipule une chaîne de caractères, vous remarquerez que l'instruction SQL pure est maintenant délimitée par des guillemets VB.

    En Visual Basic pur, ça donne quelque chose comme :

    1. Sub ExecutionSQL()
    2.   Dim sql As String
    3.  
    4.   ' Initialisation des variables
    5.   sql = "DELETE * FROM [la table] WHERE [la clef] = 12;"
    6.  
    7.   ' Exécution de l'instruction SQL
    8.   CurrentDb.Execute sql
    9. End Sub

    Etape 3

    Repérez la valeur variable (celle qui doit pouvoir être modifiée de façon dynamique). Ici, il s'agit bien sûr de la valeur 12.

    Comme l'élément variable (la valeur 12) doit à terme être obtenu par concaténation, il faut l'extraire de la chaîne de caractères. Pour cela, imaginez que vous découpez la chaîne autour de cet élément variable.

    Après cette découpe, vous obtenez 3 segments de chaîne :

     

    Etape 4

    Rappelez-vous cette règle de base : les chaînes sont toujours délimitées par des guillemets en Visual Basic. Or ce n'est plus le cas ici, maintenant que la chaîne d'origine a été découpée en 3.

    On va rectifier tout ça en ajoutant des guillemets pour fermer les 2 segments de chaînes invariables. Ne vous occupez pas pour l'instant de la valeur 12, on va la traiter plus loin.

    Voici les segments de chaîne après rectification (les guillemets rouges sont ceux qui ont été ajoutés pour "refermer" les segments incomplets) :

    Etape 5

    On peut maintenant s'occuper de la valeur 12 : celle-ci peut maintenant être remplacée par une variable. Ce qui donne :

    La variable est appelée ici valeur (bon, d'accord, c'est moyen Smiley), et elle doit bien sûr être déclarée en début de programme VB, du même type que la valeur souhaitée. Ici notamment, on manipule un entier ou un entier long (en général, les clefs numériques sont généralement des entiers longs, Long en VB). D'où une déclaration du type : Dim valeur As Long.

    Etape 6

    C'est presque terminé : il ne vous reste plus qu'à concaténer les 3 segments (une chaîne de caractères, une variable et une autre chaîne de caractères. D'où le retour de l'opérateur & (ajouté ci-dessous en vert) :

    Et voici le programme final :

    1. Sub ExecutionSQL()
    2.   Dim sql As String
    3.   Dim valeur As Long
    4.  
    5.   ' Initialisation des variables
    6.   valeur = 12
    7.   sql = "DELETE * FROM [la table] WHERE [la clef] = " & valeur & ";"
    8.  
    9.   ' Exécution de l'instruction SQL
    10.   CurrentDb.Execute sql
    11. End Sub

    Note
    Dans notre exemple, la variable a toujours la valeur fixe 12, ce qui peut bien sûr être amélioré. Pour extraire la valeur d'un champ de formulaire, notamment, remplacez la ligne valeur = 12 par : valeur = Forms![Nom du formulaire]![Nom d'un champ du formulaire]


    Mes livres sur Access...
    [cliquez pour plus d'infos]





    Hit-Parade 
     
    [ Copyright 1997-2018 hervé inisan, self-access.com Reproduction interdite ]