Home
Home

--- Soumis par Michel Walsh ---

Noms constants de colonne et "crosstabs" 

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'un 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:

Debug.Print DAO_MakeSQLCoverQueryFor("FieldName", "TableName", "CrosstabName")

'   ******** Code Start ********
Public Function DAO_MakeSQLCoverQueryFor(TableName As String, _
                            FieldName As String, _
                            XTableName As String) As String
'   XTableName = nom de la requête crosstab
'   TableName = nom de la table fournissant le pivot
'   FieldName = nom du champ utilisé comme pivot
Dim W As String     ' le texte SQL recherché
Dim i As Long       ' séquence de champ (F1, F2, ...)
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)
    ' trim last ", "
    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)
    ' un curseur de type Firehose est suffisant pour la circonstance.
    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)
    ' se débarassé du dernier ", "
    W = "SELECT " & W & " FROM " & XTableName & ";"
    rst.Close
    Set rst = Nothing
    MakeSQLCoverQueryFor = W
End Function
'   ******** Code End ********

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") & .