Récupération des données d'un Recordset dans un TCD

Yakou

XLDnaute Nouveau
Bonjour à tous.

Habituellement, je cherche, je teste et je trouve la réponse.
Mais cette fois-ci, je cale un peu.

Je travaille sur des créations de rapports statistiques sur Excel.

Des connexions de données sont faite de Access vers Excel.
Via des requêtes SQL, ces données sont importées dans des TCD qui eux même sont reliés à des graphiques.


Voila ce que j'essaye de faire:

Excel => connexion ouverte => Access
Access => requete SQL => Recordset
TCD <= Recordset
Excel <= connexion fermée <= Access

J'ai réussi toute les étapes sauf << TCD <= Recordset >>

Je ne peux pas vous joindre le fichier, ni la base access.
Parcontre, je peux vous joindre le code.

J'ai découpé mon code en plusieurs séquence pour le rendre plus lisible.
(en rouge la partie ou je suis bloqué)


[EDIT= J'oubliai il faut activé dans la bibliotèque "Microsoft Activex Data Objects 2.8 Librairy]

'stockage des données variable pour la connexion:
------------------
Sub Prc_Start()

Call fct_Connection_Oracle2("MS Access Database", _
"\\MonLienReso\Dossier\Fichier_Access.accdb", _
"\\MonLienReso\Dossier\\")

End Sub
------------------


'Procédure de connexion:
------------------
Sub fct_Connection_Oracle2(ByVal NomDuDSN As String, ByVal LienDuDBQ As String, ByVal LienParDefault As String)

'Déclaration de la variable de connexion
Dim cNx As ADODB.Connection
Set cNx = New ADODB.Connection


'Définition de la chaîne de connexion
cNx.ConnectionString = "" _
& "DSN=" & NomDuDSN & ";" _
& "DBQ=" & LienDuDBQ & ";" _
& "DefaultDir=" & LienParDefault & ";" _
& "DriverId=25; FIL=MS Access; MaxBufferSize=2048; PageTimeout=5;"

cNx.Open

Call fct_Access_recorset(cNx)

cNx.Close
Set cNx = Nothing
End Sub
------------------

'Procédure de stockage de donnée dans un recordset
'puis écriture dans un TCD.

------------------

Sub fct_Access_recorset(ByRef cNx As ADODB.Connection)

Dim oRS As ADODB.Recordset
Dim SQL_Qry As String
Dim pvt As PivotTable

Set oRS = New ADODB.Recordset

'lancement de la requete SQL
Call Qry_Agence("Ma_table_access", "Mon_Agence_cible", SQL_Qry)

'stockage dans le recordset
oRS.Open SQL_Qry, cNx, adOpenStatic


'à partir d'ici je cale.

Set pvt = Worksheets("Ma_feuille").PivotTables(1)
pvt.PivotCache.MissingItemsLimit = xlMissingItemsNone
pvt.PivotCache.Refresh

pvt.pivotcache.Recordset oRS
pvt.PivotCache.Refresh


oRS.Close


Set pvt = Nothing
Set oRS = Nothing
End Sub

------------------

'Requête SQL
------------------

Sub Qry_Agence(ByVal table_name As String, ByVal agence_name As String, ByRef SQL_Qry As String)


'agence de regroupement = champs de la table pour récupéré les données agencesSQL_Qry = "SELECT * FROM `" & table_name & "` WHERE `agence de regroupement` like ('%" & agence_name & "%')"

End Sub


Je continu de chercher de mon coté.
Si vous avez une solution ou même une piste, je suis preneur.

Bon courage.
 
Dernière édition:

chris

XLDnaute Barbatruc
Re : Récupération des données d'un Recordset dans un TCD

Bonjour

On peut baser un TCD Excel sur une requête Access.

Pour un recordset, sans placer son contenu dans un onglet, je ne pense pas cela possible...

On peut effectuer un requête de type paramétrée sans VBA avec les paramètres dans Excel ainsi Ce lien n'existe plus : cela peut te donner une solution

Edit : le nom du lien parait bizarre mais le lien fonctionne (anomalie signalée à David)
 

Yakou

XLDnaute Nouveau
Re : Récupération des données d'un Recordset dans un TCD

Merci de ton aide.

voici plus de précision suite à ton message.

Pour un recordset, sans placer son contenu dans un onglet, je ne pense pas cela possible...

Je ne sais pas si c'est impossible.
Dans mes recherches, je note que dans un TCD certaine commande varie selon la source.(exemple):


RefreshDataSourceValues

voir le lien de la base msdn sur ce sujet:

Ce lien n'existe plus

This method applies only to PivotTable reports with OLAP data sources. Trying to execute this method or PivotTable reports with non-OLAP data sources generates a run-time error.

J'ai trouvé des syntaxes qui pourrait être utilisé avec une source OLAP :

'ClearTable()
'CommitChanges
'DiscardChanges

Je ne sais pas trop comment les exploiters.


Le recordset à l'air de fonctionner si on utilise ce type de syntaxe pour le copier sur la feuille.

Sheets"Ma_Feuille").range("A1")CopyFromRecordset oRS


Mais j'aimerai évité d'alourdir mes fichiers en données.


On peut effectuer un requête de type paramétrée sans VBA avec les paramètres dans Excel ainsi 403 Forbidden : cela peut te donner une solution

Aujourd'hui, c'est ce que j'utilise.
J'ai une 50aine de fichier par domaine avec 2 à 4 requêtes dans chaque fichier.
Si un nom d'agence change, les fichiers et les requetes sont à modifier.

Mon but est de :

- générer les rapports à l'instant T et non plus de les mettres à jour.
- de retirer le code VBA et les connexions de données intégrées.
- de rendre les fichiers plus légé au d'augmenter la rapidité du code.
 
Dernière édition:

chris

XLDnaute Barbatruc
Re : Récupération des données d'un Recordset dans un TCD

Re,

J'ai trouvé comment créer un cache de TCD et un TCD à partir d'un recordset.

Mais si j'ai bien compris tu veux utiliser un TCD existant et changer le contenu de son cache.

A priori c'est la commande ChangePivotCache mais d'après l'aide elle ne marche pas sur une source externe.

J'ai eu l'idée de créer un TCD temporaire basé sur le recodset puis de changer la cache du TCD cible en utilisant celui du TCD temporaire. TCD temporaire que je détruis ensuite et qui est donc recréé à chaque fois.

Si cela peut te convenir...

P.S. : Access ne fournit pas de cube OLAP donc je n'ai pas exploré cette voie.
 

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 191
Membres
103 152
dernier inscrit
Karibu