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

Access Discussion :

Erreur 3061 sur "OpenrecordSet" basé sur une requête SQL [AC-2007]


Sujet :

Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Erreur 3061 sur "OpenrecordSet" basé sur une requête SQL
    Bonjour
    Je travaille avec Access 2007.
    J’ai une requête « ListeConfNonLaval » qui utilise diverses tables de ma base pour produire par exemple le résultat suivant :
    ListeConfNonLaval
    VilleNonLaval DateEvenNonLaval ConferencierNonLaval
    BROSSARD 2014-09-12 Yoann Perez
    BROSSARD 2014-09-12 Yvon Legault
    BROSSARD 2014-09-25 Hélène Lamarche
    BROSSARD 2014-09-25 Jean-François Larose

    Je veux obtenir une autre table dont chaque enregistrement contiendra, pour chaque nom de ville et date, la concaténation des noms de conférenciers séparés par des virgules. Le résultat devrait être comme suit :
    ListeConfNonLaval_Concat3
    VilleNonLaval DateEvenNonLaval LesParticipants
    BROSSARD 2014-09-12 Yoann Perez, Yvon Legault
    BROSSARD 2014-09-25 Hélène Lamarche, Jean-François Larose

    J’ai trouvé la fonction « ConcatRelated” qui produit habituellement le résultat escompté. Voici le code :

    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
    Public Function ConcatRelated(strField As String, _
        strTable As String, _
        Optional strWhere As String, _
        Optional strOrderBy As String, _
        Optional strSeparator = ", ") As Variant
     
        On Error GoTo Err_Handler
        'Purpose:   Generate a concatenated string of related records.
        'Return:    String variant, or Null if no matches.
        'Arguments: strField = name of field to get results from and concatenate.
        '           strTable = name of a table or query.
        '           strWhere = WHERE clause to choose the right values.
        '           strOrderBy = ORDER BY clause, for sorting the values.
        '           strSeparator = characters to use between the concatenated values.
        'Notes:     1. Use square brackets around field/table names with spaces or odd characters.
        '           2. strField can be a Multi-valued field (A2007 and later), but strOrderBy cannot.
        '           3. Nulls are omitted, zero-length strings (ZLSs) are returned as ZLSs.
        '           4. Returning more than 255 characters to a recordset triggers this Access bug:
        '               <a href="http://allenbrowne.com/bug-16.html" target="_blank">http://allenbrowne.com/bug-16.html</a>
        Dim rs As DAO.Recordset         'Related records
        Dim rsMV As DAO.Recordset       'Multi-valued field recordset
        Dim strSql As String            'SQL statement
        Dim strOut As String            'Output string to concatenate to.
        Dim lngLen As Long              'Length of string.
        Dim bIsMultiValue As Boolean    'Flag if strField is a multi-valued field.
     
        'Initialize to Null
        ConcatRelated = Null
     
        'Build SQL string, and get the records.
        strSql = "SELECT " & strField & " FROM " & strTable
        If strWhere <> vbNullString Then
            strSql = strSql & " WHERE " & strWhere
        End If
        If strOrderBy <> vbNullString Then
            strSql = strSql & " ORDER BY " & strOrderBy
        End If
        Set rs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
        'Determine if the requested field is multi-valued (Type is above 100.)
        bIsMultiValue = (rs(0).Type > 100)
     
        'Loop through the matching records
        Do While Not rs.EOF
            If bIsMultiValue Then
                'For multi-valued field, loop through the values
                Set rsMV = rs(0).Value
                Do While Not rsMV.EOF
                    If Not IsNull(rsMV(0)) Then
                        strOut = strOut & rsMV(0) & strSeparator
                    End If
                    rsMV.MoveNext
                Loop
                Set rsMV = Nothing
            ElseIf Not IsNull(rs(0)) Then
                strOut = strOut & rs(0) & strSeparator
            End If
            rs.MoveNext
        Loop
        rs.Close
     
        'Return the string without the trailing separator.
        lngLen = Len(strOut) - Len(strSeparator)
        If lngLen > 0 Then
            ConcatRelated = Left(strOut, lngLen)
        End If
     
    Exit_Handler:
        'Clean up
        Set rsMV = Nothing
        Set rs = Nothing
        Exit Function
     
    Err_Handler:
        MsgBox "Erreur " & err.Number & ": " & err.Description, vbExclamation, "Fonction ConcatRelated()"
        Resume Exit_Handler
    End Function
    Voici comment je fais l’appel de cette fonction :
    Premièrement, je me crée une requête « ListeConfNonLaval_3 » qui produit le résultat simplifié suivant :
    ListeConfNonLaval_3
    VilleConf DateEven
    BROSSARD 2014-09-12
    BROSSARD 2014-09-25

    Je combine ensuite mes 2 requêtes citées précédemment (ListeConfNonLaval et ListeConfNonLaval_3) avec le code SQL suivant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT ListeConfNonLaval_3.VilleConf, ListeConfNonLaval_3.DateEven, ConcatRelated("[ConferencierNonLaval]","[ListeConfNonLaval]","[VilleNonLaval] = '" & [VilleConf] & "' AND [DateEvenNonLaval] = #" & [DateEven] & "#") AS LesParticipants 
    FROM ListeConfNonLaval_3 INNER JOIN ListeConfNonLaval ON (ListeConfNonLaval_3.VilleConf = ListeConfNonLaval.VilleNonLaval) AND (ListeConfNonLaval_3.DateEven = ListeConfNonLaval.DateEvenNonLaval);

    Mais lorsque j’exécute cette dernière requête, je reçois le message suivant : « Erreur 3061 : Trop peu de paramètres. 2 attendu. ». Ce message apparaît suite à chaque tentative d’exécution du code «Set rs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)».
    Si je mets un point d’arrêt sur cette ligne de code, je peux voir que le contenu de la variable « StrSql » est par exemple le suivant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT [ConferencierNonLaval] 
    FROM [ListeConfNonLaval] 
    WHERE [VilleNonLaval] = 'BROSSARD' AND [DateEvenNonLaval] = #2014-09-12#"

    Ce code me semble excellent car si je copie ce code dans une nouvelle requête et que je l’exécute, j’obtiens le résultat escompté, à savoir :
    Requête1
    ConferencierNonLaval
    Yoann Perez
    Yvon Legault

    Pourquoi cela ne fonctionne-t-il pas lorsqu’appelé par le code SQL? Quelqu’un peut-il m’aider à trouver ce qui ne va pas?
    Merci de votre aide.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant CRM
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Solution trouvée
    J'ai finalement résolu ce problème comme suit:
    Le résultat de la requête « ListeConfNonLaval » a été utilisé pour populer une "table" appelée LISTECONF. Par la suite, le processus reste le même mais en référant à la table LISTECONF plutôt qu'à la requête « ListeConfNonLaval ». Il semble bien que ce soit le fait de travailler avec de multiples résultats de requêtes qui engendrait l'incapacité pour la commande Openrecordset de s'y retrouver.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/05/2008, 18h11
  2. Réponses: 2
    Dernier message: 10/05/2008, 17h53

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