Bonjour,
Cette contribution s’adresse aux visiteurs du forum qui éprouvent des difficultés à coder des instructions sql dans lesquelles interviennent des comparaisons avec des champs de type texte (les double-quotes, simple-quotes …), ou des champs date (les dièses) sans parler des syntaxes genre tel champ comme "*" & UneValeur & "*"
Des exemples courants :
- comment construire la source d’un formulaire en la limitant selon des valeurs exprimées dans un autre formulaire ? ( …RecordSource = "SELECT ….. ")
- construire l’équivalent d’une requête et l’exécuter (DoCmd.RunSQL ("SELECT ...
- construire un RecordSet (set rst = CurrentDb.OpenRecordset("SELECT ...
La proposition :
Un utilitaire sous la forme d’un formulaire.
A son ouverture il propose de choisir une des requêtes de la BDD.
Le programme affiche le résultat de la transformation du sql de cette requête pour le rendre compatible avec le code VBA et copie le contenu dans le presse-papier.
Il suffit alors de coller le presse-papier (<ctrl> + v) à l’endroit choisi.
Restriction
Pas de formulaire dont le nom contient le chaîne de caractères : "formulaire".
Pas d’état dont le nom contient le chaîne de caractères : "état".
En effet, le processus de formatage transforme le mot clé "formulaire" en "form" et "état" en "report".
Pour utiliser
Il faut d’abord importer le formulaire "fChoisirUnModele" dans votre BDD.
Ouvrez simultanément votre BDD et celle ci-jointe.
Pointez le formulaire "fChoisirUnModele", maintenez enfoncé le bouton gauche de la souris et faites glisser vers votre BDD.
C’est prêt !
Exemples d’utilisation
Aménager le sql de la source d’un formulaire
A l’origine, la source du formulaire "Recettes" est la table "tRecettes"
On voudrait ouvrir ce formulaire en limitant les enregistrements à ceux qui satisfont aux critères exprimés dans le formulaire "fRechercher"
Avec l’assistant Access, on crée la requête qui permet de sélectionner les enregistrements concernés :
On sauve cette requête (ici : "sqfRecettesSource")
On ouvre maintenant le formulaire "fChoisirUnModele" et dans la liste, on choisit comme modèle "sqfRecettesSource"
Le sql formaté apparaît dans la fenêtre et est automatiquement copié dans votre presse-papier.
Reste à composer le code associé au bouton de notre formulaire en construction.
à ce stade, le curseur placé à droite du "=", enfoncez <ctrl> + V pour coller le contenu du presse-papier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub OuvrirAvecSelection_Click() DoCmd.OpenForm "fRecettes" Forms!fRecettes.RecordSource =| End Sub
Ce qui nous donne :
Remplacer un requête par l’exécution d’une Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub OuvrirAvecSelection_Click() DoCmd.OpenForm "fRecettes" Forms!fRecettes.RecordSource = "SELECT DISTINCT tRecettes.* FROM (tRecettes INNER JOIN tDerivee ON [tRecettes].[NomGenerique]=[tDerivee].[NomGenerique]) INNER JOIN tIngredients ON [tRecettes].[NomGenerique]=[tIngredients].[NomGenerique] WHERE ((([tRecettes].[NomGenerique]) Like ""*"" & [Forms]![fRechercher]![zdlFiltreGenerique] & ""*"") And (([tDerivee].[Derivee]) Like ""*"" & [Forms]![fRechercher]![zdlFiltreDerivee] & ""*"") And (([tIngredients].[Ingredient]) Like ""*"" & [Forms]![fRechercher]![zdlFiltreIngredient] & ""*"") And (([tDerivee].[Statut]) Like ""*"" & [Forms]![fRechercher]![zdlFiltreStatut] & ""*"") And (([tRecettes].[Categorie]) Like ""*"" & [Forms]![fRechercher]![zdlFiltreCategorie] & ""*"")); " End Sub
Soit la requête "qExemple2ExecuterUneRequete" :
Pour l’exécuter, il faut la double-cliquer dans la fenêtre de base de données.
On voudrait la remplacer par du code dans une Sub.
On ouvre le formulaire "fChoisirUnModele" et dans la liste, on choisit comme modèle " qExemple2ExecuterUneRequete"
Dans un module, on crée le code
Entre les deux parenthèses de DoCmd.RunSQL (), on colle le contenu du presse-papier et il vient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public Sub Exemple2() 'Remplacer la requête par du code DoCmd.RunSQL (|) End Sub
Un mot au sujet de la programmation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public Sub Exemple2() 'Remplacer la requête par du code DoCmd.RunSQL ("SELECT VINS.* INTO VinsEnStock FROM VINS WHERE (((VINS.STOCK)<>0) AND ((VINS.MILLESIME)=[Quel millésime ?])); ") End Sub
A l’ouverture du formulaire, on aménage la liste de valeurs avec les noms des requêtes de la BDD :
La mise à jour de la zone de liste déclenche le processus de formatage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub Form_Open(Cancel As Integer) Dim qdf As DAO.QueryDef Me.zdlModele = "" For Each qdf In CurrentDb.QueryDefs If Left(qdf.Name, 1) <> "~" Then ' ne pas considérer les queries des zones de liste Me.zdlModele.RowSource = Me.zdlModele.RowSource & qdf.Name & ";" End If Next ' dérouler la liste DoCmd.GoToControl "zdlModele" Me.zdlModele.Dropdown End Sub
- capter le code de la requête choisie comme modèle
- mettre sur une ligne
- "défranciser" la syntaxe
- doubler les double-quotes
- encadrer le tout de double-quotes
- copier dans le presse-papier
En espérant que ce petit outil sera utile au plus grand nombre....en attente d'amélioration éventuelle ...
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 Private Sub zdlModele_AfterUpdate() Dim qry As QueryDef Set qry = CurrentDb.QueryDefs(Me.zdlModele) 'Capter le SQL Me.zdtSqlReformate = qry.sql 'mettre sur une ligne Me.zdtSqlReformate = Replace(Me.zdtSqlReformate, Chr(13) & Chr(10), " ") ' "défranciser" Me.zdtSqlReformate = Replace(Me.zdtSqlReformate, "formulaire", "form") Me.zdtSqlReformate = Replace(Me.zdtSqlReformate, "état", "Report") 'doubler les double-quotes Me.zdtSqlReformate = Replace(Me.zdtSqlReformate, """", """""") 'Encadrer le tout de double-quotes Me.zdtSqlReformate = """" & Me.zdtSqlReformate & """" 'Copier dans le presse-papier DoCmd.GoToControl "zdtSqlReformate" DoCmd.RunCommand acCmdCopy End Sub
Remarques et suggestions, bienvenues.
Cordialement.
Partager