FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- 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.Recordcount
Pour 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 =
Nothing
Lien : 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
Sub
Lien : 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
Function
Et 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