IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Requete sur un champ multi-valeur [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut Requete sur un champ multi-valeur
    Bonjour,

    J'ai un champ (SFMEA_SafetyMecanismCSC) qui est défini comme multi-valeurs. J'ai une requête qui me liste bien les valeurs de ce champ (CSC001; CSC002)

    Je souhaite maintenant extraire lire ces valeurs en VBA pour créer un tableau de synthèse dans word.

    J'ai un code qui tourne bien sur tous les autres champs de ma requête sauf sur ce champ multi-valeurs.

    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
    Public Sub Test()
        Dim db                      As DAO.Database
        Dim rs                      As DAO.Recordset
        Dim SFMEA_Index             As String
        Dim SFMEA_SafetyMecanism    As String
     
        Set db = CurrentDb
        Set rs = db.OpenRecordset("Q_DFMEA_Mechanic") 'myTable is a MS-Access table created previously
        rs.MoveLast
        rs.MoveFirst
        Do While Not rs.EOF
            SFMEA_Index = rs!SFMEA_Index
            SFMEA_SafetyMecanism = rs.Fields("SFMEA_SafetyMecanismCSC").Value
            rs.MoveNext
        Loop
    End Sub
    J'aimerai que mon code me retourne la liste contenu dans le champ (SFMEA_SafetyMecanismCSC) qui sont les valeurs (CSC001; CSC002).

    Merci de votre aide!

    Note : Copie écran de la requete

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 923
    Points : 4 835
    Points
    4 835
    Par défaut
    Bonjour,

    utilise la fonction Split pour te retourner les valeurs de ta colonne multi-valuée :
    Exemple à intégrer dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    dim arrayMecanism as variant, i as integer
    ' array est un tableau déclaré en variant
     
     arrayMecanism = split(rs.Fields("SFMEA_SafetyMecanismCSC").Value,";")
    for i = 0 to ubound(arrayMecanism )
    debug.print trim(arrayMecanism (i))
    next i

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Merci Micniv pour la réponse.

    Malheureusement cela ne règle pas mon problème qui se situe au niveau du rapatriement des valeurs du champs multiple et non pas au niveau du traitement des valeurs.

    J'ai essayer la fonction Split, elle fonctionne bien pour le traitement d'un champ texte avec des séparateurs.

    J'ai un message d'erreur pour cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arrayMecanism = split(rs.Fields("SFMEA_SafetyMecanismCSC").Value,";")
    Ce qui compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arrayMecanism = rs.Fields("SFMEA_SafetyMecanismCSC")
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arrayMecanism = rs.Fields("SFMEA_SafetyMecanismCSC").Value
    Mais je ne sais pas comment traiter ni voir le contenu de ce variant...

    L'erreur pop ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 0 To UBound(arrayMecanism)
    Merci pour votre aide.

    Note : J'ai ajouté une micro DB avec le module et la requete qui bug...
    Fichiers attachés Fichiers attachés

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    C'est bon, j'ai trouvé une solution!

    Pour ne pas alourdir ma fonction principale j'ai créé une fonction pour traiter les champs multi-valeurs. Je ne vais pas vous donner une grande explication mais le code pour ceux que ça intéresse!

    Ma fonction principale sur laquelle je bloquais :
    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
    Public Sub Test()
        Dim db                      As DAO.Database
        Dim rs                      As DAO.Recordset
        Dim childRS                 As DAO.Recordset
        Dim SFMEA_SafetyMecanismCSC    As String
     
        Set db = CurrentDb
        Set rs = db.OpenRecordset("Q_DFMEA_Mechanic") 'myTable is a MS-Access table created previously
        rs.MoveLast
        rs.MoveFirst
        Do While Not rs.EOF
            Set childRS = rs!SFMEA_SafetyMecanismCSC.Value
            SFMEA_SafetyMecanismCSC = rsMultiValues(childRS)
            debug.print SFMEA_SafetyMecanismCSC
            rs.MoveNext
        Loop
    End Sub
    Et la fonction secondaire qui m'a permis de résoudre le problème :
    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
    Function rsMultiValues(childRS As DAO.Recordset) As String
        rsMultiValues = ""
        ' Exit the loop if the multivalued field contains no records.
        Do Until childRS.EOF
             childRS.MoveFirst
             ' Loop through the records in the child recordset.
             Do Until childRS.EOF
                 ' Print the owner(s) of the task to the Immediate
                 rsMultiValues = rsMultiValues & childRS!Value.Value & ";"
                 Debug.Print Chr(0), rsMultiValues
                 childRS.MoveNext
             Loop
         Loop
         'remove last separator
         rsMultiValues = Left(rsMultiValues, Len(rsMultiValues) - 1)
         Debug.Print Chr(0), rsMultiValues
    End Function
    En espérant que ceci pourra aider!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sur un champ contenant plusieurs valeurs
    Par ecarbill dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/01/2011, 14h06
  2. pb Requete sur un champ pas sur l'objet
    Par Meunier dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/09/2006, 14h24
  3. Requete sur un champ reference
    Par kirty dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/08/2006, 16h11
  4. Optimisation d'une requete sur un champ texte
    Par TARMINE dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h41
  5. requete sur un champs text
    Par sam01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo