<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - jimbolion</title>
		<link>https://www.developpez.net/forums/blogs/584669-jimbolion/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Thu, 30 Apr 2026 02:34:36 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - jimbolion</title>
			<link>https://www.developpez.net/forums/blogs/584669-jimbolion/</link>
		</image>
		<item>
			<title><![CDATA[Résolution des problèmes fréquemment rencontrés dans l'écriture des requêtes écrites en vba]]></title>
			<link>https://www.developpez.net/forums/blogs/584669-jimbolion/b1091/resolution-problemes-frequemment-rencontres-l-ecriture-requetes-ecrites-vba/</link>
			<pubDate>Sun, 07 Feb 2016 05:55:13 GMT</pubDate>
			<description><![CDATA[J'ai souvent vu passer de...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">J'ai souvent vu passer de nombreux fils de discussion suite aux problèmes rencontrés lors de l’écriture de requêtes SQL en VBA. Je ne vais pas dans ce blog décrire l'exhaustivité de ces cas souvent liés à la conception même de la requête mais repréciser les bonnes pratiques et les erreurs à ne pas commettre.<br />
<br />
Avant tout un petit rappel sur la syntaxe du VBA et les bonnes pratiques :<br />
<br />
Le langage Visual basic s'écrit sous la forme d'un texte à raison d'une déclaration ou une instruction par ligne. Un renvoi à la ligne est toutefois réalisable à l'aide de la notation _ ; il est possible de placer plusieurs instructions sur une seule ligne à l'aide de la notation :, ainsi que d'intercaler des lignes vides ou de placer un commentaire en fin de ligne ou entre les lignes. Il est sage d'encadrer les symboles (&amp;, :, etc.) par au-moins un espace. Les noms, définis par Visual basic (mot-clefs, constantes, etc.) ou créés par le programmeur, peuvent s'écrire indifféremment en lettres minuscules ou majuscules (pas de différenciation). <b><u>Toutefois il est recommandé d'utiliser des normes dans l'utilisation des noms ou des champs. </u></b><br />
<br />
Un type définit la nature d'une variable ou d'un paramètre, qui peut être un type élémentaire : Boolean, Integer, Long, Byte, Single, Double, String, Currency, date, Object, Variant, Enum ou un type composé à l'aide du mot-clef Type, ou une classe.<br />
<br />
liste de déclarations : Les types de variables et constantes utilisées doivent être déclarées dans l'en tête de la fonction ou de la procédure grâce aux mots clés  Dim, Private, Public et const.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">Exemples :
Dim Rsql As string, Madate As Date, manote as Single
Sub maFonction(MonNom As String, Madate As Date)</pre></td></tr></table></pre>
</div>Me : Objet défini dans une procédure privée, associée généralement à un événement ou un élément d'une boîte de dialogue (contrôle), désignant l'objet à laquelle s'applique la procédure.<br />
<br />
Nous allons donc à l'aide d'un exemple précis, soulever quelques difficultés et tenter de les résoudre par des techniques qui jusque là ne m'ont posées aucun souci.<br />
<br />
Création de notre entité de base nommée T_Eleves et des champs décrivant son contenu :<br />
<br />
id 		NuméroAuto<br />
nomEleve	Texte court<br />
prenom	Texte court<br />
dateNais	Date/Heure<br />
moyenne	Numérique (Réel Simple)<br />
Redoublant	Oui/Non (Booleen)<br />
<br />
La construction d'une requête repose sur quelques règles de base et principalement pour commencer celles-ci :<br />
<br />
<ol class="decimal"><li style="">Toutes les valeurs de type texte doivent être encadrés par des quotes (simples ou doubles),</li><li style="">Toutes les valeurs de type date doivent être encadrés par des #.</li></ol><br />
<br />
Nous allons donc commencer par créer notre formulaire dont la source est basée sur notre entivé T_Eleves afin de renseigner les différentes valeurs. De nombreux tutoriels existent pour vous aider à réaliser ces formulaires. Le notre plutôt simpliste n'est là que pour parler de notre sujet principal.<br />
<br />
Une image de ce formulaire nous donnerait l'effet visuel suivant :<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p200165d1454823124/c-cpp/outils-c-cpp/choisir-environnement-developpement/webcam-lire-port-usb-c-cpp-java-sous-win/formulaire.jpg/" border="0" alt="Nom : Formulaire.JPG
Affichages : 497
Taille : 17,9 Ko"  style="float: CONFIG" /><br />
<br />
Et le code généré sur l’événement sur clic  du bouton &lt;Enregistrer&gt; :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td valign="top"><pre style="margin: 0">Private Sub B_Save_Click()
On Error GoTo Err_Commande
Dim R_Sql As String
      '
      If Not IsDate(Me.T_DateN) Then
        MsgBox &quot;La date de Naissance est obligatoire&quot;, vbCritical, &quot;Erreur Saisie&quot;
        Me.T_DateN.SetFocus
        Exit Sub
      End If
      
      '
      R_Sql = &quot;INSERT INTO [T_Eleves] &quot; &amp; _
        &quot;(nomEleve, prenom, dateNais, moyenne, Redoublant) &quot; &amp; _
        &quot; VALUES (&quot; &amp; _
        Nz(Me.T_nom, &quot;&quot;) &amp; &quot;', &quot; &amp; _
        Nz(Me.T_prenom, &quot;&quot;) &amp; &quot;', &quot; &amp; _
        &quot;#&quot; &amp; Nz(Me.T_DateN, Null) &amp; &quot;#,&quot; &amp; _
        Nz(Me.T_Moyenne, 0) &amp; &quot;, &quot; &amp; _
        Nz(Me.T_Redoublant, &quot;&quot;)  &amp; _
        &quot;)&quot;
'
CurrentDb.Execute R_Sql, dbFailOnError
'
Exit Sub
Err_Commande:
    MsgBox Err.Description
End Sub</pre></td></tr></table></pre>
</div>En appliquant les règles citées précédemment, nous devrions donc pouvoir injecter ces données dans notre table T_Eleves. En cliquant sur le bouton &lt;Enregistrer&gt; nous opérons donc sur l’exécution du code. Malheureusement, nous levons une erreur de ce type :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Le nombre de valeurs de la requête doit coïncider avec le nombre de champs destination apparaît à l'écran
			
		</div>
	</div>
</div>La technique de débogage largement expliquée par Caféine dans son fameux tutoriel que voici :<br />
<a href="http://cafeine.developpez.com/access/tutoriel/debugprint/" target="_blank">Les techniques de débogage</a><br />
nous permet donc d'afficher le résultat de notre chaîne dans la fenêtre d'exécution de l'éditeur VBA<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[T_Eleves]</span> <span class="br0">&#40;</span>nomEleve, prenom, dateNais, moyenne, Redoublant<span class="br0">&#41;</span>  <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'DUPONT'</span>, <span style="color: #FF0000;">'Martin'</span>,<span style="color: #cc66cc;">#04/02/1986#</span>,<span style="color: #cc66cc;">10</span>,<span style="color: #cc66cc;">5</span>, -<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span></pre>
</div><br />
En regardant de plus près cette requête, nous constatons que 5 champs sont déclarés mais que 6 valeurs sont identifiées. Notre 10,5 n'a pas été traduit par le code en 10.5 (SQL n'acceptant que des points pour les valeurs numériques). Cette erreur ne sera soulevée que pour les utilisateurs ayant conservés la virgule dans les séparateurs numériques du panneau de configuration. <b><font color="#FF0000">Si votre projet devait être déployé sur d'autres ordinateurs, il vaut mieux intégrer directement ce contrôle dans votre code.</font></b><br />
<br />
Afin de résoudre ce problème nous allons donc créer une fonction standard dans un module spécifique. Cette fonction de type publique pourra donc être appelée dans toutes les requêtes construites par VBA dans l'ensemble du projet.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">Function VirgToPoint(sValeur As String) As String
' Conversion implicite de format Réel en Chaîne
    VirgToPoint = Replace(sValeur, &quot;,&quot;, &quot;.&quot;)
End Function</pre></td></tr></table></pre>
</div>et la modification de la ligne dans la procédure de notre formulaire :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">&quot;&quot; &amp; VirgToPoint(Nz(Me.T_Moyenne, 0)) &amp; &quot;, &quot; &amp; _</pre>
</div>Après ré exécution du code une fois le correctif apporté notre requête devient :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[T_Eleves]</span> <span class="br0">&#40;</span>nomEleve, prenom, dateNais, moyenne, Redoublant<span class="br0">&#41;</span>  <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'DUPONT'</span>, <span style="color: #FF0000;">'Martin'</span>,<span style="color: #cc66cc;">#04/02/1986#</span>,<span style="color: #cc66cc;">10.5</span>, -<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span></pre>
</div><br />
Aucun message d'erreur soulevé par l'éditeur, je vais de nature méfiante vérifier l'entrée dans la table. A mon grand désarroi, je constate que la date du 4 février 1986 est devenue le 2 Avril 1986. Une autre règle est donc de formater notre date en format américain ainsi cette portion de code à insérer dans le module dédié :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">Public Function Convert_DateUS_Short(laDate As Date) As String
  ' Formate la date passée en argument en date US.
    Convert_DateUS_Short = Chr(35) &amp; Format(laDate, &quot;mm-dd-yyyy&quot;) &amp; Chr(35)  ' Date au format us
End Function</pre></td></tr></table></pre>
</div>et la modification de la ligne dans la procédure de notre formulaire :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">&amp; Convert_DateUS_Short(Nz(Me.T_DateN, Date)) &amp; &quot;,&quot; &amp; _</pre>
</div>Une dernière vérification dans notre table pour vérifier que l'entrée est conforme et nous continuons notre saisie jusqu'à rencontrer un nouveau problème :<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p200166d1454824162/c-cpp/outils-c-cpp/choisir-environnement-developpement/webcam-lire-port-usb-c-cpp-java-sous-win/formulaire2.jpg/" border="0" alt="Nom : Formulaire2.JPG
Affichages : 494
Taille : 19,4 Ko"  style="float: CONFIG" /><br />
<br />
Lors de l'enregistrement, un message de ce type apparaît à l'écran :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Erreur de syntaxe (opérateur absent) dans l'expression &quot;'D'ARCHAMBAULT', 'Martin',#09-09-1987#,14, -1)&quot;
			
		</div>
	</div>
</div>la quote étant reconnue par SQL comme délimiteur de chaîne de caractères, le nom d'archambault devra donc être protégé par un double simple quote. Nous écrirons donc une fonction de ce type :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Function Protected_Quote(ChaineProtect As String) As String
  ' Fonction de protection visant à protéger les simple quotes et doublequotes dans les requetes SQL
  Protected_Quote = Replace(ChaineProtect, &quot;'&quot;, &quot;''&quot;)
  Protected_Quote = Replace(Protected_Quote, Chr(34), Chr(34) &amp; Chr(34))
End Function</pre></td></tr></table></pre>
</div>et modifierons notre appel dans la construction de notre fameuse requête :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">&quot;'&quot; &amp; Protected_Quote(Nz(Me.T_nom, &quot;&quot;)) &amp; &quot;', &quot; &amp; _</pre>
</div>En mode débogage voilà ce que nous donnerait la syntaxe de notre requête :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[T_Eleves]</span> <span class="br0">&#40;</span>nomEleve, prenom, dateNais, moyenne, Redoublant<span class="br0">&#41;</span>  <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'D'</span><span style="color: #FF0000;">'ARCHAMBAULT'</span>, <span style="color: #FF0000;">'Martin'</span>,<span style="color: #cc66cc;">#09-09-1987#</span>,<span style="color: #cc66cc;">14</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span></pre>
</div><br />
Une dernière vérification dans notre table afin de vérifier la saisie de nos deux élèves :<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p200167d1454824383/c-cpp/outils-c-cpp/choisir-environnement-developpement/webcam-lire-port-usb-c-cpp-java-sous-win/formulaire3.jpg/" border="0" alt="Nom : Formulaire3.JPG
Affichages : 497
Taille : 26,6 Ko"  style="float: CONFIG" /><br />
<br />
Après lecture de ce billet, vous pourrez sereinement construire vos requêtes en VBA en toute quiétude. Les techniques décrites ci-dessus s'appliquent également aux requêtes de type Update (mise à jour).<br />
<br />
le code complet du bouton clic après transformations et appels aux fonctions<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td valign="top"><pre style="margin: 0">Private Sub B_Save_Click()
On Error GoTo Err_Commande
Dim R_Sql As String
      '
      If Not IsDate(Me.T_DateN) Then
        MsgBox &quot;La date de Naissance est obligatoire&quot;, vbCritical, &quot;Erreur Saisie&quot;
        Me.T_DateN.SetFocus
        Exit Sub
      End If
      
      '
      R_Sql = &quot;INSERT INTO [T_Eleves] &quot; &amp; _
        &quot;(nomEleve, prenom, dateNais, moyenne, Redoublant) &quot; &amp; _
        &quot; VALUES (&quot; &amp; _
        Protected_Quote(Nz(Me.T_nom, &quot;&quot;)) &amp; &quot;', &quot; &amp; _
        Protected_Quote(Nz(Me.T_prenom, &quot;&quot;)) &amp; &quot;', &quot; &amp; _
        &amp; Convert_DateUS_Short(Nz(Me.T_DateN, Date)) &amp; &quot;, &quot; &amp; _
        VirgToPoint(Nz(Me.T_Moyenne, 0)) &amp; &quot;, &quot; &amp; _
        Nz(Me.T_Redoublant, &quot;&quot;)  &amp; _
        &quot;)&quot;
'
CurrentDb.Execute R_Sql, dbFailOnError
'
Exit Sub
Err_Commande:
    MsgBox Err.Description
End Sub</pre></td></tr></table></pre>
</div>Bonne lecture à tous<br />
<br />
JimboLion</blockquote>

]]></content:encoded>
			<dc:creator>jimbolion</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/584669-jimbolion/b1091/resolution-problemes-frequemment-rencontres-l-ecriture-requetes-ecrites-vba/</guid>
		</item>
		<item>
			<title>Gérer autrement les variables publiques</title>
			<link>https://www.developpez.net/forums/blogs/584669-jimbolion/b1019/gerer-autrement-variables-publiques/</link>
			<pubDate>Sat, 09 Jan 2016 16:11:07 GMT</pubDate>
			<description>Je vais traiter dans cette...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je vais traiter dans cette partie ma façon de gérer une table Paramètres afin de conserver les valeurs au gré du déroulement d'un applicatif.<br />
Vous aurez compris, l'intérêt d'une table Paramètres permet de conserver les valeurs acquises même lorsqu'une erreur est levée par l'applicatif (en effet le contenu des variables globales est alors effacé). Un autre intérêt est de pouvoir visualiser rapidement le contenu de ces dites variables, rien de plus frustrant que de chercher dans le code la valeur d'une variable et l'endroit ou son contenu a été modifié.<br />
<br />
Nous allons dans ce post en mode pas à pas apprendre à construire nos premiers outils d'aide au développement.<br />
<br />
<b><u>1. Construction de la table :</u></b><br />
<br />
Cette entité est composé de deux champs nommés description et valeur. Description défini donc le type de variable alors que valeur décrit son contenu.<br />
<br />
<img src="https://www.developpez.net/forums/attachments/p197565d1452355839/environnements-developpement/delphi/edi/kylix-ip-d-serveur/capture.jpg/" border="0" alt="Nom : Capture.JPG
Affichages : 151
Taille : 59,9 Ko"  style="float: CONFIG" /><br />
<br />
<b><u>2. La partie VBA :</u></b><br />
<br />
Afin d'utiliser cette table et la nourrir de nos précieuses informations il va nous falloir créer quelques fonctions :<br />
<br />
<ol class="decimal"><li style="">L'insertion des valeurs</li><li style="">La récupération des valeurs</li><li style="">La suppression des valeurs </li></ol><br />
<br />
<u>a) L'insertion des valeurs : </u><br />
<br />
Cette fonction nous permet d'insérer des valeurs dans notre table, ainsi l'insertion d'un ID, d'une clé ou toute autre information nécessitant un archivage pour une utilisation ultérieure. Cette fonction doit également contrôler l'existence d'une clé déjà présente, dans ce cas le type de requête exécutée sera Update et non Insert. Afin de contrôler l'existence d'une clé nous utiliserons la fonction Dcount ici détaillée : <a href="https://support.office.com/fr-fr/article/DCount-fonction-f6b5d78b-ad0b-4e42-be7a-11a64acbf3d3" target="_blank">https://support.office.com/fr-fr/art...a-11a64acbf3d3</a><br />
<br />
Le code permet d'utiliser cette fonction :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">Function</span> InsertUpdate_Parametre<span class="br0">&#40;</span>p_Description <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>, p_Valeur <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span><span class="br0">&#41;</span> <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Boolean</span>
<span style="color: #808080;">'</span>
<span style="color: #808080;">' Fonction permettant de Mettre &agrave; jour un Parametre dans la table T_Parametres</span>
<span style="color: #808080;">' la fonction d&eacute;tecte la pr&eacute;sence de la cl&eacute; dans ce cas update sinon Insert</span>
<span style="color: #808080;">' Retourne True si la fonction s'est correctement d&eacute;roul&eacute;e</span>
&nbsp;
<span style="color: #0000ff;">On</span> <span style="color: #0000ff;">Error</span> <span style="color: #0000ff;">GoTo</span> err_InsertUpdate_Parametre
<span style="color: #808080;">'</span>
<span style="color: #808080;">' Inserer une nouvelle valeur dans les parametres</span>
<span style="color: #808080;">'</span>
<span style="color: #0000ff;">Dim</span> R_Sql <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>
<span style="color: #0000ff;">If</span> DCount<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Valeur&quot;</span>, <span style="color: #FF0000;">&quot;T_Parametres&quot;</span>, <span style="color: #FF0000;">&quot;Description='&quot;</span> &amp; p_Description &amp; <span style="color: #FF0000;">&quot;'&quot;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">Then</span>
    R_Sql = <span style="color: #FF0000;">&quot;INSERT INTO [T_Parametres] &quot;</span> &amp; _
        <span style="color: #FF0000;">&quot;(Description, Valeur) &quot;</span> &amp; _
        <span style="color: #FF0000;">&quot; VALUES (&quot;</span> &amp; _
        <span style="color: #FF0000;">&quot;'&quot;</span> &amp; Nz<span class="br0">&#40;</span>p_Description, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> &amp; <span style="color: #FF0000;">&quot;', &quot;</span> &amp; _
        <span style="color: #FF0000;">&quot;'&quot;</span> &amp; Protected_Quote<span class="br0">&#40;</span>Nz<span class="br0">&#40;</span>p_Valeur, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp; <span style="color: #FF0000;">&quot;'&quot;</span> &amp; _
        <span style="color: #FF0000;">&quot;)&quot;</span>
<span style="color: #0000ff;">Else</span>
    <span style="color: #808080;">'</span>
    <span style="color: #808080;">' Modifier le contenu de la variable</span>
    <span style="color: #808080;">'</span>
    R_Sql = <span style="color: #FF0000;">&quot;UPDATE T_Parametres SET T_Parametres.Valeur = '&quot;</span> &amp; Protected_Quote<span class="br0">&#40;</span>Nz<span class="br0">&#40;</span>p_Valeur, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp; <span style="color: #FF0000;">&quot;' WHERE (((T_Parametres.Description)='&quot;</span> &amp; Nz<span class="br0">&#40;</span>p_Description, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> &amp; <span style="color: #FF0000;">&quot;'));&quot;</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">If</span>
<span style="color: #808080;">'</span>
CurrentDb.Execute R_Sql, dbFailOnError
InsertUpdate_Parametre = <span style="color: #0000ff;">True</span>
<span style="color: #0000ff;">Exit</span> <span style="color: #0000ff;">Function</span>
err_InsertUpdate_Parametre:
    MsgBox Err.Description &amp; Err.Number
    <span style="color: #0000ff;">Exit</span> <span style="color: #0000ff;">Function</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Function</span></pre></td></tr></table></pre>
</div><br />
Cette fonction exige deux arguments à savoir la clé de description et sa valeur ainsi l'utilisation de cette fonction pourrait s'opérer de la manière suivante :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">InsertUpdate_Parametre <span style="color: #FF0000;">&quot;TVA_Normale&quot;</span>,<span style="color: #cc66cc;">20.6</span></pre>
</div><br />
et l'alimentation dans la table T_Parametres nous fournirait ceci : <br />
<br />
<img src="https://www.developpez.net/forums/attachments/p197566d1452355839/environnements-developpement/delphi/edi/kylix-ip-d-serveur/capture2.jpg/" border="0" alt="Nom : Capture2.JPG
Affichages : 158
Taille : 19,9 Ko"  style="float: CONFIG" /><br />
<br />
Il est à noter que la fonction retourne True si l'opération s'est correctement déroulée, l'utilisation du retour permettant d'anticiper certaines actions ou avertir l'utilisateur. La fonction Protected_Quote utilisée gère la présence de quotes dans la chaîne de caractère entraînant les erreurs d'interprétation de la requête.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">Function</span> Protected_Quote<span class="br0">&#40;</span>ChaineProtect <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span><span class="br0">&#41;</span> <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>
<span style="color: #808080;">'</span>
<span style="color: #808080;">' Fonction de protection visant &agrave; prot&eacute;ger les simple quotes et doublequotes dans les requetes SQL</span>
<span style="color: #808080;">'</span>
Protected_Quote = Replace<span class="br0">&#40;</span>ChaineProtect, <span style="color: #FF0000;">&quot;'&quot;</span>, <span style="color: #FF0000;">&quot;''&quot;</span><span class="br0">&#41;</span>
Protected_Quote = Replace<span class="br0">&#40;</span>Protected_Quote, Chr<span class="br0">&#40;</span><span style="color: #cc66cc;">34</span><span class="br0">&#41;</span>, Chr<span class="br0">&#40;</span><span style="color: #cc66cc;">34</span><span class="br0">&#41;</span> &amp; Chr<span class="br0">&#40;</span><span style="color: #cc66cc;">34</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Function</span></pre></td></tr></table></pre>
</div><br />
<u>b) Récupérer une valeur : </u><br />
<br />
Lorsque les clés ont été enregistrées dans la base, une fonction permet de récupérer sa valeur ainsi le code suivant répond à cette problématique :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">Function</span> Get_Parametre<span class="br0">&#40;</span>p_Description <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span><span class="br0">&#41;</span> <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>
    <span style="color: #808080;">'</span>
    <span style="color: #808080;">' Fonction permettant de retourner un Parametre depuis la table T_Parametres</span>
    <span style="color: #808080;">' Retourne une chaine vide si aucune occurence d&eacute;tect&eacute;e</span>
    <span style="color: #808080;">'</span>
    Get_Parametre = Nz<span class="br0">&#40;</span>DLookup<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Valeur&quot;</span>, <span style="color: #FF0000;">&quot;T_Parametres&quot;</span>, <span style="color: #FF0000;">&quot;Description='&quot;</span> &amp; p_Description &amp; <span style="color: #FF0000;">&quot;'&quot;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Function</span></pre></td></tr></table></pre>
