Bonjour à tous ,
j'ai 3 belles requêtes croisées dynamique qui fonctionnent bien.
Chacune est le fruit d'une chaine SQL générée par une fonction,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
strSql = RQ_Anno_Radier()
...
strSql = RQ_anomalie_Cheminee()
...
strSql = RQ_Anomalie_tampon()
J'arrive très bien à créer 3 tables avec des instructions du style:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
Private Sub Anomalie_tampon_2_Click()
DoCmd.SetWarnings True ' message on
Dim SqlStr As String '
SqlStr = RQ_Anomalie_tampon()
FermerRequete ("Analyse_Tampon")
SupprimerRequete ("Analyse_Tampon")
CurrentDb.CreateQueryDef "Analyse_Tampon", SqlStr  ' crée la nouvelle requete
DoCmd.OpenQuery "Analyse_Tampon"
End Sub
Maintenant, je voudrais joindre directement mes 3 requêtes sans passer par des tables intermédiaires style "Analyse_Tampon", ou au moins qu'elle soient invisibles
J'ai donc écrit le code ci dessous, qui ne marche pas, bien sur, car "Analyse_Cheminee" par exemple, n'existe pas.

Code : 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
 
Private Sub Syntheses_anomalies_Click()
                        DoCmd.SetWarnings True ' message on
                        Dim rs As Recordset
 
                        Dim SqlStr As String '
 
Dim critereIn As String
 
'Set rs = CurrentDb.OpenRecordset("Val-ano-tampon")
'While Not rs.EOF
'   critereIn = critereIn & IIf(critereIn = "", "", ",") & Chr$(34) & rs![Tampon] & Chr$(34)
'   rs.MoveNext
'Wend
 
SqlStr = SqlStr & "SELECT Analyse_Radier.*"
    ',"|" AS Sep_1
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Couronne décalée]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Couronne cassée, fissurée]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Virole cassée, fissurée]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Branchement défectueux]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.Racines"
SqlStr = SqlStr & "    ,Analyse_Cheminee.Infiltration"
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Dégradation H2S]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.[Trace de mise en charge]"
SqlStr = SqlStr & "    ,Analyse_Cheminee.Autre"
',"|" AS Sep_2
SqlStr = SqlStr & "    ,Analyse_Tampon.[Tampon/grille cassé, fissuré]"
SqlStr = SqlStr & "    ,Analyse_Tampon.Infiltration"
SqlStr = SqlStr & "    ,Analyse_Tampon.[Cadre décalé]"
SqlStr = SqlStr & "    ,Analyse_Tampon.[Cadre non scellé]"
SqlStr = SqlStr & "    ,Analyse_Tampon.[Cadre HS]"
SqlStr = SqlStr & "    ,Analyse_Tampon.Affaissement "
 
SqlStr = SqlStr & "FROM ( "
    'Analyse_Radier
SqlStr = SqlStr & RQ_Anno_Radier()
SqlStr = SqlStr & "    INNER JOIN "
    'Analyse_Cheminee
SqlStr = SqlStr & RQ_anomalie_Cheminee()
SqlStr = SqlStr & "    ON Analyse_Radier.Ouvrage = Analyse_Cheminee.Ouvrage"
SqlStr = SqlStr & "    ) "
SqlStr = SqlStr & "INNER JOIN "
'Analyse_Tampon
SqlStr = SqlStr & RQ_Anomalie_tampon()
SqlStr = SqlStr & "    ON Analyse_Cheminee.Ouvrage = Analyse_Tampon.Ouvrage;"
 
Debug.Print SqlStr
 
FermerRequete ("Synthese_anomalies")
SupprimerRequete ("Synthese_anomalies")
 
'ci desous la bonne solution
'Set rst = CurrentDb.OpenRecordset(SqlStr)
 
'DoCmd.DeleteObject acQuery, "Analyse_Radier"    ' supprime la requête Analyse, mais il faut qu'elle existe déjà sinon erreur
 
                CurrentDb.CreateQueryDef "Synthese_anomalies", SqlStr  ' crée la nouvelle requete
                DoCmd.OpenQuery "Synthese_anomalies"
End Sub
Comment la créer à la volée lors du TRANSFORM ?, comment faire un join de mes 3 requêtes directement?
Merci d'avance,
Gérald


