Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/06/2011, 19h19   #1
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Par défaut Transformer un « RECORDSET » en « RESULTSET » en ADO

Bonjour tout le monde,
J’ai exécuté en ADO une requête qui me renvoie 7 lignes (et 2 champs) dans un recordset .
Première question :
Quand j’utilise la propriété RecordCount pour checker le nombre de lignes renvoyées, j’obtiens -1 au lieu de 7. Pouvez-vous svp me dire ce qui ne va pas ?
Deuxième question :
Dans mon code j’ai utilisé une boucle pour parcourir le contenu de ce recordset. Ceci me retourne belle et bien les éléments de mes 7 lignes*2 champs de façon INDIVIDUELLE.
J’aimerais savoir si il y a un moyen pour transformer ce recordset en un « RESULTSET » semblable au résultat d’une requête quand celle-ci est exécutée directement dans la fenêtre d’Access (et non dans VBA) .
mon but est de pouvoir obtenir le resultat de ma requete sous forme de "tableau"(c'est a dire sous forme de lignes et champs) que je peux ensuite facillement copier et coller dans un document word.

Merci d’avance.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
Sub NavigateThroughRecordsetADO()
 
    Dim Cn As ADODB.Connection  ' la connexion
    Dim rs As ADODB.Recordset  ' le recordset
    Dim strSQL As String
 
    'Set Cn = CreateObject("adodb.connection")
    'Set rs = CreateObject("adodb.recordset")
 
    strSQL = "Select Products.ID,Products.[Product Name] From Products Where Products.[Standard Cost] between 1 and 2 " 'rt 7
 
 
    Set Cn = Application.CurrentProject.Connection
    Set rs = Cn.Execute(CommandText:=strSQL)
 
 
'Comment savoir le nombre de lignes qu 'il y a dans le recordset?
    Debug.Print rs.RecordCount 'ceci me retourne -1 ce que je ne comprends pas. _
    ca devait normallement me renvoyer 7.
 
    Dim i As Integer
 
    If rs.EOF <> True Then 'checker que le recordset n'est pas vide.
 
        Do While rs.EOF <> True  'checker qu'on n'est pas sur la derniere ligne.
 
            'visualiser le contenu du recordset.
            For i = 0 To (rs.Fields.Count - 1)
                Debug.Print rs.Fields(i).Value
            Next i
 
            rs.MoveNext
        Loop
 
    Else
        MsgBox "le recordset est vide"
    End If
 
End Sub
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2011, 10h23   #2
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonjour,
1) nombre d'enregistrements
Code :
1
2
3
4
 
rs.MoveLast
rs.MoveFirst
Nb = rs.RecordCount
méthode archaïque mais c'est du Microsoft.
2) Si c'est pour faire un copier/coller pourquoi ne pas lancer directement la requête ou ouvrir la table qui reçoit les données ?
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2011, 20h12   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,
Citation:
Envoyé par Bonero Voir le message
Première question :
Quand j’utilise la propriété RecordCount pour checker le nombre de lignes renvoyées, j’obtiens -1 au lieu de 7. Pouvez-vous svp me dire ce qui ne va pas ?
-1 indique que la propriété n'est pas supportée.
Tu n'as pas utilisé la méthode traditionnelle pour ouvrir un recordset ADO.
Un extrait de l'aide ADO concernant la méthode Execute d'un objet Connection :
Citation:
L'objet Recordset retourné correspond toujours à un curseur en lecture seule et avant uniquement. Si vous avez besoin d'un objet Recordset avec davantage de fonctionnalités, commencez par créer un objet Recordset avec les paramètres de propriétés requis, puis utilisez la méthode Open de l'objet Recordset pour exécuter la requête et retourner le type de curseur souhaité.
Essaie comme ça pour voir
Code :
1
2
3
4
5
6
7
8
9
    Dim Cn As ADODB.Connection  ' la connexion
    Dim rs As ADODB.Recordset   ' le recordset
    Dim strSQL As String
 
    strSQL = "Select Products.ID,Products.[Product Name] From Products Where Products.[Standard Cost] between 1 and 2 " 'rt 7
 
    Set Cn = Application.CurrentProject.Connection
    Set rs = New ADODB.Recordset
    rs.Open strSQL, Cn, adOpenKeyset, adLockOptimistic, adCmdText
Plus d'infos ici.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/06/2011, 02h53   #4
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Bonjour et merci pour les suggestions.
J’ai suivi les suggestions de LedZeppIILedZeppII en definissant les proprietés de l’objet Recordset avant d’ouvrir ce dernier. Pour ce faire , j’ai utilisé le code ci-dessous et ca a bien marché. J’arrive a acceder la proprieté RecordCount qui me posait probleme. Ca renvoie maintenant 7.

Code :
1
2
3
4
5
6
7
8
   With rs
        .Source = strSQL
        .ActiveConnection = Cn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        '.adCmdText  'par contre je ne sais pas comment inclure l'option adCmdText  sur cette ligne ;-)
        .Open
    End With
J’ai egalement commencé par lire le tuto que tu m’as suggéré :http://ledzeppii.developpez.com/fonctionnalite-rs-ado/

Cependant en voulant ouvrir l’objet Connection en suivant la méthode qui est y décrite, j’obtiens l’erreur suivante :
Citation:
Run time error « -214 746 7259 (8000 4005) »
Format de base de données (‘C\.....nw2007.accdb’) NON RECONNU
J’utilise ACCESS 2007 et C\.....nw2007.accdb est le FullName de ma base de données. La reference à Microsoft ActiveX Data Objects 2.8 Library a ete cochée.
Pouvez vous me dire la raison de cette erreur ? merci.
Voici le code de la page du tuto.

