none
[RESOLU]Trop peu de paramètres, 1 attendu RRS feed

  • Question

  • Bonjour,

    Je me casse la tête à essayer de trouver pourquoi je reçois ce message à l'exécution d'une requête SQL.

    J'utilise cette méthode couramment, je n'ai jamais eu ce problème !

    voici le code VBA qui construit la requête:

    Private Sub cboRech_Click()
        On Error GoTo cboRech_Click_err
        'but: selection Participants activités à partir des critères choisis
    
        Dim sqlWhere As String, sqlCond As String, sql As String, w As String, sqlselect As String, stLinkCriteria As String
    
        sqlselect = "INSERT INTO TTempParticip SELECT * from Tparticipant "
        w = " WHERE "
        sqlWhere = ""
        sqlCond = ""
    
        'vidage table TTempParticip
        EmptyList
        DoCmd.Close acForm, "FReportEvent", True
    
        ' ************  contrôle présence critères *********************
    
        ' Critère 1
        If cboAP = True Then
            sqlCond = "(MtPayé < 1)"
            If sqlWhere <> "" Then
                sqlWhere = sqlWhere & " AND " & sqlCond
            Else
                sqlWhere = sqlCond
            End If
        End If
    
        ' Critère 2
        If cboNP = True Then
            sqlCond = "(A_Participé = false)"
            If sqlWhere <> "" Then
                sqlWhere = sqlWhere & " AND " & sqlCond
            Else
                sqlWhere = sqlCond
            End If
        End If
    
        ' Critère 3
        If cbocode > 0 Then
            sqlCond = "(Code = cboCode)"
            If sqlWhere <> "" Then
                sqlWhere = sqlWhere & " AND " & sqlCond
            Else
                sqlWhere = sqlCond
            End If
        End If
    
    BuildSql:
    
        ' Build SQL Statement- si aucun argument, selection de toutes les lignes
        sql = sqlselect
        If sqlWhere <> "" Then
            sql = sql + w + "(" + sqlWhere + ");"
        End If
    
        'Get Info to this point, based on above criteria
    
        Me.Tag = RunSQL(sql)
    
        DoCmd.OpenForm "FReportEvent", , , stLinkCriteria
    cboRech_Click_Exit:
    
        Exit Sub
    
    cboRech_Click_err:
        MsgBox Error$, 64, "cboRech_Click"
    
    End Sub


    Si l'une ou l'autre des 2 premières conditions sont "true" (ou les 2), l'ordre SQL s'exécute bien, mais je reçois systématiquement le message d'erreur si la condition 3 est "true" avec ou sans les 2 autres conditions.

    Je précise que cboRech est le nom du bouton dans mon formulaire et cbocode est le nom du paramètre dans ce formulaire (au même titre que cboAP et cboNP.

    Voici le contenu de mon module BasSQL:

    Option Compare Database
    Option Explicit
    
    Function RunSql(strSQL As String) As Integer
    On Error GoTo RunSQL_TSB_ERR
      
      ' Comments  : Runs a SQL string on any database
      '             (the SQL string must be an non-row-returning action query)
      ' Parameters: strSQL - SQL string to execute
      ' Returns   : True if successful, False otherwise
      ' Stolen from FMS TSB
      
      Dim dbsTSchd As Database
      Set dbsTSchd = CurrentDb()
    
      'DoCmd SetWarnings False
      MsgBox "strSQL = " & strSQL
      dbsTSchd.Execute strSQL
    
      dbsTSchd.Close
    
      RunSql = True
    
    RunSQL_TSB_EXIT:
      
      Exit Function
    
    RunSQL_TSB_ERR:
      MsgBox Error$, 64, "RunSQL()"
      RunSql = False
      Resume RunSQL_TSB_EXIT
    
    End Function


    J'espère que l'un de vous pourra trouver l'explication.....

    Avec mes remerciements.




    vendredi 26 août 2016 14:31

Toutes les réponses

  • Bonjour,

    Déjà, pourquoi avoir réécris une fonction qui existe déjà, en l'occurence :

    RunSql ()

    Ce que je vous suggère pour localiser le champ manquant, c'est de :

    1. récupérer la chaîne de votre script SQL dans le debugger ;
    2. de la coller dans via leQBE (éditeur de requêtes) dans une nouvelle requête ;
    3. de visualiser ou d'exécuter selon le cas ;

    vous devriez comprendre l'erreur et la résoudre, car là, le SELECT * est pénaliant du fait que l'on ne peut savoir quel champ n'existe pas.


    Argy

    mardi 30 août 2016 11:45
    Modérateur
  • bonjour,

    Effectivement, j'ai procédé comme vous le proposez : l'erreur provient du champ cbocode du formulaire qui construit la commande sql. Ce cbocode est une liste déroulante

    Donc la requête que j'ai créée depuis la chaîne sql ne veut pas reconnaitre soit le champ cbocode, soit le formulaire. j'ai essayé :

    - ajouté une zone de texte que j'initialise depuis la liste déroulante (cbocode), ça ne marche pas.

    - créé un nouveau formulaire ne contenant qu'une zone de texte initialisée par une valeur fixe, ça marche.

    J'utilise pourtant fréquemment la valeur sélectionnée dans une liste déroulante comme paramètre et je n'ai jamais eu ce problème.

    En conclusion, je sèche !!!!!!!

    mercredi 31 août 2016 10:30
  • Bah en fait, quand vous insérez des données dans une table, il faut que le nombre de champs sources soit le même que le nombre de champs destination, même si le champ source n'existe pas, soit par exemple :

    INSERT INTO TableCible (Champ1, Champ2, Champ3)
    
    SELECT Champ1, Champ2, 'une valeur de champ qui n''existe pas !' AS Champ3 FROM TableSource

    Donc à vous de faire en sorte que la valeur du champ en question puisse être considérée comme valide ; typiquement, ce type d'erreur survient souvent lorsque la ou les valeurs d'une condition WHERE n'est pas correctement écrite...

    Exemple :

    Sub testErrer3061(ByVal LaValeur As String)
    Dim SQLInsert                                          As String
    Dim SQLSelect                                          As String
    
        SQLInsert = "INSERT INTO TableCible (Champ1, Champ2, Champ3) "
        SQLSelect = "SELECT  Champ1, Champ2, Champ3 FROM TableSource WHERE Champ3=" & LaValeur & ";"
        CurrentDb.Execute SQLInsert & SQLSelect, dbFailOnError
    End Sub

    Ici, LaValeur est le paramètre de type String pasé à ma procédure et n'est pas enquoté dans la clause SELECT avec des "" (Chr34) ou des '' (Chr39) ; du coup, l'erreur 3061 est levée.

    Il aurait fallut écrire :

        SQLSelect = "SELECT  Champ1, Champ2, Champ3 FROM TableSource WHERE Champ3='" & LaValeur & "';"


    Argy

    mercredi 31 août 2016 11:05
    Modérateur
  • Désolé, mais le problème n'est pas dans le nombre de champs du select et de l'insert (ici, ils sont strictement identiques)  mais dans le fait que la zone de texte de mon formulaire référencé dans la condition WHERE, n'est pas reconnue.
    mercredi 31 août 2016 11:25
  • Eh bien oui, c'est ce que je vous ai écrit.

    L'erreur 3061 survient en général et le plus souvent à cause d'une condition Where mal formatée ou dont l'un des champs est inexistant.

    A mon avis, c'est là que ça flanche :

    sqlCond = "(Code = cboCode)"

    que voulez-vous définir comme condition ici ?

    A la limite et ne connaissant pas votre appli, la logique voudrait que vous ayiez écrit :

    sqlCond = "Code = '" & Me!cboCode & "'"

    mais je n'en sauis rien car je ne suis pas devant votre appli....


    Argy

    mercredi 31 août 2016 13:44
    Modérateur
  • merci pour votre patience. Voici des précisions:

    Code est un champ de ma table TParticipant à partir de laquelle je fais le SELECT, il est défini en numérique entier long.

    cbocode est une liste déroulante de mon formulaire dont le contenu est SELECT [TEvent].[code], [TEvent].[type], [TEvent].[descrip], [TEvent].[dateDeb], [TEvent].[dateFin] FROM TEvent;

    Dans l'exemple que vous venez de citer, cbocode est considéré comme du texte donc incompatible avec le code de ma table.

    mercredi 31 août 2016 15:16

  • Donc c'est bien ce que je vous ai écris :
    ' Critère 3
        If cbocode > 0 Then
            sqlCond = "Code =" & Nz(Me!cboCode,0)
            If sqlWhere <> "" Then
                sqlWhere = sqlWhere & " AND " & sqlCond
            Else
                sqlWhere = sqlCond
            End If
        End If
    

    A ceci près, puisque vous l'avez enfin précisé, qu'il faut ôter les '' puisque c'est un Long



    Argy

    jeudi 1 septembre 2016 07:52
    Modérateur
  • Eh bien merci Argy, c'est tout à fait ça, ça marche très bien maintenant.

    J'ai encore beaucoup à apprendre ........

    jeudi 1 septembre 2016 08:05
  • Humm, je me suis un peu précipité...

    Pour éviter l'erreur 94, il faut modifier comme suit :

    ' Critère 3
        If Nz(Me!cboCode,0) > 0 Then
            sqlCond = "Code =" & Me!cboCode
            If sqlWhere <> "" Then
                sqlWhere = sqlWhere & " AND " & sqlCond
            Else
                sqlWhere = sqlCond
            End If
        End If
    Ravi de vous avoir aidé et que vous soyez parvenu à solutionner le problème


    Argy

    jeudi 1 septembre 2016 08:15
    Modérateur
  • merci pour cette précision, j'ai incorporé cette modif, mais j'avoue que je ne m'en serais pas sorti seul !
    jeudi 1 septembre 2016 08:51