PS: le code ci dessus me donne la requête SQL suivante :
Code : 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
SELECT Analyse_Radier.*
	,Analyse_Cheminee.[Couronne décalée]
	,Analyse_Cheminee.[Couronne cassée, fissurée]
	,Analyse_Cheminee.[Virole cassée, fissurée]
	,Analyse_Cheminee.[Branchement défectueux]
	,Analyse_Cheminee.Racines
	,Analyse_Cheminee.Infiltration
	,Analyse_Cheminee.[Dégradation H2S]
	,Analyse_Cheminee.[Trace de mise en charge]
	,Analyse_Cheminee.Autre
	,Analyse_Tampon.[Tampon/grille cassé, fissuré]
	,Analyse_Tampon.Infiltration
	,Analyse_Tampon.[Cadre décalé]
	,Analyse_Tampon.[Cadre non scellé]
	,Analyse_Tampon.[Cadre HS]
	,Analyse_Tampon.Affaissement
FROM (
	TRANSFORM Count(Defaut_radier) AS CompteDeDefaut_radier SELECT Type_Ouvrage & Id AS Ouvrage
		,[Annomalies presentes].Localisation
		,[Annomalies presentes].effluent
	FROM (
		SELECT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_radier_1 AS Defaut_radier
		FROM [Annomalies presentes]
 
		UNION ALL
 
		SELECT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_radier_2 AS Defaut_radier
		FROM [Annomalies presentes]
 
		UNION ALL
 
			SELE CT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_radier_3 AS Defaut_radier
		FROM [Annomalies presentes]
		)
	GROUP BY [Annomalies presentes].Type_Ouvrage
		,[Annomalies presentes].Id
		,[Annomalies presentes].Localisation
		,[Annomalies presentes].effluent
	PIVOT Defaut_radier IN (
			"Racines"
			,"Raccordement défectueux"
			,"Radier dégradé (fissure, cassure)"
			,"Abrasion,corrosion"
			,"Jonction cunette / banquette non étanche"
			,"Dépots"
			,"Autre"
			);
	INNER JOIN TRANSFORM Count(Defaut_cheminee) AS CompteDeDefaut_Cheminee
	SELECT Type_Ouvrage & Id AS Ouvrage
		,[Annomalies presentes].Localisation
		,[Annomalies presentes].effluent
	FROM (
		SELECT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_cheminee_1 AS Defaut_cheminee
		FROM [Annomalies presentes]
 
		UNION ALL
 
		SELECT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_cheminee_2 AS Defaut_cheminee
		FROM [Annomalies presentes]
 
		UNION ALL
 
		SELECT Id
			,Type_Ouvrage
			,Localisation
			,effluent
			,Defaut_cheminee_3 AS Defaut_cheminee
		FROM [Annomalies presentes]
		)
	GROUP BY [Annomalies presentes].Type _Ouvrage
		,[Annomalies presentes].Id
		,[Annomalies presentes].Localisation
		,[Annomalies presentes].effluent
	PIVOT Defaut_cheminee IN (
			"Couronne décalée"
			,"Couronne cassée, fissurée"
			,"Virole cassée, fissurée"
			,"Branchement défectueux"
			,"Racines"
			,"Infiltration"
			,"Dégradation H2S"
			,"Trace de mise en charge"
			,"Autre"
			);ON Analyse_Radier.Ouvrage = Analyse_Cheminee.Ouvrage
	)
INNER JOIN
 
TRANSFORM Count(Defaut_Tampon) AS CompteDeDefaut_Tampon
 
SELECT Type_Ouvrage & Id AS Ouvrage
	,[Annomalies presentes].Localisation
	,[Annomalies presentes].effluent
FROM (
	SELECT Id
		,Type_Ouvrage
		,Localisation
		,effluent
		,Defaut_tampon_1 AS Defaut_Tampon
	FROM [Annomalies presentes]
 
	UNION ALL
 
	SELECT Id
		,Type_Ouvrage
		,Localisation
		,effluent
		,Defaut_tampon_2 AS Defaut_Tampon
	FROM [Annomalies presentes]
 
	UNION ALL
 
	SELECT Id
		,Type_Ouvrage
		,Localisation
		,effluent
		,Defaut_tampon_3 AS Defaut_Tampon
	FROM [Annomalies presentes]
	)
GROUP BY [Annomalies presentes].Type_Ouvrage
	,[Annomalies presentes].Id
	,[Annomalies presentes].Localisation
	,[Annomalies presentes].effluent
PIVOT Defaut_Tampon IN (
		"Tampon/grille cassé, fissuré"
		,"Infiltration"
		,"Cadre décalé"
		,"Cadre non scellé"
		,"Cadre HS"
		,"Affaissement"
		,"Autre"
		);ON
 
Analyse_Cheminee.Ouvrage = Analyse_Tampon.Ouvrage;