Home
Home

---Soumis par Dev Ashish---

Concatener les valeurs d'un champ dans une table.

(Q)    Il me faut concaténer les valeurs uniques d'un champ particulier dans un format "Valeur1; Valeur2; Valeur3" etc. pour tous les enregistrements d' une table. Comment faire?

(A)    Utiliser la fonction  fConcatFld function,  sur la base de données Northwind, à partir de la requête suivante, nous retournera une liste de tous les CustomerIDs que nous regroupons par ContactTitle.

SELECT ContactTitle, fConcatFld("Customers","ContactTitle","CustomerID","string",[ContactTitle]) AS CustomersFROM CustomersGROUP BY ContactTitle;

'************ Code Start **********
Function fConcatFld(stTable As String, _
                    stForFld As String, _
                    stFldToConcat As String, _
                    stForFldType As String, _
                    vForFldVal As Variant) _
                    As String
'Retourne la valeur (unique) d'un champ par rapport
'à un autre champ dans la table,
'valeurs séparées par un point-virgule.
'
'Usage:
'   ?fConcatFld(("Customers","ContactTitle","CustomerID", _
'                "string","Owner")
'Où  Customers     = La table à utiliser
'       ContactTitle  = Le champ contre lequel on se compare
'       CustomerID    = Le champ fournissant les valeurs à concaténer
'       string        = Le DataType du champ contre lequel on se compare
'       Owner         = La valeur à laquelle on compare le champ à  comparer (ContactTitle)
'
Dim lodb As Database, lors As Recordset
Dim lovConcat As Variant, loCriteria As String
Dim loSQL As String
Const cQ = """"

    On Error GoTo Err_fConcatFld
    
    lovConcat = Null
    Set lodb = CurrentDb
    
    loSQL = "SELECT [" & stFldToConcat & "] FROM ["
    loSQL = loSQL & stTable & "] WHERE "
    
    Select Case stForFldType
        Case "String":
            loSQL = loSQL & "[" & stForFld & "] =" & cQ & vForFldVal & cQ
        Case "Long", "Integer", "Double":    'AutoNumber is Type Long
            loSQL = loSQL & "[" & stForFld & "] = " & vForFldVal
        Case Else
            GoTo Err_fConcatFld
    End Select
    
    Set lors = lodb.OpenRecordset(loSQL, dbOpenSnapshot)
    
    'Existe-t-il des enregistrements
    With lors
        If .RecordCount <> 0 Then
            'commencer la concaténation
            Do While Not .EOF
                lovConcat = lovConcat & lors(stFldToConcat) & "; "
                .MoveNext
            Loop
        Else
            GoTo Exit_fConcatFld
        End If
    End With
        
    'C'est tout... on possède la chaîne
    'ne reste qu'à enlever le dernier ;
    fConcatFld = Left(lovConcat, Len(lovConcat) - 2)


Exit_fConcatFld:
    Set lors = Nothing: Set lodb = Nothing
    Exit Function

Err_fConcatFld:
    MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description
    Resume Exit_fConcatFld
End Function
'************ Code End **********