</div><br />
Nous avons ici utilisé une fonction de domaine et principalement Dlookup. Je vous conseille la lecture de ce tutoriel afin de vous familiariser avec ces fonctions :<br />
<br />
<a href="http://starec.developpez.com/tuto/fonctionsdomaines/" target="_blank">Les fonctions de domaines dans Access</a><br />
<br />
A noter que si aucun valeur n'est trouvée dans la table, la fonction renvoie une chaîne vide.<br />
<br />
un exemple d'utilisation :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">msgbox <span style="color: #FF0000;">&quot;Le taux de TVA est : &quot;</span> &amp; Get_Parametre<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;TVA_Normale&quot;</span><span class="br0">&#41;</span></pre>
</div><br />
<u>c) La suppression d'une valeur : </u><br />
<br />
Il peut être utile de supprimer une clé dans la table, voire éventuellement la totalité des entrées. L'implémentation de ce code répond donc à cette situation :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">Function</span> Del_Parametre<span class="br0">&#40;</span><span style="color: #0000ff;">Optional</span> p_Description <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span><span class="br0">&#41;</span> <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Boolean</span>
    <span style="color: #808080;">'</span>
    <span style="color: #808080;">' Fonction permettant de supprimer un Parametre dans la table T_Parametres</span>
    <span style="color: #808080;">' Retourne True si la fonction s'est correctement d&eacute;roul&eacute;e</span>
    <span style="color: #808080;">'</span>
    <span style="color: #0000ff;">Dim</span> R_Sql <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>
    <span style="color: #0000ff;">On</span> <span style="color: #0000ff;">Error</span> <span style="color: #0000ff;">GoTo</span> err_Del_Parametre
    <span style="color: #0000ff;">Select</span> <span style="color: #0000ff;">Case</span> Nz<span class="br0">&#40;</span>p_Description, <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">Case</span> <span style="color: #FF0000;">&quot;&quot;</span>
