Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > VBA > SQL et VBA
        Comment exécuter/utiliser du SQL dans VBA ?
        Créer un jeu de données (recordset)
        Parcourir un recordset
        Erreur d'exécution '13', Incompatiblité de type
        Je n'arrive pas à utiliser les méthodes FindFirst/FindLast/FindNext/FindPrevious ou la méthode Seek ou la méthode Find avec mon recordset.
        Comment supprimer des enregistrements lorsque l'intégrité référentielle est activée ?
        Je n'arrive pas à supprimer ma table ?
        Comment effacer toutes les données de la base ?
        Exécuter une requête action (ajout, suppression ou mise à jour)
        Comment supprimer les messages d'alertes ?
        Les messages d'avertissement n'apparaissent pas lorsque j'exécute mes requêtes action en vba.
        Comment insérer dans une table une chaîne de caractères contenant des quotes (apostrophes) ?
        Comment tester l'existence d'une requête en VBA et la supprimer ?
        Ma requête ne fonctionne pas suivant le type des variables qu'elle utilise ?
        Comment insérer des enregistrements de la table1 dans la table2, puis effacer ces enregistrements de la table1
        Comment faire une requête qui recherche les doublons dans une table ?
        Comment se connecter en ADO à une bdd pour exécuter une requête action
        Est-il plus performant de faire appel à une requête enregistrée (OpenQuery) ou bien de l'écrire dans le code (VBA) et l'exécuter avec DoCmd.RunSql
        Est-il possible de créer une requête paramétrée dont la valeur du paramètre proviendrait d'une variable ?
        Comment définir en vba le SQL d'une requête existante ?
        Comment personnaliser le message d'erreur d'Access lors de doublons
        Comment chercher les enregistrements contenant une certaine chaîne ? (LIKE)
        Pour insérer des données, vaut-il mieux passer par un RecordSet ou par une requête de type INSERT ?
        Comment supprimer l'apparition des message d'avertissement pour toute l'application ?
        Comment récupérer le résultat de ma requête en VBA ?

precedent    sommaire    suivant   


Comment exécuter/utiliser du SQL dans VBA ?
auteur : Demco
Voici deux liens.

Le premier vous amènera aux RecordSet, qui servent à exploiter les requêtes de sélection (SELECT).

Le second vous expliquera comment exécuter des requêtes d'action (INSERT [insertion], UPDATE [mise à jour], ...).

lien : Créer un jeu de données (recordset)
lien : Exécuter une requête action (ajout, suppression ou mise à jour)

Créer un jeu de données (recordset)
auteur : Team Access

DAO
 Sub DAOOpenRecordset ()
    Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field
    Dim sSQL As String
    ' Ouverture de la base de données 
    Set db = DBEngine.OpenDatabase (".\Comptoir.mdb")
    sSQL =  "Select * From CLIENTS Where Région= \'WA\'"
    ' Ouverture du recordset 
    Set rst = db.OpenRecordset (sSQL, dbOpenForwardOnly, dbReadOnly)
    ' Fermeture du Recordset
    rst.Close
End Sub 
Notes :
-> Il est important d'écrire "DAO." lors de la déclaration.
-> Pensez également à cocher la référence Microsoft DAO 3.6 Object Library ( Dans un module faites Outils / références )

ADO

Sub ADOOpenRecordset ()
    Dim cnn As New ADODB.connection, rst As New ADODB.Recordset, fld As ADODB.Field
    ' Ouverture de la connexion
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\Comptoir.mdb;"
    ' Ouverture du Recordset en défilement en avant, et en lecture seule
    rst.Open "SELECT * FROM Clients WHERE Région =\'WA\'", cnn,  adOpenForwardOnly, adLockReadOnly
    ' Fermeture du Recordset
    rst.Close
End Sub 
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Parcourir un recordset
auteur : Cafeine
Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library

Ces exemples permettent de parcourir un Recordset
If Not oRecordset.EOF Then
  Rst.MoveFirst 
  While Not rst.Eof
     ' code
     rst.MoveNext
  Wend
