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 22/12/2010, 15h14   #1
Nouveau Membre du Club
 
Inscription : avril 2008
Messages : 197
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 197
Points : 29
Points : 29
Par défaut Concaténer un recordset sans le parcourir ?

Bonjour,

Je code une fonction qui parcourt une table d'employés via un recordset.

Code :
1
2
3
4
5
 
 
'Récupération de la liste des employés
Dim rst as Recordset
set rst = CurrentDb.OpenRecordset("SELECT * FROM T_EMPLOYE")
Pour chaque ligne du recordset, je recherche les services auxquels l'employé est affecté.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
'Pour chaque employé
While not rst.eof
 
  Dim rst2 as Recordset
  set rst2 = CurrentDb.OpenRecordset("SELECT Service FROM T_SERVICE WHERE ID_Emp = " & rst!ID)
 
  'Concaténation de chaque service auquel l'employé est rattaché
  while not rst2.eof
 
    listService = listService & " " & rst2!Service
 
    rst2.MoveNext
 
  Wend
 
  rst.MoveNext
 
Wend
L'ennui c'est ce que cette méthode a un temps d'exécution assez élevé (j'ai un millier d'employés, et chaque employé peut être affecté de 0 à une dizaine de services différents) => ~40 secondes.
Y a-t-il une méthode efficace pour récupérer pour chaque employé les services auxquels ils sont liés, mais sans parcourir un recordset ?
En gros est-ce qu'il existe en SQL une méthode Concatenate ? Ou bien en VBA une méthode Join() qu'on pourrait exécuter directement sur un Recordset ?

Merci pour votre aide.
Monkey_D.Luffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 16h16   #2
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Ca serait surement plus rapide en faisait une seule requête avec jointure :

Code :
1
2
3
4
 
SELECT T_EMPLOYE.ID_Emp, T_SERVICE.Service FROM T_EMPLOYE
INNER JOIN T_SERVICE ON T_SERVICE.ID_Emp = T_EMPLOYE.ID_Emp
ORDER BY T_EMPLOYE.ID_Emp
Ainsi il n'y aura qu'une seule boucle au lieu d'avoir deux boucles imbriquées. A toi ensuite de gérer la rupture au changement d'employé au besoin.

De plus, dans ton exemple de code tu ouvres un nouveau recordset rst2 à chaque boucle et tu ne le fermes jamais, ca ne doit pas aider non plus.

Si après ca c'est vraiment toujours trop lent, il faudrait peut-être voir à créer des index sur tes tables. As-tu créé la clé étrangère pour faire le lien entre tes deux tables ? Les clés étrangères sont automatiquement indexées et accélère les jointures (pour l'accès en lecture en tout cas, pour l'écriture c'est plutôt l'inverse).
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 17h25   #3
Nouveau Membre du Club
 
Inscription : avril 2008
Messages : 197
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 197
Points : 29
Points : 29
Merci pour ta réponse CaptainKirk.

Pour résumer, j'essaie d'alimenter une liste dans un formulaire à l'aide du résultat des recordsets.

J'ai tenté de récupéré les employés et leur service en une seule requête avec jointure comme tu m'as conseillé, et effectivement cela va beaucoup + vite (5 secondes au lieu de 40).

Pour la BD, la table T_SERVICE est en fait la table intermédiaire qui contient le Service (qui est un ID) et ID_Emp. Les 2 champs sont indexés.

Encore merci. Je pense qu'il y a possibilité de gagner encore en vitesse d'exécution : inclure un champ Serivce dans T_Employe qui contiendrait la liste concaténée des services liés à l'employé. Mais ça ne serait pas propre de faire ça. :/
Monkey_D.Luffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h53.


 
 
 
 
Partenaires

Hébergement Web