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 31/10/2011, 13h37   #1
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Par défaut ADO impossible de recuperer une valeur dans une requete Access

Bonjour.

Je cherche a recuperer le code d'echeance pour un fournisseur donne.

Dans mon fichier Access j'ai relie a des tables Oracle par ODBC.

Puis, dans une requete Access, je relie les 3 tables et je rajoute mes criteres.

Dans VBA, pour afficher le code echance dans un champ de mon formulaire, j'ouvre la requete Access par ADO :

Code :
1
2
3
4
5
6
7
8
9
 
    Set oConn = New ADODB.Connection
    Set oConn = CurrentProject.Connection
 
    Set oRS = New ADODB.Recordset
    oRS.CursorLocation = adUseClient
'Ouverture de la requete Access
oRS.Open "select * from [nomrequete]", oConn, adOpenDynamic, adLockOptimistic, adCmdText
codeech=ors("code_echeance")
Le programme ne me trouve aucun enregistrement. Etant donne que je n'ai pas fait de test pour verifier si la table etait vide a l'ouverture, j'ai une erreur qui ressemble a ca (le texte de l'erreur est en polonais) : "la fonction BOF ou EOF retourne une valeur reelle ou l'enregistrement actuel a ete supprime. L'operation demandee exige un enregistrement."

Quand j'ouvre la requete manuellement, elle n'est pas vide.
D'autre part, en utilisant DAO au lieu de ADO, le programme trouve bien un enregistrement dans la requete. ADO de la maniere suivante :

Code :
1
2
3
4
 
 
set tb=currentdb.openrecordset("nomrequete",dbopendynaset)
codeech=tb!code_echeance
J'ai aussi essaye de ne pas mettre de critere dans la requete Access mais a l'ouverture de la requete par ADO. Meme probleme.

Savez-vous a quoi ca peut etre du ?

Merci.
Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h22   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 623
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 623
Points : 30 954
Points : 30 954
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Essayes de faire un MoveLast et un MoveFirst de ton recordset pour voir.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 09h53   #3
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Bonjour.

Que ce soit en rajoutant un movelast et un movefirst ou directement un movefirst, j'obtient le meme message d'erreur comme quoi il n'y a pas d'enregistrement.

En faisant :

Code :
1
2
3
4
5
6
7
 
 
if ors.eof=true then
     msgbox"la table est vide"
else
     codeech=ors("code_echeance")
end if
Le programme m'affiche le message "la table est vide".

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 10h08   #4
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 256
Points : 2 979
Points : 2 979
Bonjour,

je n'utilise pas oracle, mais il me semble bizarre que tu n'initialises pas le ConnectionString de ta connection oConn.

Quelque-chose du genre :
Code :
1
2
    sConn = "provider=ProviderOracle;Data source=xxx.xxx.xxx.xxx;USER ID=user;PASSWORD=psw"
    oConn.ConnectionString = sConn
La syntaxe est à regarder dans ta doc oracle. ici j'ai juste pris la syntaxe de l'ADO pour l'IBM I5.
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 10h39   #5
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Bonjour.

J'utilise des tables reliees a Oracle par ODBC et ca fonctionne en temps normal. J'accede donc aux tables qui se trouvent dans Access. Je me connecte a ma base Access actuelle et non pas a Oracle.

Dans ma requete Access j'utilise aussi des valeurs que j'ai recupere dans mon formulaire.

C'est vrai que je pourrais remplacer par une connection directe a Oracle dans mon programme. Mais j'ai decide de faire autrement.

Ce que je ne comprend pas, c'est pourquoi par DAO le programme trouve les donnees alors que par ADO aucun enregistrement n'est trouve.

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 10h51   #6
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 256
Points : 2 979
Points : 2 979
Bonjour,

Citation:
J'accede donc aux tables qui se trouvent dans Access.
Pas besoin d'utiliser ADO dans ce cas, il me semble.