else
  Msgbox "Le jeu d'enregistrements est vide"
End if
Ou
Do Until rst.Eof
    ' code
    rst.MoveNext
Loop 
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Erreur d'exécution '13', Incompatiblité de type
auteurs : Demco, FRED.G
Modifiez la déclaration du recordset :
Dim Rst as DAO.RecordSet

Nous rajoutons le DAO devant RecordSet afin d'éviter les conflits entre bibliothèques ayant certains objets portant le même nom.
En effet ici, les bibliothèques DAO et ADODB possèdent chacune un objet nommé "RecordSet". Ainsi, en écrivant DAO.RecorsSet nous savons à quelle bibliothèque nous faisons appel.
Lorsque la librairie n'est pas précisée, le type choisi par défaut correspond à celui de la première librairie compatible référencée dans le projet VBA (en partant du haut).

Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library

lien : Erreur de compilation, type défini par l'utilisateur non défini (RecordSet, DataBase ...).
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Je n'arrive pas à utiliser les méthodes FindFirst/FindLast/FindNext/FindPrevious ou la méthode Seek ou la méthode Find avec mon recordset.
auteur : FRED.G
Pour un DAO.Recordset :

Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library

- Si le recordset est de type Table (dbOpenTable) : utilisez la méthode Seek.
La méhode Seek requiert l'utilisation d'une table indexée (voir l'aide pour plus de d'infos).
Lorsque vous utilisez la méthode OpenRecordset, si vous ne précisez pas l'argument type, vba créera par défaut un recordset de type Table si celui-ci est basé sur une table.

- Pour les autres types de recordset : utilisez les méthodes FindFirst / FindLast / FindNext / FindPrevious.

Pour un ADODB.Recordset :

Pour exécuter ce code il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library

utilisez la méthode Find

lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment supprimer des enregistrements lorsque l'intégrité référentielle est activée ?
auteur : Team Access
On ne peut effacer la clé primaire sans effacer les clés étrangères correspondantes :
L'intégrité référentielle est un mécanisme de vérification qui s'assure à chaque ajout, modification, suppression d'une clé (étrangère ou primaire) qu'il y aura toujours la clé primaire correspondant à la clé étrangère.

Cependant il est parfaitement possible de supprimer des clés étrangères.


Je n'arrive pas à supprimer ma table ?
auteur : Drosera
Vous essayez de supprimer une table sans succès en utilisant une requête de type "DROP TABLE" ou en utilisant la commande DeleteObject ?

Cela provient certainement d'un RecordSet chargé avec les données de la table. Cette dernière est alors considérée comme "verrouillée" et donc impossible à supprimer.

Il suffit de fermer le RecordSet pour déverrouiller la table :
MonRecordSet.Close
Cette ligne doit bien sûr être placée avant la suppression.


Comment effacer toutes les données de la base ?
auteur : Team Access
Voici comment effacer le contenu d'une table :

dim SQL as string
SQL = "Delete * From TABLE" 
Docmd.RunSQL SQL
Il suffit de réitérer l'action pour chaque table.

On peut aussi imaginer récupérer le nom de toutes les tables dans un tableau, et pour chaque table exécuter la suppression.

lien : faq Comment effacer tout le contenu d'une table ?

Exécuter une requête action (ajout, suppression ou mise à jour)
auteur : Team Access
DAO

Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library
Sub DAOExecuteBulkOpQuery()
    Dim db As DAO.Database
    Set db = DBEngine.OpenDatabase (".\Comptoir.mdb")
    ' Exécution de la requête
    db.Execute "Update CLIENTS Set PAYS = \'États-Unis\' Where PAYS = \'USA\'"
    Debug.Print "Records Affected = "  & db.RecordsAffected
    db.Close
End Sub


ADO

