Si quelqu'un désire des noms fixes pour les champs d'une requête de type
crosstab, l'utilisation de la propriété Column
Headings est toute désignée (depuis la vue en mode de
design). Vous entrez simplement les noms désirés, tel que "JAN",
"FEV", "MAC", "AVR", ... et si vous avez
effectivement entré MAC, vous n'obtiendrez aucune colonne MAR pour
Mars, mais vous obtiendrez une colonne MAC, probablement toute pleine de NULL.
Spécifier cette propriété, Column Headings, oblige la requête à produire
un champ pour chaque nom fourni, et ne fourni que ces champs.
Parfois, il n'est pas possible d'utiliser une chaîne fixe pour la
propriété Column Headings d'une requête de type crosstab parce que les
valeurs dans la table source, produisant le résultat de la requête crosstab,
sont changeant de fois en fois. Malheureusement, il y a des circonstances où
le nom "fixe" est requis, comme pour un formulaire, un graphique, un
état, ... ou pour une quelconque manipulation.
Une solution est alors d'utiliser une requête intermédiaire qui, elle,
fournira des noms constants au graphique, par exemple, à partir du résultat
de la requête crosstab:
SELECT XTab1 As F1, XTab2 As F2, ... FROM XTab;
où F1, F2, ... seront les noms "constants" et où XTab1
est un des champs générés par la requête.
Si vous assignez cet énoncé SQL à un "rowsource" pour un
formulaire, le formulaire peut alors utiliser les noms de champs constants,
F1, F2,...
Simple et facile.
Le problème qui demeure est de produire cette requête SQL, ou, à tout le
moins, la chaîne, le texte, formant cet énoncé. On ne peut traverser la
collection des champs produit par la requête, cela est tout simplement trop
onéreux de créer cette requête à cette fin seule. Par contre, le nom de
chaque champ généré est actuellement une VALEUR dans la table PIVOT.
Quoique le mot "pivot" peut évoquer dans votre esprit, pour la circonstance, disons qu'il ne s'agit que d'un mot de cinq lettres à repérer
dans la requête, dans sa vue SQL: vers la fin, on repère le mot PIVOT, un
peu comme:
.... PIVOT TableName.FieldName;
C'est alors des plus facile, le texte de la requête désirée
ie: SELECT XTab1 As F1, XTab2 As F2, ...
provient alors de l'un des deux programmes suivants (la seconde version ne
peut être utilisée que sous Access 2000), qui utilisent simplement une
concaténation ad hoc: On peut tester le résultat avec:
Debug.Print DAO_MakeSQLCoverQueryFor("FieldName", "TableName",
"CrosstabName")
Public Function DAO_MakeSQLCoverQueryFor(TableName As String, _
FieldName As String, _
XTableName As String) As String
Dim W As String
Dim i As Long
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT DISTINCT " & FieldName _
& " FROM " & TableName & ";")
rst.Move 0
W = ""
i = 1
Do Until rst.EOF
W = W & rst(FieldName) & " As F" & i & ", "
i = i + 1
rst.MoveNext
Loop
W = Left$(W, Len(W) - 2)
W = "SELECT " & W & " FROM " & XTableName & ";"
DAO_MakeSQLCoverQueryFor = W
End Function
Public Function MakeSQLCoverQueryFor(TableName As String, _
FieldName As String, _
XTableName As String) As String
Dim rst As ADODB.Recordset
Set rst = CurrentProject.Connection.Execute( _
"SELECT DISTINCT " & FieldName & " FROM " _
& TableName, , adCmdText)
rst.Move 0
W = ""
i = 1
Do Until rst.EOF
W = W & rst(FieldName) & " As F" & i & ", "
i = i + 1
rst.MoveNext
Loop
W = Left$(W, Len(W) - 2)
W = "SELECT " & W & " FROM " & XTableName & ";"
rst.Close
Set rst = Nothing
MakeSQLCoverQueryFor = W
End Function
Il ne reste plus qu'à changer le texte SQL de la requête désirée.
Maintenant, si l'énoncé SQL de votre requête crosstab possède un
énoncé différent pour le PIVOT du cas simple
PIVOT TableName.PivotName
vous modifiez la ligne du code:
"SELECT DISTINCT " & FieldName .
Par exemple, si l'énoncé SQL de la requête crosstab est
...PIVOT TableName.Format(FieldName, "mmm")
vous utilisez alors, dans le programme:
"SELECT DISTINCT " & Format(FieldName, "mmm") & .