Tu peux accéder à ta requête comme un simple recordset de ta CurrentDB.
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 11h41   #7
Membre confirmé
 
Inscription : juillet 2006
Messages : 346
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 346
Points : 288
Points : 288
Bonjour,

Je vais peut-être dire une betise, mais si vous cherchez à ne retourner qu'un seul enregistrement vous devriez peut être utiliser un dlookup ?
Access Newbie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 14h28   #8
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Citation:
Envoyé par Godzestla Voir le message
Bonjour,



Pas besoin d'utiliser ADO dans ce cas, il me semble.

Tu peux accéder à ta requête comme un simple recordset de ta CurrentDB.
Pour acceder a ma requete je ne vois que ADO (comme je fais actuellement), DAO (ce que j'utilisais jusqu'a present), ou une requete sql saisie dans le module VBA qui me renvoie une valeur que je dois recuperer.
Probleme d'une requete sql dans le module VBA : les champs texte ne me recuperent pas la valeur en tant que tel mais la requete sql en elle meme ("select......from...."). Je suis alors oblige de remplacer mon champ texte par un autre type de champ, sauf erreur de ma part un champ de liste (je ne me souviens plus comment s'appelle exactement en francais ce type de champ, j'ai la version polonaise au bureau).

D'autre part, il semble que ca pose probleme de melanger de l'ADO et du DAO dans un programme.

Si aucune solution n'est trouvee, je modifierai le type de champ de mon formulaire pour recuperer la valeur recherchee par une requete sql dans VBA.

Par contre, chose que j'ai constate : avec le Runtime Access, meme la requete sql ne permet pas de recuperer la valeur cherchee. Et je veux que les utilisateurs utilisent le Runtime et non la version complete comme actuellement. Mais mes problemes avec le Runtime sera mentionne dans un autre appel.

Cdlt.
jj4822 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 14h41   #9
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 256
Points : 2 979
Points : 2 979
Bonjour,

Citation:
J'accede donc aux tables qui se trouvent dans Access.
Pour ce faire, il me semble que ni ADO ni DAO ne sont requis.

Un exemple, au hasard, sorti de mes codes. où on suppose que ta requete existe et est stockée ainsi que la table dans access (sinon il faut ADO, DAO, ...)

ce code extrait un numéro d'un classeur excel et vérifie qu'on a enregistré dessus dans access (Booking_Attendees)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim Dbp             As Database                              'This Db
Dim R_Events        As Recordset                             'Events Recordset
Dim Ob_Events       As String
Dim Criteria_Events As String
Dim Event_Key       As String                               'Event_key is Excel : Search argument
 
 
'Open Events by Eventcode
Ob_Events = "SQL_Events_By_EventCode"
Set R_Events = Dbp.OpenRecordset(Ob_Events)
' ......
        Event_Key = xlBook.Worksheets(xlSheet).Range(Me![Importing_File_Ref_Column] & Off).Value
        'Look for Event Info in Access
        Criteria_Events = "EventCode Like  '" & Event_Key & "'"
        R_Events.FindFirst (Criteria_Events)
        'Found Event
        If Not R_Events.NoMatch Then
            Event_Found = True
            Booking_nbr = R_Events![Booked_Attendees]
         Else
            Event_Found = False
        End If
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 17h05   #10
Membre habitué
 
Homme jean maury
Inscription : mars 2009
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme jean maury
Âge : 42
Localisation : Pologne

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : mars 2009
Messages : 116
Points : 111
Points : 111
Bonjour.

Merci pour les reponses.

J'ai resolu mon probleme autrement.

Sans rentrer dans les details, j'accede par ADO a une table MYSQL qui contient les donnees d'Oracle (pour une question de rapidite d'acces) au lieu d'acceder aux donnees d'une requete reliee par ODBC a Oracle.

Et ca fonctionne.

Cdlt.
jj4822 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 10h10.


 
 
 
 
Partenaires

Hébergement Web