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 14/04/2011, 13h52   #1
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Par défaut Comment détecter quel recordsource alimente une liste?

Bonjour,

Dans un formulaire générique, j'ai une liste, avec sélection simple, qui est alimentée par des requètes SQL différentes (en fonction de choix de l'utilisateur).
La première requête (qui est celle qui alimente la liste par défaut au démarage du fromualire) a "TransactionID" comme nom du premier champ
La seconde requête a "PurchaseOrderID" comme nom du premier champ
Donc en fonction du choix X d'un utilisateur, la première requête est affectée à la liste comme source de données(row source).
Et en focntion du choix Y d'un utilisateur, la seconde requête est affectée à la liste comme source de données (row source).


Ce que je souhaiterai, c'est pouvoir détecter, lors d'un double clic sur la liste, quel est sa source courante et en fonction de cela lancer des actions adaptées.

J'ai donc imaginé de tester le nom du premier champ de la source qui alimente la liste.

Lorsque c'est la première requète, pas de problème, quand je double cique dans la liste, mon msgbox me retourne bien le nom du premier champs. Je change donc de source de données et là ça ne fonctionne plus. J'ai un message d'erreur.


Voici ci-dessous mon code que j'ai mis sur le double-click de la liste:
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
 
Private Sub ListGeneral_DblClick(Cancel As Integer)
'ATTENTION
'Quand on clique sur la liste, il faut tester d'abord de quelle source il s'agit puis réaliser les actions en fonction du résultat
 
Dim rst As DAO.Recordset
Dim fld As Field
Dim nom As String
 
Me.ListGeneral.RowSource = Me.ListGeneral.RowSource 'pour réaffecter le recordsource courant
 
Set rst = Me.ListGeneral.Recordset
 
nom = rst.Fields(0).Name
'MsgBox CStr(rst.Fields(0).Name) pour tester si c'est bien le nom attendu
 
Select Case nom
    Case "TransactionID"
        MsgBox "liste générale"
    Case "PurchaseOrderID"
        MsgBox "liste des purchase orders"
    Case Else
End Select
 
nom = ""
rst.Close
Set rst = Nothing
 
End Sub
Avez-vous une idée pour pallier cela?

Merci et à Bientôt!!!
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 16h20   #2
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut Une solution de contournement ?

Bonjour,
Pour ma part, je définirais une variable publique
que je renseignerais par exemple à "1" quand j'utilise la première requete et à "0" quand j'utilise la deuxième.

Il ne te resterait plus qu'à tester la valeur de cette vvariable pour savoir quel est le code SQL utilisé pour la dernière fois (donc celui qui est en cours d'utilisation).

... enfin si j'ai bien compris la question

Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 08h56   #3
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Bonjour Orion,

Merci pour ta réponse! C'est effectivement une solution qui sera efficace et à laquelle je n'avais pas pensé en restant focalisé sur la compréhension du pourquoi ça ne marchait pas. Je vais la mettre en oeuvre pour le moment.

Mais malgré tout, je suis intéréssé de savoir comment faire sans passer par une variable globale. Je pense que ça doit être possible(entre autre parceque mon code marche en partie). Le problème semble lié à la réactualisation de la variable "nom" qui ne récupère pas la valeur du nom du premier champs du recordset...

Donc si quelqu'un a une idée

A bientôt
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 10h50   #4
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Par défaut j'ai testé la variable globale et ça fonctionne aussi bien


Je pense que j'ai trouvé!

En déclarant un recordset sur base du rowsource de la liste, ca roule parfaitement!!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Dim rst As DAO.Recordset
Dim nom As String
 
Set rst = CurrentDb.OpenRecordset(CStr(Me.ListGeneral.RowSource))
 
nom = CStr(rst.Fields(0).Name)
 
    Select Case nom
    Case "TransactionID"
        MsgBox "liste générale " & CStr(rst.Fields(0).Name)
    Case "PurchaseOrderID"
        MsgBox "liste des purchase orders " & CStr(rst.Fields(0).Name)
    Case Else
    End Select
 
 
rst.Close
Set rst = Nothing
encore pour le soutien!
Dermochelys 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 01h09.


 
 
 
 
Partenaires

Hébergement Web