Pour exécuter ce code il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library
Sub ADOExecuteBulkOpQuery()
    Dim cnn As New ADODB.connection, iAffected As Integer
    Dim sSQL As String
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\Comptoir.mdb;"
    sSQL = "Update CLIENTS Set PAYS = \'États-Unis\' Where PAYS = \'USA\'"
    ' Exécution de la requête
    cnn.Execute sSQL, iAffected, adExecuteNoRecords
    Debug.Print "Records Affected = " & iAffected
    cnn.Close
End Sub 
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment supprimer les messages d'alertes ?
auteur : Team Access

En VBA, placez ce code avant la requête d'insertion/de modification :
 DoCmd.SetWarnings False 

Macro : Avertissements=Non

Pensez à rajouter la confirmation après la requête :
 DoCmd.SetWarnings True 

Macro : Avertissements=Oui

lien : faq Comment supprimer l'apparition des message d'avertissement pour toute l'application ?

Les messages d'avertissement n'apparaissent pas lorsque j'exécute mes requêtes action en vba.
auteur : FRED.G
Tout d'abord, vérifiez que l'option d'avertissement n'est pas déselectionnée dans access :
Menu Outils, Options, Modifier/Rechercher, Confirmer => Requête Action = Oui

Ensuite, si vous utilisez la méthode Docmd.SetWarnings, assurez-vous que le dernier appel avant l'exécution de votre requête active les messages.

Enfin vous devez utiliser la méthode Docmd.RunSql car la méthode Execute d'un objet Database ne déclenche jamais les messages d'avertissement access.
Docmd.SetWarnings True
Docmd.RunSql ""Update MATABLE Set MATABLE.[MONCHAMP] = ""DVP.COM"";"

