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 :

syntaxe code avec where


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut syntaxe code avec where
    Bonjour,

    Lors de la création d'une base access de facturation (mes connaissances en VBA sont très limitées), j'ai eu besoin d'adapter à mon cas personnel une macro CreationFacture trouvée sur le net dont une partie du code ressemblait à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rstLigneNonFacture = CurrentDb.OpenRecordset("SELECT NomClient, NomProduit FROM LigneNonFacture WHERE " & _
                                                        "NomClient=""" & NomClient & """;")
    que j'ai adaptée à ma situation par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rstT_RendezVous = CurrentDb.OpenRecordset("SELECT NR, HoraireDebut, HoraireFin, ID_Client, TypeRdv FROM T_RendezVous WHERE " & _
                                                        "ID_Client=""" & ID_Client & """;")
    En lançant cette macro avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? CreationFacture(1, Date())
    j'obtiens le message d'erreur
    Type de données incompatible dans l'expression du critère
    Je suppose que la syntaxe utilisée après le WHERE n'est pas adaptée à un champ de type numérique.

    En bidouillant un peu la partie WHERE.... genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                                        WHERE " & _
                                                        "ID_Client='" & ID_Client & ";")
    j'obtiens un nouveau message d'erreur
    Erreur de syntaxe dans la chaîne dans l'expression "ID_Client=1';"
    Afin de passer ce premier cap (je suppose qu'il y en aura d'autres...), quelle serait donc la bonne syntaxe pour un champ numérique.

    Je tiens évidemment le code de la fonction complète à votre disposition si nécessaire.

    Merci d'avance pour le coup de main.

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    "ID_Client=1';" il restait une apostrophe en trop après le 1.

    le code correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rstT_RendezVous = CurrentDb.OpenRecordset("SELECT NR, HoraireDebut, HoraireFin, ID_Client, TypeRdv FROM T_RendezVous WHERE ID_Client = " & ID_Client & ";")
    si la variable ID_Client vient d'un formulaire, il est préférable de la préfixer avec Me. pour plus de lisibilité: WHERE ID_Client = " & Me.ID_Client &
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Suite code VBA
    Merci tee_grandbois, grâce à tes modifications (qui ne s'inventent pas...), je n'ai déjà plus ce message d'erreur.

    Mais je me doutais bien que ça n'allait pas s'arrêter là.

    Lorsque j'envoie le code, j'ai cette fois le message :
    Elément non trouvé dans cette collection
    Pour information, je souhaiterais que ce code alimente automatiquement les champs des tables T_Date_facture et T_DétailFactures à partir de la table T_RendezVous.

    En fichier joint, le détail des fichiers en question. Nouveau Document Microsoft Word (2).docx

    Le code complet actuel est le suivant :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Option Compare Database
    Option Explicit
     
    Public Function CreationFacture(ID_Client As Variant, Date_Facture As Date) As Long
     
        Dim wrkCurrent As DAO.Workspace
        Dim rstT_Date_facture As DAO.Recordset
        Dim rstT_DétailFactures As DAO.Recordset
        Dim rstT_RendezVous As DAO.Recordset
        Dim intId As Long
     
        On Error GoTo ErrorHandler
        Set wrkCurrent = DBEngine.Workspaces(0)
        CreationFacture = -1
     
        wrkCurrent.BeginTrans ' début de la transaction
     
        Set rstT_RendezVous = CurrentDb.OpenRecordset("SELECT NR, HoraireDebut, HoraireFin, ID_Client, TypeRdv FROM T_RendezVous WHERE ID_Client = " & ID_Client & ";")
     
        Set rstT_Date_facture = CurrentDb.OpenRecordset("T_Date_facture")
        Set rstT_DétailFactures = CurrentDb.OpenRecordset("T_DétailFactures")
     
     
        If Not rstT_RendezVous.EOF Then ' il y a des lignes non facturés pour ce client
     
            With rstT_Date_facture
                .AddNew
                .Fields("datefacture") = Date_Facture
                .Fields("ID_Client") = ID_Client
     
                intId = .Fields("ID_Date_facture") ' récupère le numéroAuto de la facture
                .Update
     
            End With
     
     
            With rstT_RendezVous
                .MoveFirst
                While Not .EOF
                    rstT_DétailFactures.AddNew
                    rstT_DétailFactures.Fields("ID_Date_facture") = intId
                    rstT_DétailFactures.Fields("NR") = .Fields("NR")
                    rstT_DétailFactures.Fields("HoraireDebut") = .Fields("HoraireDebut")
                    rstT_DétailFactures.Fields("HoraireFin") = .Fields("HoraireFin")
                    rstT_DétailFactures.Fields("TypeRdv") = .Fields("TypeRdv")
                    rstT_DétailFactures.Fields("NR") = .Fields("NR")
                    rstT_DétailFactures.Update
     
                .MoveNext
                Wend
            End With
     
        CreationFacture = intId 'le numéroAuto de la facture est retourné par la fonction, -1 si pas de création de facture
     
        ' ici, on devrait supprimer/marquer les enregistrements non facturés pour ne pas les facturer une 2ème fois
     
        wrkCurrent.CommitTrans ' tout s'est bien déroulé, on valide la transaction
        End If
     
        rstT_Date_facture.Close
        Set rstT_Date_facture = Nothing
        rstT_DétailFactures.Close
        Set rstT_DétailFactures = Nothing
        rstT_RendezVous.Close
        Set rstT_RendezVous = Nothing
     
        wrkCurrent.Close
        Set wrkCurrent = Nothing
        Exit Function
     
    ErrorHandler:
        wrkCurrent.Rollback ' erreur, la transaction est annulée, aucune table n'est modifiée
        MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description & vbCrLf & vbCrLf & _
                "impossible de créer la facture"
     
        rstT_Date_facture.Close
        Set rstT_Date_facture = Nothing
        rstT_DétailFactures.Close
        Set rstT_DétailFactures = Nothing
        rstT_RendezVous.Close
        Set rstT_RendezVous = Nothing
        wrkCurrent.Close
        Set wrkCurrent = Nothing
     
    End Function

    Je ne sais pas si je suis très clair mais à votre disposition pour compléter.

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Lorsque j'envoie le code, j'ai cette fois le message :"Elément non trouvé dans cette collection".
    sur quelle ligne d'instruction apparait l'erreur ?
    Merci de baliser ton code en utilisant l'icône # du menu message
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Je ne sais pas, rien ne semble l'indiquer

  6. #6
    Invité
    Invité(e)
    Par défaut
    ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Fields("datefacture") = Date_Facture
    à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Fields("date_facture") = Date_Facture

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci galoir et tee_grandbois,

    La situation est maintenant débloquée. Le code donne un résultat !

    Je vais l'analyser et je reviendrai vers vous.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Tout semble très bien fonctionner.

    Quelques améliorations à envisager :

    1) Le code génère un numéro facture ID_Date_facture différent pour chaque ID_Client, ce qui est déjà bien, mais l'idéal serait qu'en plus l'ID_Date_facture change chaque mois pour chaque ID_Client.

    2) Pour lancer le code, je l'exécute dans l'éditeur VBE du module avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? CreationFacture(X, Date())
    X correspond à un ID_Client.

    Alors comment s'écrirait cette commande pour lancer la facture de tous les ID_Client ?

    3) Il serait pratique aussi de pouvoir utiliser un bouton dans un des formulaires de la base qui déclencherait cette même commande.

    J'ai essayé d'y mettre le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Facturation_Click()
     
    ? CreationFacture(X, Date())
     
    End Sub
    mais ça ne marche pas.

    Merci d'avance pour vos conseils éclairés.

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Alors comment s'écrirait cette commande pour lancer la facture de tous les ID_Client ?
    une boucle sur un recordset basée sur la table client et à chaque enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call CreationFacture(orst.Fields("ID_Client"), Date())
    3) Il serait pratique aussi de pouvoir utiliser un bouton dans un des formulaires de la base qui déclencherait cette même commande.
    remplace le ? par Call
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Bonjour et merci tee_grand bois.

    Alors, quand j'exécute la commande dans l'éditeur VBE du module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call CreationFacture(orst.Fields("ID_Client"), Date())
    j'ai le message d'erreur "Objet requis"

    Je pensais qu'il suffisait de déclarer la variable en ajoutant en début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim oRst as DAO.Recordset
    mais j'obtiens le même message d'erreur.

    Question : Faut-il réécrire la totalité du code ?

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    Alors, quand j'exécute la commande dans l'éditeur VBE du module :call CreationFacture(orst.Fields("ID_Client"), Date())

    j'ai le message d'erreur "Objet requis"
    ben justement, il ne faut pas le faire, la fenêtre d'exécution c'est pour le développement et les tests.
    3) Il serait pratique aussi de pouvoir utiliser un bouton dans un des formulaires de la base qui déclencherait cette même commande.
    en plus tu as fait un mix de mes 2 réponses, car ma seconde réponse :
    remplace le ? par Call
    c'était pour :
    J'ai essayé d'y mettre le code :

    Private Sub Facturation_Click()

    ? CreationFacture(X, Date())

    End Sub
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Facturation_Click()
     
    Call CreationFacture(X, Date())
     
    End Sub
    Question : Faut-il réécrire la totalité du code ?
    oui, déclarations, affectation, lecture et appel du code dans la boucle ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Désolé tee_grandbois pour le cafouillage entre les 2 réponses.

    Je vais donc tenter de réécrire le code en conséquence, même si, tu l'auras compris, je ne suis pas un as ni des déclarations, ni de l'affectation, pas plus que de la lecture et encore moins de l'appel du code dans la boucle ...

    Mais je relève le défi et je te présenterai le résultat.

  13. #13
    Invité
    Invité(e)
    Par défaut
    call n'est pas utile si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CreationFacture X, Date()

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    En fait, en utilisant le code simplifié (merci galoir) j'ai juste écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Facturation_DblClick(Cancel As Integer)
    CreationFacture 1, Date
    CreationFacture 2, Date
    CreationFacture 3, Date
    End Sub
    Pas très pro mais cela fonctionne très bien. Inconvénient relatif, je devrai ajouter une ligne à chaque fois qu'un nouveau ID_client sera créé.

    Il me reste à régler la numérotation automatique des factures (attribuer un n° facture différent chaque mois pour chaque ID_Client), mais cela nécessitera sans doute l'ouverture d'un nouveau sujet ?

    Encore merci galoir et tee_grandbois.

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Pas très pro mais cela fonctionne très bien. Inconvénient relatif, je devrai ajouter une ligne à chaque fois qu'un nouveau ID_client sera créé.
    la boucle n'était pourtant pas compliquée. Si ID_client est dans le Recordset du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Facturation_DblClick(Cancel As Integer)
    Dim oRs As DAO.Recordset
    Set oRs = Me.RecordsetClone
     
    oRs.MoveFirst
    Do Until ors.EOF
        CreationFacture ors.ID_client, Date
        oRs.MoveNext
    Loop
    oRs.close
    End Sub
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Encore merci Tee_grandbois !

Discussions similaires

  1. syntaxe requete insert avec where
    Par maub85 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 18/01/2012, 09h03
  2. Comment linker avec odbc32.lib dans le code ? (avec gcc)
    Par _Audrey_ dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/11/2008, 17h40
  3. [Syntaxe] Requêtes avec null
    Par Procto dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/07/2005, 16h10
  4. Syntaxe incorrecte vers 'where'.
    Par lepeintre dans le forum ASP
    Réponses: 15
    Dernier message: 19/05/2005, 11h57
  5. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14

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