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

VBA Access Discussion :

VBA - ADODB.Recorset.getrows - Erreur d'exécution 424 Objet requis


Sujet :

VBA Access

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut VBA - ADODB.Recorset.getrows - Erreur d'exécution 424 Objet requis
    Bonjour à tous,

    Je tente de comprendre la commande ADODB.Recordset.Getrows sur un recordset alimenté par une requête SQL SERVER.

    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
    Private Sub cmdODBCStoreProc_Click()
     
        Dim vRows As Variant
        Dim sFirstName As String
        Dim iRows As Integer
     
        Call mfADODBCnxOpen
     
        Set goADODBRset = New ADODB.Recordset
     
        sFirstName = ""
        'sFirstName = """Le Nom"""
     
        With goADODBRset
            Set .ActiveConnection = goADODBCnx
            .Source = "EXEC [SalesLT].[spOrder]  " & sFirstName
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
            .CursorLocation = adUseClient
            .Open
        End With
     
        iRows = goADODBRset.RecordCount
        MsgBox iRows
     
        'Set Forms("frmMain").Form.Controls("ctnrFrm2").Form.Recordset = goADODBRset
        Set Forms("frmMain").Form![ctnrFrm2].Form.Recordset = goADODBRset
     
        '********************************************************************************
        '
        '  Demonstration*of*the*Fields*Parameter*of*GetRows()
        '
        '********************************************************************************
     
        'Let's retrieve only the LastName Field in the rstEmployees Recordset
        vRows =  goADODBRset.GetRows(1,  , "LastName")
     
        'Let's retrieve only the 3rd Field ([Address]) in the rstEmployees Recordset
        varEmployees = rstEmployees.GetRows(rstEmployees.RecordCount, , 2)
     
        'Let's retrieve the [Address], [City], and [Region Fields by passing an Array of these Field Names as the Fields Parameter 
        vFieldNames = Array("CustomerID", "FirstName")
        vRows =  goADODBRset.GetRows(,  ,  avarFieldNames)
     
        goADODBRset.Close
        Set goADODBRset = Nothing
        Call mfADODBCnxClose
     
    End Sub
     
     
    Public Function mfADODBCnxOpen()
     
        Dim i  As Integer
        On Error GoTo Err_ 
     
        gsMsgErr = ""
     
        Set goADODBCnx = New ADODB.Connection
     
        With goADODBCnx
            .CommandTimeout = 15
            .Mode = adModeReadWrite
            .ConnectionString = ADODB_STRINGCNX
        End With
     
        goADODBCnx.Open    
    Exit_:
            Exit Function
    Err_:   
        gsMsgErr = Err.Number & Chr(13) & Err.Description
        GoTo Exit_
    End Function
    avec le code sur GetRows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     'Let's retrieve only the LastName Field in the rstEmployees Recordset
     vRows =  goADODBRset.GetRows(1,  , "LastName")
     
     'Let's retrieve only the 3rd Field ([Address]) in the rstEmployees Recordset
     varEmployees = rstEmployees.GetRows(rstEmployees.RecordCount, , 2)
     
     'Let's retrieve the [Address], [City], and [Region Fields by passing an Array of these Field Names as the Fields Parameter 
     vFieldNames = Array("CustomerID", "FirstName")
     vRows =  goADODBRset.GetRows(,  ,  avarFieldNames)
    Quand une ligne de code GetRows est exécutée alors il y a l'erreur suivante
    Erreur d'exécution '424' -Objet requis
    Nom : GetRows.png
Affichages : 234
Taille : 41,6 Ko

    Quelqu'un aurait une explication ?
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 132
    Points : 1 655
    Points
    1 655
    Par défaut
    Je n'ai pas resussi à reproduire ce comportements, cependant:
    Je pense que pour une raison quelconque, ta référence goADODBRset à "sauté", n'y a t'il pas une gestionnaire d'évènements qui interfère ?

    PS:
    Abandonne la notation hongroise, ca ne sert qu'a polluer ton code source.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Je n'ai pas resussi à reproduire ce comportements, cependant:
    Je pense que pour une raison quelconque, ta référence goADODBRset à "sauté", n'y a t'il pas une gestionnaire d'évènements qui interfère ?
    deedolith, tu avais raison, il semblerait que le goADODBRset n'était pas interprété comme un recordset. En le copiant collant juste depuis With goADODBRset pour le remplacer là où ca demandait un objet, ça a résolu le bug.

    Mais nouveau bug

    Nom : GetRows3.png
Affichages : 190
Taille : 21,3 Ko


    Bonjour deedolith


    Citation Envoyé par deedolith Voir le message
    PS:
    Abandonne la notation hongroise, ca ne sert qu'a polluer ton code source.
    J'adore ce pays, mais là tu m'as largué !
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 132
    Points : 1 655
    Points
    1 655
    Par défaut
    Citation Envoyé par informer Voir le message
    J'adore ce pays, mais là tu m'as largué !
    La notation hongroise consiste à ajouter un prefix aux noms de variables (g, o, s, str, i, l, frm ect .....) en fonction de leur type.
    Mais, un bon nom de variable doit avant tout nous renseigner sur son role, le type n'est important que pour le compilateur.
    De plus, les IDE proposent plein de façon pour connaître le type d'une variable.
    Donc, dans le nom de la variable, c'est superflu, redondant, et rend la lecture plus difficile.

    Garde bien en tête que le but premier d'un code source est d'être lu. Produire le comportement attendu n'arrive qu'en seconde position.

    Exemple concret:
    On désire stocker un chiffre.
    Que ce soit un octet (Byte), entier (integer), entier long (Long), chaine (String), on s'en fout !
    L'important est: Ca représente un chiffre.
    Une implémentation possible:

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Merci deedolith pour l'explication sur la notation hongroise

    Par. Notre une idée sur l'erreur gérée par GetRows ?
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 282
    Points
    34 282
    Par défaut
    Salut,

    est-ce que GetRows n'est pas considéré ici comme un objet, nécessitant un Set dans l'affectation ?

    Ton erreur n'apparait que sur la seconde occurence de ton objet, et pas sur la premiere, correct ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Bonsoir,
    Non GetRows retourne le recordset sous forme d'array

    Un GetRows positionne Eof à True!

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 282
    Points
    34 282
    Par défaut
    Salut,

    dans ce cas de figure, est-ce qu'après ton erase, il reste encore des données dans ton getrows ?

    Le fait de tenter le tout avec un EXEC dans SQL Server, ca peut expliquer ?

    Quel est exactement le but de ton code ici stp ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Bonjour Jean-Philippe,

    Mon objectif est de créer une requête générique pour ensuite récupérer les champs qui me sont nécessaires

    Si j'exécute un Getrows sans paramètres ---> OK
    Nom : Error3135Join.png
Affichages : 141
Taille : 171,9 Ko


    Si j'exécute un Getrows avec paramètres ---> NOK
    Nom : getRows_param_Nok.png
Affichages : 152
Taille : 33,3 Ko
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 282
    Points
    34 282
    Par défaut
    Salut,

    As-tu essayé un naïf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     vRows =  goADODBRset.GetRows(1,  , Array("LastName"))
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    981
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 981
    Points : 1 028
    Points
    1 028
    Billets dans le blog
    36
    Par défaut
    Merci pour ta suggestion Jean-Philippe mais toujours l'erreur 3421

    Et j'ai vérifié le recordset, il est correctement affecté car avec getRows() -> Ok
    Mal nommer un objet, c'est ajouter au malheur de ce monde, car le mensonge est justement la grande misère humaine, c'est pourquoi la grande tâche humaine correspondante sera de ne pas servir le mensonge
    Poésie 44, n° 17 - Albert Camus

    Mes réponses vous ont aidés, un clic sur leur pouce vert
    Bonjour chez vous

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/03/2022, 18h39
  2. [XL-2016] VBA / ADODB Recordset Count renvoi -1
    Par axis60 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 01/08/2018, 15h47
  3. Set statement Transact-SQL avec VBA (ADODB)
    Par Grom61736 dans le forum Général VBA
    Réponses: 0
    Dernier message: 09/12/2013, 16h35
  4. [VBA] Pb dans création d'un recorset
    Par le_niak dans le forum Access
    Réponses: 16
    Dernier message: 01/08/2006, 14h10
  5. [VBA-E]Connexion ADODB a une base de données
    Par nemesys971 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/03/2006, 17h08

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