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 :

intégration valeur recordset dans msgbox [AC-2002]


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut intégration valeur recordset dans msgbox
    Bonjour,

    Je débute complétement avec le VBA ... alors tentez d'être cléments si j'ai commis des erreurs grossières...

    Voici mon pb: je cherche à faire figurer dans le contenu d'un msgbox dans une procédure afterupdate d'une list box une variable que je tente d'appeler avec un recordset ( je ne sais pas très bien où le placer dans mon 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
    Option Compare Database
    Sub DAOOpenRecordset()
        Dim db As DAO.Database, rs1 As DAO.Recordset, fld As DAO.Field
        Dim SQL1 As String
     
        ' Ouverture de la base de données
        Set db = DBEngine.OpenDatabase(".\Nucléus.mdb")
        SQL1 = "SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));"
        ' Ouverture du recordset
        Set rs1 = db.OpenRecordset(SQL1, dbOpenForwardOnly, dbReadOnly)
        ' Fermeture du Recordset
        rs1.Close
        End Sub
     
     
     
    Private Sub type_contrat_AfterUpdate()
     
        Dim a, b As Integer
     
        a = SQL1
        b = 750 - 1
        If type_contrat = 1 Then MsgBox "Il vous reste à ce jour " & a & " ETP disponibles" Else MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
     
     
    End Sub
    En vous remerciant par avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Un tuto tout frais à lire, il correspond à ton cas : Résultats dans Labels, Zones de Texte ou MsgBox.

    Philippe

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Bonjour,

    Merci pour cette réponse... j'ai parcourru le tuto ... il me faut encore le comprendre... (pas gagné)

    Je reste partant pour un décriptage de mes erreurs de synthaxe....

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Re-bonjour,

    J'ai essayé d'appliquer ce que j'ai cru comprendre dans le tuto .... mais visiblement je bug

    voici mon nouveau code:

    1- pour mon module:
    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
    Option Compare Database
     
    Option Explicit
        Dim oDb As DAO.Database
        Dim oRst As DAO.Recordset
     
    Sub RechercheRS1()
     
     
         Dim rs1 As Integer     ' variable donnant le plafond ETP
    Set oDb = CurrentDb
     
        'Nous allons chercher la valeur du plafond d'ETP
        Set oRst = oDb.OpenRecordset("SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));", dbOpenSnapshot)
     
        'Nous appliquons le résultat affiché dans la colonne1 à la variable rs1
    rs1 = oRst.Fields(0)
     
    'Nous fermons les connexions (dans le cas d'une utilisation DAO)
        oRst.Close
        oDb.Close
        Set oDb = Nothing
        Set oRst = Nothing
     
        Exit Sub
    End Sub
    2- sur MAJ de ma ZL:
    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
    Option Compare Database
     
     
     
    Private Sub type_contrat_AfterUpdate()
     
    Call RechercheRS1
     
        Dim a, b As Integer
     
        a = rs1
        b = 750 - 1
        If type_contrat = 1 Then MsgBox "Il vous reste à ce jour " & a & " ETP disponibles" Else MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
     
     
    End Sub
    En vous remerciant par avance pour vos aiguillages...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir
    Si tu veux rester dans l'esprit du tuto, et si j'ai bien compris ton problème, il faut changer certaines choses:
    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
     
    Option Compare Database
    Option Explicit
        Dim oDb As DAO.Database
        Dim oRst As DAO.Recordset
     
    Sub RechercheRS1(Type as Boolean, b as Integer)
       Dim rs1 As Integer     ' variable donnant le plafond ETP
     
     If Type = True
        Set oDb = CurrentDb
     
        'Nous allons chercher la valeur du plafond d'ETP
        Set oRst = oDb.OpenRecordset("SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));", dbOpenSnapshot)
     
    'Nous appliquons le résultat affiché dans la colonne1 à la variable rs1
         If oRst.EOF Then
               MsgBox "Pas d'enregistrements"
          Else
               rs1 = oRst.Fields(0)
              MsgBox "Il vous reste à ce jour " & rs1 & " ETP disponibles"
     
              'Nous fermons les connexions (dans le cas d'une utilisation DAO)
              oRst.Close
              oDb.Close
             Set oDb = Nothing
             Set oRst = Nothing
         End if
    Else
     
    MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
    End if
    End sub
    Et sur l'appel de ta routine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      Dim b as integer  
      b = 750 - 1
    If Me.type_contrat.Value = 1 Then
            Call RechercheRS1(True, b)
        Else
            Call RechercheRS1(False, b) 
    End if
    Je pense que ce sera mieux.
    Par contre il faut être sûr que ta requête est bonne.(je n'ai pas regardé)
    Bon courage

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Bonjour Gayot,

    Merci pour cette correction de script... je viens de l'essayer et malheureusement un message d'erreur apparait :

    erreur de compilation:
    Attendu:identificateur

    A priori pb avec "Type"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub RechercheRS1(Type as Boolean, b as Integer)
       Dim rs1 As Integer     ' variable donnant le plafond ETP
     
     If Type = True
        Set oDb = CurrentDb

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour
    Autant pour moi:

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Merci, j'ai rajouté Then mais les lignes restent en rouge dans la fenêtre du module...

    De plus je ne sais pas s'il ya un lien ou pas, mais mes requêtes en mode création n'acceptent plus un critère du type comparaison avec Maintenant () ou Now()

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Je viens de supprimer tout mon code dans le module et sur MAJ et tout est revenu à la normal concernant les critères SQL de comparaison de date avec Maintenant().

    Bon, du coup, il faut se remettre à l'ouvrage pour trouver la bonne syntaxe de procédure....

    Si je reprends votre proposition Gayot, où dois-je être attentif ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Compacter je connais , mais pas compiler ... dois-je télécharger ACCESS MDE Compiler ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Pour compiler
    Alt +F11
    Débogage
    Compiler...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Après MAJ de ma Zl:

    Dans l'editeur de code, dans le module, apparait erreur de compilation ( attendu: identificateur) avec Type surligné et les lignes contenant "type" sont en rouge...
    Quand je clique sur l'aide, j'y trouve attendu: (divers) mais pas identificateur...

    Ceci dit, voici la fin de l'aide:

    Attendu : Variable. Il se peut, par exemple, que vous ayez utilisé des mots clés avec restrictions pour des noms de variable. Dans l'exemple suivant, l'instruction Input # attend une variable comme deuxième argument. Type étant un mot clé avec restrictions, il ne peut être utilisé comme nom de variable.
    Input # 1, Type ' Mot clé Type utilisé
    ' incorrectement comme nom de
    ' variable.

    Renommez la variable de façon à éliminer tout conflit avec les mots clés avec restrictions.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ah Ok: type est un nom réservé. Remplace le par un autre nom: Mavar par exemple.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    J'ai remplacé type par var cependant il manque un End If , où dois-je le placer ( deux bloc if , un seul end if) ?

    Autant pour moi , mon copie coller de ta procédure était tronqué... en fait ça marche très bien !

    Il me reste à ajouter d'autre variable selon la même méthode, puisque dans la msg on récupère un stock auquel il faut encore retrancher la consommation...

    En tout état de cause UN GRAND MERCI

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Puis-je abuser un petit peu et te demander une relecture du code du module que je viens de modifier pour aller chercher la valeur d'un second recordset qui viendra se soustraire au premier pour affichage dans la msgbox ?

    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
    Option Compare Database
    Option Explicit
        Dim oDb As DAO.Database
        Dim oRst As DAO.Recordset
     
    Sub RechercheRS1(var1 As Boolean, b As Integer)
     
       Dim rs1 As Integer     ' variable donnant le plafond ETP
       Dim rs2 As Integer       ' variable donnant la consommation d'ETP
     
     
     If var1 = True Then
        Set oDb = CurrentDb
     
        'Nous allons chercher la valeur du plafond d'ETP
        Set oRst = oDb.OpenRecordset("SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));", dbOpenSnapshot)
     'Nous allons chercher la valeur la conso d'ETP
        Set oRst = oDb.OpenRecordset("SELECT DISTINCT (([date_fin_contrat]-[date_debut_contrat])*[quotite_travail]/365) AS ETP FROM Table_annee_scolaire, Table_quotite INNER JOIN ((Table_categorie_contrat INNER JOIN Table_plafond_emploi ON Table_categorie_contrat.id_categorie_contrat = Table_plafond_emploi.id_categorie_contrat) INNER JOIN (Table_personnels INNER JOIN (Table_type_contrat INNER JOIN Table_recrutement ON Table_type_contrat.id_type_contrat = Table_recrutement.id_type_contrat) ON Table_personnels.id_personnel = Table_recrutement.id_personnel) ON Table_categorie_contrat.id_categorie_contrat = Table_type_contrat.id_categorie_contrat) ON Table_quotite.id_quotite = Table_recrutement.id_quotite WHERE (((Table_type_contrat.id_type_contrat)=1) AND ((Table_recrutement.date_debut_contrat)>=[Table_annee_scolaire].[date_debut]) AND ((Table_recrutement.date_fin_contrat)<=[Table_annee_scolaire].[date_fin]) AND ((Table_annee_scolaire.date_debut)<=Now()) AND ((Table_annee_scolaire.date_fin)>=Now()));
    ", dbOpenSnapshot)
     
     
    'Nous appliquons le résultat affiché dans la colonne1 à la variable rs1
         If oRst.EOF Then
               MsgBox "Pas d'enregistrements"
          Else
               rs1 = oRst.Fields(0)
               rs2 = oRst.Fields(0)
              MsgBox "Il vous reste à ce jour " & rs1 - rs2 & " ETP disponibles"
     
              'Nous fermons les connexions (dans le cas d'une utilisation DAO)
              oRst.Close
              oDb.Close
             Set oDb = Nothing
             Set oRst = Nothing
         End If
    Else
    MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
    End If
    End Sub
    Sachant que mon second SQL ramène toutes les valeurs d'un champ dont j'aimerai avoir la somme.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Et bien il semble que tu ais un problème sur ta variable oRst.
    Telle que tu l'as définie elle peut avoir deux valeurs et ne peut donc rien calculer.

    Il faut donc que tu en déclares 2. par exemple oRst1 et oRst2

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Merci, je l'avais présenti , je fais l'essai et te dis si c'est ok et .... c'est pas ok ( j'aurai été trop balaise si j'avais tout pigé du premier coup ..)

    Voici mon nouveau 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
    Sub RechercheRS1(var1 As Boolean, b As Integer)
     
       Dim rs1 As Integer     ' variable donnant le plafond ETP
       Dim rs2 As Integer       ' variable donnant la consommation d'ETP
     
     
     If var1 = True Then
        Set oDb = CurrentDb
     
        'Nous allons chercher la valeur du plafond d'ETP
        Set oRst1 = oDb.OpenRecordset("SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));", dbOpenSnapshot)
     'Nous allons chercher les valeurs de la conso d'ETP
        Set oRst2 = oDb.OpenRecordset("SELECT DISTINCT (([date_fin_contrat]-[date_debut_contrat])*[quotite_travail]/365) AS ETP" &
        "FROM Table_annee_scolaire, Table_quotite INNER JOIN ((Table_categorie_contrat INNER JOIN Table_plafond_emploi ON Table_categorie_contrat.id_categorie_contrat = Table_plafond_emploi.id_categorie_contrat INNER JOIN (Table_personnels INNER JOIN (Table_type_contrat INNER JOIN Table_recrutement ON Table_type_contrat.id_type_contrat = Table_recrutement.id_type_contrat) ON Table_personnels.id_personnel = Table_recrutement.id_personnel) ON Table_categorie_contrat.id_categorie_contrat = Table_type_contrat.id_categorie_contrat) ON Table_quotite.id_quotite = Table_recrutement.id_quotite" & _
        "WHERE (((Table_type_contrat.id_type_contrat)=1) AND ((Table_recrutement.date_debut_contrat)>=[Table_annee_scolaire].[date_debut]) AND ((Table_recrutement.date_fin_contrat)<=[Table_annee_scolaire].[date_fin]) AND ((Table_annee_scolaire.date_debut)<=Now()) AND ((Table_annee_scolaire.date_fin)>=Now()));", dbOpenSnapshot)
     
     
    'Nous appliquons le résultat affiché dans la colonne1 à la variable rs1
         If oRst1.EOF Or oRst2.EOF Then
               MsgBox "Pas d'enregistrements"
          Else
               rs1 = oRst1.Fields(0)
               rs2 = oRst2.Fields(0)   'Il faudait faire la somme de toute les valeurs du champ mais avec quelle commande ?
              MsgBox "Il vous reste à ce jour " & rs1 - rs2 & " ETP disponibles"
     
              'Nous fermons les connexions (dans le cas d'une utilisation DAO)
              oRst1.Close
              oRst2.Close
              oDb.Close
             Set oDb = Nothing
             Set oRst1 = Nothing
             Set oRst2 = Nothing
         End If
    Else
    MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
    End If
    End Sub

  18. #18
    Invité
    Invité(e)
    Par défaut
    S'il faut que tu fasses la somme des valeurs d'un champ ce n'est plus un simple Select qu'il te faut.
    Un peu de lecture: Il y un chapitre qui t'intéressera.
    http://starec.developpez.com/tuto/fonctionsdomaines/

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Encore une fois Mille Bravo

    ça fonctionne à merveille , pour info mon 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
    Sub RechercheRS1(var1 As Boolean, b As Integer)
     
       Dim rs1 As Integer     ' variable donnant le plafond ETP
       Dim rs2 As Variant       ' variable donnant la consommation d'ETP
     
       rs2 = DSum("ETP", "R_Asen_ETP_annee_n")   'Nous allons chercher les valeurs de la conso d'ETP
     
     If var1 = True Then
        Set oDb = CurrentDb
     
        'Nous allons chercher la valeur du plafond d'ETP
        Set oRst = oDb.OpenRecordset("SELECT Table_plafond_emploi.quantite FROM Table_plafond_emploi WHERE (((Table_plafond_emploi.id_categorie_contrat)=1) AND ((Table_plafond_emploi.date_début)<=Now()) AND ((Table_plafond_emploi.date_fin)>=Now()));", dbOpenSnapshot)
     
     
    'Nous appliquons le résultat affiché dans la colonne1 à la variable rs1
         If oRst.EOF Then
               MsgBox "Pas d'enregistrements"
          Else
               rs1 = oRst.Fields(0)
     
              MsgBox "Il vous reste à ce jour " & rs1 - rs2 & " ETP disponibles"
     
              'Nous fermons les connexions (dans le cas d'une utilisation DAO)
              oRst.Close
              oDb.Close
     
             Set oDb = Nothing
             Set oRst = Nothing
     
         End If
    Else
    MsgBox "Il vous reste à ce jour " & b & " contrats disponibles"
    End If
    End Sub
    Reste un tout petit détail: la msg box m'affiche un résultat avec x chiffres après la virgule , j'imagine qu'il existe une commande pour le limiter à 2 ?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 163
    Par défaut
    Bon tout est ok. Il fallait rajouter la définition du fromat au bon endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs2 = Format(DSum("ETP", "R_Asen_ETP_annee_n"), "0.00")
    Voilà, encore merci à tous ceux qui donnet un coup de main aux ames en peine de ce forum...

    Je clos.

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

Discussions similaires

  1. [AC-2003] Pb intégration valeur supplémentaire dans liste déroulante
    Par seballix dans le forum IHM
    Réponses: 2
    Dernier message: 01/10/2012, 12h21
  2. Transférer valeur d'un recordset dans un tableau
    Par chelmi95 dans le forum IHM
    Réponses: 7
    Dernier message: 02/05/2008, 17h44
  3. Valeur nulle dans un Recordset et boucle de décision
    Par agrosjea dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/07/2007, 13h01
  4. Réponses: 4
    Dernier message: 06/05/2007, 15h43
  5. Problème de valeur null dans un recordset
    Par Petzouille57 dans le forum Access
    Réponses: 3
    Dernier message: 19/05/2005, 12h27

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