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 :

Automatisme d'ajout après vérification dans la BDD


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Par défaut Automatisme d'ajout après vérification dans la BDD
    Bonjour à tous,

    Pour bien finir mon stage, j'aurais souhaiter faire en sorte que la dernière action manuelle qui me reste sur mon application soit automatisé.

    Il s'agit de vérifier au démarrage du formulaire Menu si un champ comporte déjà des valeurs dans la BDD pour le mois en cours.
    SI c'est le cas, ne rien faire et attendre le prochain mois, si ce n'est pas le cas, inviter l'utilisateur à les créer.
    Cette invitation doit durer les 7 premier jours du mois.

    J'avais écrit ceci mais je suis certain qu'il y à plein d'erreurs:
    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
     
    Private Sub form_load()
     
    ' On donne l'activité à une zone fantôme
    Call Me.txtDummy.SetFocus
     
     
     
    Dim DateMin As Date
    Dim DateMax As Date
    Dim DateAjout As Date
    Dim NombStat As Integer
    ' On va compter le nombre de lignes dans la table
        Dim fld As DAO.Field
        Dim rsc As DAO.Recordset
        Dim bd As DAO.Database
        Dim rvv As DAO.Recordset
     
    Set bd = CurrentDb()
    DateAjout = Now
    DateMin = DateSerial(Year(Date), Month(Date), 1)
    DateMax = DateSerial(Year(Date), Month(Date), 7)
     
    ' On constitue la requête qui choisi le champ à compter et à utiliser
        Set rsc = bd.OpenRecordset("SELECT count(NumTypStat) FROM TypeStatistique ", dbOpenForwardOnly, dbReadOnly)
    ' On incrémente jusqu'à la valeur maximum
        For Each fld In rsc.Fields
            NombStat = fld.Value
        Next
    ' On constitue la requête qui vérifie si les valeurs existent déjà
        Set rvv = bd.OpenRecordset("SELECT DateDebutStat FROM Statistique WHERE DateDebutStat BETWEEN '" & DateMin & "' AND '" & DateMax & "'", dbReadOnly)
     
    If rvv = "" Then
        If MsgBox("Souhaitez vous ajouter les statistiques pour ce nouveau mois?", vbYesNo) = vbYes Then
            ' On ajoute les statistique en fonction du résultat du calcul
        For i = 1 To NombStat
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO Statistique (NumTypStat, DateDebutStat) VALUES ('" & i & "', '" & DateAjout & "')"
            DoCmd.SetWarnings True
        Next i
        End If
    End If
     
     
    End Sub
    La 1er requête compte le nombre de NumTypStat dans ma table et retourne la valeur pour savoir combien il y à de insert into à faire par la suite.
    Normalement cette requête fonctionne encore puisque je l'avais essayer avant.

    Mon problème est la vérification des valeurs existantes pour la date.
    Je cherche à savoir si dans ma table, il y a au moins un seul enregistrement avec pour valeur de DateDebutStat le moi et l'année en cours.

    Si c'est le cas, ne rien demander mais si il n'y a pas la date correspondante, inviter à faire les insert into.

    Si vous avez des solutions, merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 415
    Par défaut
    Je suis sur qu'on pourrait faire cela en une seule passe avec une requête et une jointure mais ta solution n'est pas mauvaise non plus.

    Quelques suggestions :

    * Pour ton test

    je te suggère de le remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if rvv.recordcount=0 then
    car tester si un objet recordset est égale à une chaîne de caractères même si cela marche (as-tu exécuter ce code ?) ce n'est pas très propre.

    Attention avec RecordCount, si tu ne fais pas ObjetRecordset.movelast, recordcount renvoit 0 s'il n'y a pas d'enregistrement et 1 si il y a 1 ou des enregistrement. Si tu fais ObjetRecordset.movelast tu as alors le nombre exact d'enregistrements, ne pas oublier de faire un ObjetRecordset.movefirst après si tu veux lire le contenu des enregistrements.

    * Pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' On constitue la requête qui choisi le champ à compter et à utiliser
        Set rsc = bd.OpenRecordset("SELECT count(NumTypStat) FROM TypeStatistique ", dbOpenForwardOnly, dbReadOnly)
    ' On incrémente jusqu'à la valeur maximum
        For Each fld In rsc.Fields
            NombStat = fld.Value
        Next
    rsc ne devrait contenir qu'un seul enregistrement et un seul champ donc le for each fld est un peu 'over-killing'.

    Si tu copies ton SQL dans l'éditeur de requête tu vas voir le nom généré automatiquement par Access et tu devrais pouvoir l'utiliser en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomStat=rsc![NomDuChamp].
    * pour la sélection par date il suffit de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where format(Date(),"yyyy-mm")=format([DateDebutStat],"yyyy-mm")
    Cela va t'éviter d'avoir à calculer la date de fin de mois.

    * Quand tu as fini d'utiliser un objet Database ou Recordset il est conseillé de le fermer et de le désalouer explictement. Normalement Access s'en occupe mais c'est mieux si tu lui dit de le faire.

    donc j'ajouerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        rsc.close: set rsc=nothing
        rvv.close: set rvv=nothing
        bd.close:set bd=nothing
    avant le exit sub.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre confirmé Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Par défaut
    Merci pour l'aide détaillé, je essayer tout ça.
    Je te tiens au courant.

  4. #4
    Membre confirmé Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Par défaut
    Me revoilà.

    Alors pour ObjetRecordset.movelast, je n'en est pas l'utilité, si 1 seul enregistrement est trouver, c'est suffisant.
    Je n'ai pas besoin de savoir le nombre qu'il trouve.

    J'ai un problème avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where format(Date(),"yyyy-mm")=format([DateDebutStat],"yyyy-mm")
    Il me dit attente de séparateur de liste ou ). Il me place sur "yyyy"


    J'ai reussi à ne plus avoir d'érreur:

    Mais aucun résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        Set rvv = bd.OpenRecordset("SELECT DateDebutStat FROM Statistique WHERE DateDebutStat BETWEEN #" & DateMin & "# AND #" & DateMax & "#")
     
    If rvv.RecordCount = 0 Then
        If MsgBox("Souhaitez vous ajouter les statistiques pour ce nouveau mois?", vbYesNo) = vbYes Then
            ' On ajoute les statistique en fonction du résultat du calcul
        For i = 1 To NombStat
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO Statistique (NumTypStat, DateDebutStat) VALUES ('" & i & "', '" & DateAjout & "')"
            DoCmd.SetWarnings True
        Next i
        End If
    End If
    J'ai fait un pas à pas et j'ai constater que rvv.RecordCount prend pour valeur 1 alors qu'aucune date ne correspond au résultat trouver normalement.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 415
    Par défaut
    Essaye cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where format(Date();"yyyy-mm")=format([DateDebutStat];"yyyy-mm")
    normalement cela ne devrait pas être la bonne solution mais je n'en vois pas d'autre.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Ajout apres separateur dans un fichier
    Par trall dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2010, 11h35
  2. [Joomla!] Ajouter un user dans la bdd, problème cryptage
    Par Invité dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 06/11/2008, 13h09
  3. [MySQL] date nulle après minuit dans la bdd
    Par zendu36 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/10/2008, 15h18
  4. Réponses: 1
    Dernier message: 26/04/2008, 08h27
  5. Réponses: 2
    Dernier message: 17/04/2007, 12h44

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