Code :
1
2
3
4
5
6
7
8
Sub ObjetConnectionOuvrir()			
Dim oConn As ADODB.Connection, oRS As ADODB.Recordset
 
Set oConn = New ADODB.Connection
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & CurrentProject.FullName & ";"
oConn.Open
End sub
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 13h50   #5
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour Bonero,

Est-ce que l'origine de l'erreur ne provient-elle tout simplement pas du fait que C\.....nw2007.accdb nest pas un chemin valide ?

essaie de rajouter les 2points : C:\.....nw2007.accdb
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h36   #6
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Citation:
Envoyé par dumas.blr Voir le message
Bonjour Bonero,

Est-ce que l'origine de l'erreur ne provient-elle tout simplement pas du fait que C\.....nw2007.accdb nest pas un chemin valide ?

essaie de rajouter les 2points : C:\.....nw2007.accdb


Bonjour Dumas,

Merci pour ta reponse. C’etait une simple erreur de frappe dans mon precedent message.
De toutes facons, les deux points dont tu parles sont pris en compte par la ligne suivante :

Code :
CurrentProject.FullName
La nouveaute est que lorsque j’ai essaye le meme code au boulot (sur Access 2003) , j’obtiens une erreur (completement different du premier) dont voici le message:

Citation:
Run time error ‘- 214 746 7259’
The database has been placed in a state by user ‘admin’ on machine ‘ ln1ws12031’ that prevents it from being opened or locked.
Je ne vois vraiment l’origine de cette erreur.
Merci de votre aide.
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 18h19   #7
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,
Citation:
Envoyé par Bonero Voir le message
J’ai egalement commencé par lire le tuto que tu m’as suggéré :http://ledzeppii.developpez.com/fonctionnalite-rs-ado/

Cependant en voulant ouvrir l’objet Connection en suivant la méthode qui est y décrite, j’obtiens l’erreur suivante :


J’utilise ACCESS 2007 et C\.....nw2007.accdb est le FullName de ma base de données. La reference à Microsoft ActiveX Data Objects 2.8 Library a ete cochée.
Pouvez vous me dire la raison de cette erreur ? merci.
Voici le code de la page du tuto.

Code :
1
2
3
4
5
6
7
8
Sub ObjetConnectionOuvrir()			
Dim oConn As ADODB.Connection, oRS As ADODB.Recordset
 
Set oConn = New ADODB.Connection
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & CurrentProject.FullName & ";"
oConn.Open
End sub
Pour Access 2007, le provider est Microsoft.ACE.OLEDB.12.0 au lieu de Microsoft.Jet.OLEDB.4.0.

Mais tu peux réutiliser la connexion en cours, comme tu l'as déjà fait :
Code :
    Set Cn = Application.CurrentProject.Connection
Ma remarque concernait surtout la méthode d'ouverture du recordset.


Citation:
Envoyé par Bonero Voir le message
La nouveaute est que lorsque j’ai essaye le meme code au boulot (sur Access 2003) , j’obtiens une erreur (completement different du premier) dont voici le message:

Citation:
Run time error ‘- 214 746 7259’
The database has been placed in a state by user ‘admin’ on machine ‘ ln1ws12031’ that prevents it from being opened or locked.
Je ne vois vraiment l’origine de cette erreur.
C'est une erreur que l'on rencontre souvent avec ADO, lorsqu'on a modifié la base de données.
Souvent, en sauvant les modifications apportées au code, le code s'exécute sans erreur par la suite.
Sinon, il faut sauver les modifications apportées au code, fermer la base, puis la ré-ouvrir.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h34   #8
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Merci beaucoup pour ton aide,

J’ai effectivement remarque que j’arrive a ouvrir l’objet Connection lorsque je sauvegarde les changements apportes a la base de donnees.

Par contre, peux tu me dire comment definer l’Options d’ouverture de l’objet Recordset (sur par exemple adCmdText ) en passant par la structure de code suivante?


Code :
1
2
3
4
5
6
7
8
9
  With rs
        .Source = strSQL
        .ActiveConnection = Cn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
 
        '...adCmdText  ' je ne sais pas comment inclure l'option adCmdText  sur cette ligne ;-)
        .Open
    End With
Merci
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 13h59   #9
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

Je ne sais le faire que dans la méthode Open.
Code :
1
2
3
4
5
6
7
8
9
  With rs
        .Source = strSQL
        .ActiveConnection = Cn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        ' Ouverture du recordset avec l'option adCmdText,  indiquant 
        ' au Provider que la source est une instruction SQL
        .Open , , , , adCmdText
  End With
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 17h48   #10
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Citation:
Envoyé par LedZeppII Voir le message
Bonjour,

Je ne sais le faire que dans la méthode Open.
Code :
1
2
3
4
5
6
7
8
9
  With rs
        .Source = strSQL
        .ActiveConnection = Cn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        ' Ouverture du recordset avec l'option adCmdText,  indiquant 
        ' au Provider que la source est une instruction SQL
        .Open , , , , adCmdText
  End With
A+



grand merci.
ca me va largement. ca me permet de garder la structure de mon code .
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h51.


 
 
 
 
Partenaires

Hébergement Web