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 :

[VBA Recordset] erreur sur Set r = db.OpenRecordset


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Par défaut [VBA Recordset] erreur sur Set r = db.OpenRecordset
    Bonjour à tous,

    Je suis un ancien utilisateur d'Access 97. J'ai développé une seule application pour mon entreprise parce qu'il n'y avait pas d'autres besoins.
    Et depuis 10 ans, comme ils n'avaient pas de besoins particuliers,
    j'ai malheureusement moins pratiqué Access et j'ai donc perdu des notions.
    Je dirai donc que je suis d'un niveau moyen que je maîtrise relativement bien Access sauf les modules VBA.

    J'utilise des modules VBA si je ne peux pas faire autrement comme aujourd'hui.
    Ce code est tiré d'une petite application que j'avais vue en formation.

    Il sert à créer un numéro automatique de facture quand on lance l'impression des factures du mois.
    Sur la petite application utilisée en formation, il n'y a pas de message d'erreur et elle fonctionne bien.

    Par contre, dans mon application de facturation, j'ai fait la même chose et j'ai adapté les noms (table, requête, formulaire de saisie et état). J'ai simplement changé les noms dans la procédure numfacture pour adapter les noms de table, champs, requête, formulaire, et état.

    Mais j'ai le message d'erreur suivant :
    "Erreur d'exécution 3061.
    Trop peu de paramètres. 2 attendu."

    Cela se produit sur la ligne suivante du code de numfacture :
    Set r = db.OpenRecordset("Facture mensuelle malade", DB_OPEN_DYNASET)

    Voici le code de numfacture :
    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
    Function Numfacture()
    Dim db As Database
    Dim r As Recordset, s As Recordset, f As Form
    Dim suivnum As String, nouvnum As String
    Dim numero As Long
    Dim codecli1 As Long, codecli2 As Long
     
    Set db = DBEngine(0)(0)
    ' requête factures malades limité
    Set r = db.OpenRecordset("Facture mensuelle malade", DB_OPEN_DYNASET)
    ' état facture mensuelle malade
    Set s = db.OpenRecordset("facture mensuelle malade", DB_OPEN_DYNASET)
    ' formulaire pour choix de facture
    Set f = Forms![Choix_date_fact_perso]
     
    If Not s.EOF Then s.MoveLast
    suivnum = s!Numfacture
     
    If Mid(suivnum, 1, 4) = f!Année And Mid(suivnum, 5, 2) = f!Mois Then
        nouvnum = Mid(suivnum, 1, 6) & Format(Val(Mid(suivnum, 7, 3)) + 1, "000")
        numero = Val(Mid(nouvnum, 7, 3))
    Else
        nouvnum = Format(f!Année, "0000") & Format(f!Mois, "00") & "001"
        numero = 1
    End If
    f!test = nouvnum
     
    If Not r.BOF Then r.MoveFirst
        codecli1 = r!CodeClient
        codecli2 = 0
     
    On Error Resume Next
     
    Do While Not r.EOF
     
            If codecli1 <> codecli2 Then
            s.AddNew
            s!Numfacture = nouvnum
            s!Codecli = r!CodeClient
            s!Mois = Format(f!Mois, "00")
            s!Année = Format(f!Année, "0000")
            s.Update
            numero = numero + 1
            nouvnum = Format(f!Année, "0000") & Format(f!Mois, "00") & Format(numero, "000")
         End If
    	codecli1 = r!CodeClient
    r.MoveNext
    codecli2 = r!Codecli
    Loop
     
    End Function
    Je cherche en vain dans ma requête mais je ne trouve rien.
    Ce message indique une erreur de syntaxe au niveau du module ou une erreur dans ma requête, où il y a quelque chose qui ne va pas ?

    Je précise que ma requête est une requête sélection avec 2 paramètres qui récupèrent le mois et l'année dans le formulaire de choix (l'utilisateur doit saisir le numéro du mois et l'année pour lesquels il veut imprimer les factures).

    Cette requête fonctionne bien sans erreur et me donne bien les résultats quand je la lance manuellement.

    Une piste ? Sur la requête ou sur la syntaxe du module ?

    Merci d'avance.


    Gundt

  2. #2
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut
    Essaie avec des crochets :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Set r = db.OpenRecordset("[Facture mensuelle malade]", DB_OPEN_DYNASET)
    Sinon montre nous ton code SQL de requête, un paramètre doit être manquant.

    En espérant t'aider.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Par défaut
    Je viens d'essayer d'ajouter les [ et ] entre les " du db.OpenRecordset. Je l'ai écrit comme ceci :

    Set r = db.OpenRecordset("[Facture mensuelle malade]", DB_OPEN_DYNASET)

    Mais j'ai un autre message d'erreur à la place de l'autre :
    Erreur d'exécution 3078 :
    Le moteur de base de données microsoft Jet ne peut pas trouver la table ou la requête source "[Facture mensuelle malade]". Assurez-vous qu'elle existe et qu'elle est correctement orthographiée.

    Pourtant, elle existe bien. Je vous mets le code sql en dessous. J'ai vérifié l'orthographe y compris en respectant les majuscules, minuscules et espaces.

    Le code sql de la requête sélection est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCTROW FACTURES.Numfacture, FACTURES.Date_fact, [BL TEMP].DateSortie_temp, CLIENTS.Codeclient, CLIENTS.Nom, CLIENTS.Prénom, CLIENTS.Monsieur, Format([DateSortie_temp],"mm") AS Mois_sortie, Format([DateSortie_temp],"yyyy") AS Année_sortie
    FROM (CLIENTS INNER JOIN ((CDES INNER JOIN [BL TEMP] ON CDES.[N°Cde] = [BL TEMP].[N°Cde_temp]) INNER JOIN [LIGNES BL TEMP] ON [BL TEMP].[N°BL_temp] = [LIGNES BL TEMP].[N°BL_temp]) ON CLIENTS.Codeclient = CDES.CodeClient) INNER JOIN FACTURES ON CLIENTS.Codeclient = FACTURES.Codecli
    WHERE (((Format([DateSortie_temp],"mm"))=[Forms]![Choix_date_fact_perso]![Mois]) AND ((Format([DateSortie_temp],"yyyy"))=[Forms]![Choix_date_fact_perso]![Année]));

    Merci d'avance.

    Gundt

  4. #4
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut
    En VBA fais un debug.print de ta requête, et teste la dans le requêteur d'Access (directement le SQL sans passer par le nom de la requête).

    Vérifie aussi que le champ [Forms]![Choix_date_fact_perso]![Année] soit bien renseigné lorsque tu lance la requête.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 8
    Par défaut
    Euh, tu marques ceci (de ton précédent message) :
    "En VBA fais un debug.print de ta requête, et teste la dans le requêteur d'Access (directement le SQL sans passer par le nom de la requête).

    Mais comment fait-on debug.print d'une requête ?
    (J'ai regardé le menu Débogguer mais il n'y a pas print.)


    Vérifie aussi que le champ [Forms]![Choix_date_fact_perso]![Année] soit bien renseigné lorsque tu lance la requête.

    Oui, si je lance la requête mauellement que ce soit en sql ou en mode création, il me le demande bien et je saisis bien la réponse. Et ça marche.

    Dans mon formulaire de saisie, j'ai 2 champs de saisie : Mois et Année et 2 boutons Aperçu et Fermer.
    J'ai ajouté les lignes suivantes pour vérifier si le formulaire enregistrait bien les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MsgBox "avant code Numfacture"
            MsgBox (Val(.Mois))
            MsgBox (Len(.Mois))
            MsgBox (Val(.Année))
            MsgBox (Len(.Année))
    il m'affiche bien les résultats suivants :
    2
    2
    2007
    4

    J'ai ensuite rajouté dans le module vba le code suivant avant la ligne Set r = db.OpenRecordset("[Facture mensuelle malade]", DB_OPEN_DYNASET)
    pour vérifier que le module vba avait bien pris en compte la valeur des champs mois et Année du formulaire.
    Voici le code que j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MsgBox (Val(Forms![Choix_date_fact_perso]![Mois]))
    MsgBox (Len(Forms![Choix_date_fact_perso]![Mois]))
    MsgBox (Val(Forms![Choix_date_fact_perso]![Année]))
    MsgBox (Len(Forms![Choix_date_fact_perso]![Année]))
    Et il m'affiche bien :
    2
    2
    2007
    4
    si je tape 02 pour Mois et 2007 pour Année.

    Merci d'avance.

    Gundt

  6. #6
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut
    Mais comment fait-on debug.print d'une requête ?
    (J'ai regardé le menu Débogguer mais il n'y a pas print.)
    Je voulais dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print "SELECT ......."
    Puis tu regarde la requête dans la fenêtre d'exécution pour voir si c'est bien la requête que tu attends. Fais un copier coller dans le requêteur pour voir si elle renvoir les résultats attendus.

Discussions similaires

  1. VBA-E erreurs sur nb de col ou de lignes
    Par bernard38 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/10/2006, 22h55
  2. (VBA-E) Erreur sur ouverture de fichier
    Par Stutak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/08/2006, 15h11
  3. [VBA-E] Erreur sur le SaveAs
    Par truman dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/04/2006, 18h09
  4. [VBA-E]Erreur sur suppression d'images dans excel
    Par bernard38 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 18/04/2006, 13h55
  5. [VBA-E]Erreur sur méthode de classeur
    Par vanima dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 20/02/2006, 12h32

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