Comment insérer dans une table une chaîne de caractères contenant des quotes (apostrophes) ?
auteur : Team Access
Il faut faire ceci :
Dim val As String
val = "l\'exemple" 
CurrentDb.Execute "Insert Into TEST Values(""" & val & """)"

Comment tester l'existence d'une requête en VBA et la supprimer ?
auteur : Tofalu
Voici une solution :

Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library
Sub supp()
'Pour fonctionner ce code nécessite la référence
'   - Microsoft DAO X Object Library
 
Dim oDb As DAO.Database
Dim oQdf  As DAO.QueryDef
Dim strReqName As String 'Nom de la requête à supprimer
 
 
'Accède à la base de données courante
Set oDb = CurrentDb
 
strReqName = "R1"
 
'Parcours toutes les requêtes jusqu'à la suppression
For Each oQdf In oDb.QueryDefs
    With oQdf
        If .Name = strReqName Then
            ' Une requête porte le nom recherché, donc nous la supprimons
             oDb.QueryDefs.Delete strReqName
             'Quitte la boucle
             Exit For
        End If
      End With
Next oQdf
End Sub
Le même code avec une gestion d'erreur :
Sub supp()
'Pour fonctionner ce code nécessite la référence
'   - Microsoft DAO X Object Library
 
'Gestion d'erreur
On Error GoTo err
 
 
    Dim oDb As DAO.Database
    Dim oQdf  As DAO.QueryDef
    Dim strReqName As String 'Nom de la requête à supprimer
 
 
    'Accède à la base de données courante
    Set oDb = CurrentDb
    
    strReqName = "R2"
    
    'Tente la suppression
    oDb.QueryDefs.Delete strReqName
    'Affiche un message
    MsgBox "La requête " & strReqName & " a été supprimée"
 
 
fin:
    'Libère l'objet oDb
    Set oDb = Nothing
    Exit Sub
 
err:
    'Affiche un message suivant l'erreur
    Select Case err.Number
        Case 3265: MsgBox "La requête n'existe pas"
        Case Else: MsgBox "Erreur critique inconnue"
    End Select
    'Termine le programme
    Resume fin
 
End Sub
lien : faq Comment savoir si une table existe ?
lien : faq Comment supprimer une table si elle existe ?
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Ma requête ne fonctionne pas suivant le type des variables qu'elle utilise ?
auteur : Maxence HUBICHE
Il faut utiliser des marqueurs différents suivant le type de valeur utilisé :

Numérique (aucun délimiteur)
SQL & "And roulage!numéro =  " & Me.cmbRechNumero   
Texte ( Chr(34) crée des ")
SQL = SQL & "And roulage!repère =  "& chr(34) & Me.cmbRechRepere & chr(34) 
Date (Délimiteur # et format mm/dd/yyyy)
SQL & "And roulage!LADATE= #" & format(Me.txtRechDateDebut,"mm/dd/yyyy") & "#"

Comment insérer des enregistrements de la table1 dans la table2, puis effacer ces enregistrements de la table1
auteur : Maxence HUBICHE
Testé sous Access 2000 :
Sub Sauvegarder() 

    'Création des 2 recordsets 
    Dim myRS1 As New ADODB.Recordset 
    Dim myRS2 As New ADODB.Recordset 

    myRS1.Open "Table1", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 
    myRS2.Open "Table2", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 

    'Parcours du RS pour ajouter à table1 tout en supprimant de table2 
    Do Until myRS2.EOF 
        With myRS1 
            .AddNew Array("Champ1", "Champ2", "Champ3"), _
                          Array(myRS2("Alpha"), myRS2("Beta"), myRS2("Gamma")) 
            .Update 
        End With 

       myRS2.Delete 
       myRS2.MoveNext 
    Loop 

    'Fermeture des recordsets 
    myRS1.Close 
    myRS2.Close 

    Set myRS1 = Nothing 
    Set myRS2 = Nothing 

End Sub

Comment faire une requête qui recherche les doublons dans une table ?
auteur : Cafeine
Select TABLE.CHAMP1, Sum(TABLE.CHAMP2) AS CHAMP2 Into NOUVELLETABLE 
From TABLE
Group By TABLE.CHAMP1, 
Order By TABLE.CHAMP1, 
Où Champs1 est le champ comportant les doublons à supprimer.


Comment se connecter en ADO à une bdd pour exécuter une requête action
auteur : Maxence HUBICHE
Dim cn as ADODB.Connection
Dim cmd as ADODB.Command
Dim insQuery  as String

Set cn = New ADODB.Connection
Set cmd = New ADODB.Command

cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=D:\CS527\P1\bd1_archive.mdb;Persist Security Info=False;" & _
               "Jet OLEDB:System database=c:\LePath\LeFichier.mdw"

insQuery = "INSERT INTO purchasearchive VALUES (" & Chr(34) _
        & PUID & Chr(34) & "," & Chr(34) _
        & cardNum & Chr(34) & "," & Chr(34) _
        & cardType & Chr(34) & "," & Chr(34) _
        & productID & Chr(34) & ",#" _
        & date & "#," _
        & number & ");"

cn.Open
cmd.ActiveConnection=cn
cmd.CommandText=insQuery
cmd.Execute
Pour se connecter à une bbs sécurisée au niveau utilisateur : dans la chaîne de connexion, ajoute ceci :
Password=LeMotDePasse;User ID=LeUser  
en mettant le bon mot de passe et le bon User


Est-il plus performant de faire appel à une requête enregistrée (OpenQuery) ou bien de l'écrire dans le code (VBA) et l'exécuter avec DoCmd.RunSql
auteur : Maxence HUBICHE
Si la requête utilise des critères basés sur des champs indexés, alors mieux vaut passer par une requete et OpenQuery.

Docmd.Runsql ne fait qu'exécuter une instruction sql tandis que OpenQuery exécute une requête enregistrée (bénéficiant de la technologie Rushmore). Cette technologie est notamment basée sur l'usage des index pour la recherche d'un enregistrement. Ces index sont stockés dans une structure cachée.
Lorsque la requête s'exécute, si les critères sont posés sur des champs indexés, la requête peut être optimisée car la recherche se fait sur la structure des index et non directement sur la table.


Est-il possible de créer une requête paramétrée dont la valeur du paramètre proviendrait d'une variable ?
auteur : Lucifer
Nous avons une requête du type :
Parameters TON_PARAM Text;
Insert Into TABLE1 Select  CHAMP1 From TABLE2 Where CHAMP2 = [TON_PARAM];
Voici un exemple de code :
Set qdf= CurrentDb.QueryDefs("TAREQUETE")
      With qdf
         .Parameters("TON_PARAM") = TaVariable
         .Execute
      End With

Comment définir en vba le SQL d'une requête existante ?
auteur : Team Access
Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library
Dim qdf As DAO.Querydef
Set qdf = Currentdb.Querydefs!NomDeMaRequête
qdf.SQL = "Select * From MaTABLE"
Set qdf = Nothing
lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment personnaliser le message d'erreur d'Access lors de doublons
auteur : Team Access
Par exemple ici, on tente d'enregistrer dans une table un nom qui existe déjà. Or le champ Nom n'accepte pas les doublons.
Sub Form_Error(DataErr As Integer, Response As Integer)
 ' Si l'erreur est due à un doublon, la fonction affiche un message permettant d'annuler une commande.
Const ERR_DOUBLON = 3022 ' erreur de doublon
 ' DataErr reçoit le code erreur de la part du moteur de la bdd ou de l'interface
Select Case DataErr
   Case ERR_DOUBLON
       'Votre message...
        MsgBox "Ce nom existe déjà.", vbExclamation, "Attention"
       'La zone a surveiller
        [Client].SetFocus
       'Demande à Access de continuer l'exécution sans afficher le message standard
       Response = acDataErrContinue
   End Select

End Sub
lien : Comment personnaliser les messages d'erreur ?

Comment chercher les enregistrements contenant une certaine chaîne ? (LIKE)
auteur : Petogaz
requete = "Select * From carnet Where Prénom Like \'*" & prenom & "*\'"
Dans ce cas, prénom est une variable ou un contrôle contenant la chaîne que nous cherchons.


Pour insérer des données, vaut-il mieux passer par un RecordSet ou par une requête de type INSERT ?
auteur : Cafeine
L'utilisation d'un Recordset rend le traitement plus rapide.

Ce code de Caféine vous permettra de constatez vous même la différence.

Pour exécuter ce code il faut activer la référence : Microsoft DAO 3.x Object Library

Function BenchmarkIt()

Dim t0 As Single, t1 As Single
Dim rst As DAO.Recordset
Dim i As Long

t0 = Timer
For i = 1 To 5000
    CurrentDb.Execute "INSERT INTO [tblINSERT] VALUES (" & Format(i, "000000") & ");"
Next i
t1 = Timer
Debug.Print "Exécution par INSERT : " & Format(t1 - t0, "0.000") & " s"

t0 = Timer
Set rst = CurrentDb.OpenRecordset("tblRecordset")
For i = 1 To 5000
    rst.AddNew
    rst!dum = Format(i, "000000")
    rst.Update
Next i
rst.Close
set rst = Nothing
t1 = Timer
Debug.Print "Exécution par RECORDSET : " & Format(t1 - t0, "0.000") & " s"

End Function

Ce code donne :
benchmarkit
Exécution par INSERT : 5,328 s
Exécution par RECORDSET : 0,141 s



Il est possible que la différence soit due au fait que le recordset travaille avec la mémoire avant d'écrire sur le disque, alors que n requêtes provoquent n accès disque.

lien : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment supprimer l'apparition des message d'avertissement pour toute l'application ?
auteur : loufab
Outils/Options, Modifier/Rechercher
Dans le cadre Confirmer décochez ce que bon vous semble.

lien : faq Comment supprimer les messages d'alertes ?

Comment récupérer le résultat de ma requête en VBA ?
auteur : Demco
Vous trouverez ci-dessous un lien vous indiquant où se trouve la réponse à votre question. Intéressez-vous plus particulièrement au RecordSet.

lien : faq Comment exécuter/utiliser du SQL dans VBA ?

precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com