&nbsp;
        R_Sql = <span style="color: #FF0000;">&quot;DELETE T_Parametres.Description FROM T_Parametres;&quot;</span>
    <span style="color: #0000ff;">Case</span> <span style="color: #0000ff;">Else</span>
        R_Sql = <span style="color: #FF0000;">&quot;DELETE T_Parametres.Description FROM T_Parametres WHERE (((T_Parametres.Description)='&quot;</span> &amp; p_Description &amp; <span style="color: #FF0000;">&quot;'));&quot;</span>
    <span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Select</span>
    CurrentDb.Execute R_Sql, dbFailOnError
    Del_Parametre = <span style="color: #0000ff;">True</span>
    <span style="color: #0000ff;">Exit</span> <span style="color: #0000ff;">Function</span>
err_Del_Parametre:
    MsgBox Err.Description &amp; Err.Number
    <span style="color: #0000ff;">Exit</span> <span style="color: #0000ff;">Function</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Function</span></pre></td></tr></table></pre>
</div><br />
Il est à noter que le retour de la fonction renvoie True si elle s'est correctement déroulée. Nous remarquerons que l'argument Optional n'implique pas nécessairement la présence d'une valeur dans l'appel de la fonction. Si aucun argument n'est renseigné, cela nous permettra de vider le contenu complet de la table. Quelques exemples d'appel ci-dessous :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code vba :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Del_Parametre <span style="color: #FF0000;">&quot;TVA_Normale&quot;</span> <span style="color: #808080;">' efface l'entr&eacute;e Taux de tva</span>
Del_Parametre               <span style="color: #808080;">' Efface toutes les entr&eacute;es de la table</span></pre></td></tr></table></pre>
</div><br />
<br />
<br />
JimBolion</blockquote>

]]></content:encoded>
			<dc:creator>jimbolion</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/584669-jimbolion/b1019/gerer-autrement-variables-publiques/</guid>
		</item>
	</channel>
</rss>
