FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Requêtes- Comment voir le code SQL généré par le QBE ?
- Comment compter le nombre d'enregistrements d'une table ou d'une requête ?
- Comment exporter des requêtes sur plusieurs onglets Excel ?
- Comment créer une requête depuis VBA ?
- Comment utiliser en VBA une requête existante ?
- Comment tester l'existence d'une requête ?
- Comment faire appel aux données d'une table d'une autre base de données en SQL ?
- Comment utiliser Access pour exécuter des requêtes sur d'autres types de base de données ?
- Pourquoi chaque requête Access rajoute-t-elle ", *" dans le Select ? Comment l'en empêcher ?
- Comment ignorer les accents dans une requête SQL ?
- Quelles sont les limites des champs de type Mémo dans une requête ?
- Comment récupérer le nombre d'enregistrements concernés après le lancement d'une requête ?
6.1. Manipulation des requêtes
(5)
6.2. Expressions et critères
(15)
6.3. Suppressions, modifications et insertions
(8)
6.4. Conception
(16)
6.5. Requêtes Trucs et Astuces
(10)
Pour basculer du mode assistant (QBE) au mode SQL, cliquez sur le menu Affichage, puis Mode SQL.
Utilisez la fonction Dcount de MS Access
nb = DCount("*","NomRequete")ou la propriété recordcount de l'objet Recordset en VBA.
rst.RecordcountPour utiliser cette propriété il faut toujours que le Recordset soit rempli et avant de lire la propriété il est souvent nécessaire de faire un
rst.MoveLast
Sauf s'il s'agit d'un Recordset de type dbOpenTable.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
DoCmd.TransferSpreadsheet crée un onglet pour chaque requête exportée. cf. aide Access.
Ce code vous permet de créer une requête qui s'ajoutera aux requêtes Access déjà présentes.
CurrentDb.CreateQueryDef("MaReqCreee", "Select * FROM Table1")Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim qdf As DAO.QueryDef
Dim rcs As DAO.Recordset
' Référence à la requête
Set qdf = CurrentDb.QueryDefs("NomQuery")
' Code qui utilise qdf
' Par exemple
qdf.Parameters("NomParamètre") = valeur '<== si requête paramétrée
qdf.Execute '<== si requête action
Set rcs = qdf.OpenRecordset '<== pour travailler sur les données
' Libération de la référence
Set qdf = NothingLien : Comment créer un jeu de données (Recordset) ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Voici une fonction permettant de vous dire si une requête existe en renvoyant True :
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Function testQuery(strName As String) As Boolean
' Pour fonctionner ce code nécessite la référence
' - Microsoft DAO X Object Library
On Error GoTo err
Dim oDb As DAO.Database
Dim oQdf As DAO.QueryDef
' Accède à la base de données courante
Set oDb = CurrentDb
Set oQdf = oDb.QueryDefs(strName)
' Retourne Vrai
testQuery = True
fin:
' Libère les objets
Set oDb = Nothing
Set oQdf = Nothing
Exit Function
err:
' Remonte toutes les erreurs différentes de l'erreur 3265
' (la requête n'existe pas)
If err.Number <> 3265 Then
err.Raise err.Number, err.Source, err.Description
End If
Resume fin
End Function
Exemple d'utilisation :
MsgBox testQuery("RqtClasses")
Une autre façon de tester une requête sans DAO ni ADO :
Sub test()
Const QUERYTYPE = 5
' Teste l'existence de la requête RqtClasses
If DLookup("Type", "MSysObjects", BuildCriteria("Type", dbInteger, QUERYTYPE) & _
" AND " & BuildCriteria("Name", dbText, "RqtClasses0")) = 5 Then
MsgBox "La requête existe"
Else
MsgBox "La requête n'existe pas"
End If
End SubLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Select * From TABLE1 In 'C:\MesDocuments\mabase.mdb\' ;
Voici comment exécuter par exemple des requêtes sur une base de données Oracle
Depuis Access créez une nouvelle requête.
En mode création de la requête, faites le menu : Requête > Spécifique SQL > SQL Direct
Les requêtes SQLDirect permettent d'établir une connexion à un serveur distant, d'écrire une requête pour le serveur PL-SQL donc et de la faire s'exécuter par le serveur.
En cas d'erreur de syntaxe, essayez d'enlever le ";" en fin de requête.
Dans l'onglet Tables/requêtes des options d'Access, décochez [Tous les champs].
Il faut créer une fonction personnalisée qui remplace la lettre accentuée par la même mais sans l'accent.
Dans un module :
Public Function sansAccent(ByVal Chaine As String, EnMajuscule As Boolean) As String
Chaine = LCase(Chaine)
Chaine = Replace(Chaine, Chr(232), "e")
Chaine = Replace(Chaine, Chr(233), "e")
Chaine = Replace(Chaine, Chr(234), "e")
Chaine = Replace(Chaine, Chr(235), "e")
Chaine = Replace(Chaine, Chr(249), "u")
Chaine = Replace(Chaine, Chr(250), "u")
Chaine = Replace(Chaine, Chr(251), "u")
Chaine = Replace(Chaine, Chr(242), "o")
Chaine = Replace(Chaine, Chr(244), "o")
Chaine = Replace(Chaine, Chr(254), "o")
Chaine = Replace(Chaine, Chr(255), "y")
Chaine = Replace(Chaine, Chr(224), "a")
Chaine = Replace(Chaine, Chr(225), "a")
Chaine = Replace(Chaine, Chr(226), "a")
Chaine = Replace(Chaine, Chr(238), "i")
Chaine = Replace(Chaine, Chr(239), "i")
chaine = Replace(chaine, Chr(244), "o")
If EnMajuscule Then Chaine = UCase(Chaine)
sansAccent = Chaine
End FunctionEt la requête :
SELECT * FROM MaTable WHERE SansAccent(MonChamp,True)=sansaccent("élève",true)Dans une requête avec regroupement des données, les champs de type Mémo sont tronqués à 255 caractères et convertis en champs de type Texte.
Pour récupérer le nombre d'enregistrements après l'exécution d'une requête, il existe deux méthodes.
Méthode 1 (par DAO)
Pour ce code, il est nécessaire de mettre la référence => Microsoft DAO 3.x Object Library.
Dim db as Database
Dim LSQL as String
Set db = CurrentDb()
LSQL = "INSERT INTO ..."
db.Execute LSQL
MsgBox CStr(db.RecordsAffected) & " enregistrements insérés."Méthode 2 (par ADO)
Pour ce code, il est nécessaire de mettre les références => Microsot ADO Ext 2.X for dll and security et Microsoft ActiveX Data Object 2.X Library.
Dim cnn As New ADODB.connection, iAffected As Integer
Dim sSQL As String
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= Nomdemabase;"
sSQL = "INSERT INTO ..."
' Exécution de la requête
cnn.Execute sSQL, iAffected, adExecuteNoRecords
Debug.Print "Enregistrements insérés = " & iAffected
cnn.Close


