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 valeurs DateConnexion
 


Concaténation VB/SQL et type Date/Heure

Vous avez vu dans les pages précédentes comment créer des instructions SQL en VBA, en y injectant des valeurs numériques et des valeurs de type Texte. Cette fois, on va faire la même chose avec des valeurs de type Date/Heure. Le principe général est le même, mais ça se complique un peu à cause de la gestion des dates.

Etape 1

Vous connaissez le mécanisme : on écrit d'abord la chaîne SQL pure, sans s'occuper de Visual Basic :

Il y a 2 nouveautés cette fois :

  1. Les dates sont délimitées par le signe # dans le dialecte SQL d'Access.
  2. Les dates sont au format anglo-saxon (mm/jj/aaaa). C'est ce point qui va surtout poser problème... si vous n'êtes pas anglo-saxon !

Etape 2

On intègre maintenant l'instruction SQL au langage Visual Basic, en ajoutant les guillemets délimiteurs :

Etape 3

Repérez la valeur variable (ici 12/15/2017) ; comme pour les valeurs Texte, le délimiteur ne fait pas partie de la valeur.

 

On découpe la chaîne de texte autour de la valeur pure :

Ce qui nous donne encore nos 3 segments :

 

Etape 4

On rectifie les segments de chaînes invariables pour qu'ils soient correctement délimités par des guillemets :

Attention
Comme pour les concaténations de valeurs Texte, évitez les espaces entre les combinaisons dièse-guillemet.

Etape 5

On remplace la valeur fixe 12/15/2007 par une variable.

Cette fois, on manipule des dates/heures. La variable doit donc être déclarée par : Dim valeur As Date.

Etape 6

On termine comme d'habitude en concaténant les 3 segments :

D'où le programme final... en théorie :

  1. Sub ExecutionSQL()
  2.   Dim sql As String
  3.   Dim valeur As Date
  4.  
  5.   ' Initialisation des variables
  6.   valeur = #12/15/2017#
  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

Un nouveau problème...

L'exemple ci-dessus pourrait marcher. Mais si on alimente la variable par une donnée externe (par exemple un champ de formulaire), la date risque d'être au format français (jj/mm/aaaa) au lieu du format attendu (mm/jj/aaaa).

Du coup, il faut prévoir une conversion systématique, à l'aide des fonctions Visual Basic de Date/Heure. L'idée étant d'extraire le jour, le mois, l'année, et de  permuter jour/mois... par concaténation encore. Ce qui donnerait :

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

Plus de problème !

Suite à ce qui vient d'être dit, chaque concaténation de date devient laborieuse... et vous allez sans doute en faire beaucoup !

Pour simplifier tout ça, on va automatiser la conversion grâce à une fonction spécifique (voir la fonction DateUS(), dans le Grenier du site). Et tant qu'à faire, autant déplacer la gestion des # dans la même fonction, de façon à simplifier le code SQL. Ce qui donne ce listing final :

  1. Sub ExecutionSQL()
  2.   Dim sql As String
  3.   Dim valeur As Date
  4.  
  5.   ' Initialisation des variables
  6.   valeur = #12/15/2017#
  7.   sql = "DELETE * FROM [la table] WHERE [la clef] = " & DateUS(valeur) & ";"
  8.  
  9.   ' Exécution de l'instruction SQL
  10.   CurrentDb.Execute sql
  11. End Sub
  12.  
  13. ' Conversion d'une date au format #mm/jj/aaaa#
  14. Function DateUS(ByVal dt As Variant)
  15.   If IsNull(dt) Then Exit Function
  16.   DateUS = "#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#"
  17. End Function

Vous remarquerez :

  1. Que les signes # ont été enlevés de la chaîne SQL. Ils sont maintenant inutiles puisque pris en charge par la fonction DateUS().
  2. Que la variable valeur est justement retraitée par un appel de DateUS().

Rappel
Vous pouvez ajouter un MsgBox sql ou un Debug.Print sql, en ligne 8, pour vérifier si l'instruction SQL est correctement formée, avant de l'exécuter.

Note
La fonction DateUS() sera intégrée une seule fois dans votre base de données. Elle peut ensuite être utilisée de n'importe où dans cette base.


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





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