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,
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 strSql = RQ_Anno_Radier() ... strSql = RQ_anomalie_Cheminee() ... strSql = RQ_Anomalie_tampon()
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
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
J'ai donc écrit le code ci dessous, qui ne marche pas, bien sur, car "Analyse_Cheminee" par exemple, n'existe pas.
Comment la créer à la volée lors du TRANSFORM ?, comment faire un join de mes 3 requêtes directement?
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
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;
Partager