Bonjour,
En premier lieu, je dois dire que je ne suis pas vraiment bon à ACCESS... Je l'utilise au travail pour automatiser certains rapports/ bulletins que je produis et ça m'est vraiment utile ... Jusqu'à maintenant !! Je suis bloqué sur un travail que j'essaie de faire depuis de nombreux mois, je n'arrive pas à faire fonctionner le tout.
Je plante le décor.
Je produis tous les trimestres un bulletin sur les échanges extérieurs de marchandises. Pour ce faire J'ai une base de données ACCESS (accdb, Access 2013) contenant des tables de données et des tables-dictionnaires et je dois en extraire des tableaux sous un format précis.
Pour simplifier les choses, j'ai créé une maquette Excel qui contient du code VBA qui exécute pour le trimestre choisi, de la base ACCESS des requêtes stockées dans des fichiers textes (Parce que réécrire toutes les requêtes, environ cinquante, dynamiques en VBA m’ennuyait prodigieusement :p ). Ensuite le programme transfère les recordsets sur des feuilles Excel, fais un peu de mise en forme et enregistre le tout dans un nouveau classeur nommé de la date et de l’heure d’extraction. J'ai déjà fait la plupart des tableaux i.e. des requêtes SQL correspondantes, qui fonctionnent bien, mon VBA également mais il reste encore certains tableaux (leurs requêtes SQL) qui me sont difficiles à mettre en œuvre...
L'OS en question
Je dois faire un tableau qui présente en colonnes les variations trimestrielles des cinq derniers trimestres et variation annuelle du trimestre en cours, pour les biens exportés / importés, classés par produits.
Donc, au début, j’ai essayé de faire une requête qui donne pour chaque année et trimestre, les variations trimestrielles de par code produit. Le code SQL ressemble à ceci:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
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 SELECT Courant.anm, Courant.ctci4, Courant.maxa, Sum(Iif(( ( Courant.valeur - Ancien.valeura ) / Ancien.valeura ) * 100 IS NULL, 0, ( ( Courant.valeur - Ancien.valeura ) / Ancien.valeura ) * 100)) AS VTR FROM (SELECT B.annee, B.mois, B.annee & B.mois AS ANM, (SELECT Max(base1.annee & base1.mois) FROM base1 WHERE base1.annee & base1.mois < B.annee & B.mois) AS MaxA, B.ctci4, Sum(B.valstat) AS Valeur FROM base1 B WHERE ( Len(B.ctci4) ) = 1 AND ( B.flux = "e" OR B.flux = "r" ) GROUP BY B.annee, B.mois, B.ctci4) AS Courant INNER JOIN (SELECT base1.annee & base1.mois AS ANM, base1.ctci4, Sum(base1.valstat) AS ValeurA FROM base1 WHERE ( Len(base1.ctci4) ) = 1 AND ( base1.flux = "e" OR base1.flux = "r" ) GROUP BY base1.annee & base1.mois, base1.ctci4) AS Ancien ON ( Courant.ctci4 = Ancien.ctci4 ) AND ( Courant.maxa = Ancien.anm ) GROUP BY Courant.anm, Courant.ctci4, Courant.maxa
Cette partie de la requête fonctionne bien. En fait, j’ai construit un ID en concaténant l’année et le trimestre(trimestre allant de 21 à 24, Courant.ANM), pour l’utiliser comme jointure interne une avec une autre copie de la même table pour être en mesure de présenter sur le même enregistrement la valeur actuelle, la valeur du trimestre précédent, le code produit (à un chiffre), l'ID de la période précédente (année et trimestre concaténé) et le champ VTR qui calcule la variation à la période précédente en pourcentage.
Pour finir, je dois faire un tableau croisé dynamique en utilisant un TRANSFORM. Je dois mettre en entête de colonne, pour le moment l'année et le trimestre (ANM), le code du produit (CTCI4) en entête ligne et en valeur le champ VTR i.e. les variations trimestrielles. Mais quand j’essaie, MS ACCESS dit que B.annee n’est pas reconnu comme un nom de champ valide. Même si je le nomme différemment ce champ, ça ne fonctionne pas !! S'il vous plaît quelqu'un peut-il dire comment le faire?
Partager