Déclencher une alerte avec Access

A l’ouverture de ma base de données, je souhaiterais qu’une alerte s’affiche pour me signaler les clients à rappeler, les tâches à faire dans la semaine, etc. Comment faire ?

Pour cet exemple pratique, on va partir d’une base Vidéoclub : des clients louent des vidéos… et sont supposés les ramener ensuite au vidéoclub 🙂 Cet article va vous montrer comment afficher automatiquement la liste des clients qui ont oublié de rendre leur vidéo.

Pour situer le contexte…

  • Nous disposons, entre autres, d’une table Clients et d’une table Locations, avec une relation de 1 à plusieurs entre les deux tables. D’autres tables (Vidéos et Films) sont liées aux locations, mais elles sont secondaires ici.
  • Lorsqu’un client loue une vidéo, on stocke dans tbl Locations la date de la location et la date de retour prévue (par exemple : le lendemain).
  • Lorsqu’un client ramène la vidéo, le retour est également validé. Pour cela, la table tbl Locations contient un champ Oui/Non nommé Retour validé. En d’autres termes, quand ce champ est coché, la vidéo a été ramenée ; sinon, la vidéo est encore en location.
  • En résumé : une vidéo est en anomalie lorsque la date de retour prévue est dépassée, ET que la case Retour validée n’est pas cochée.


Avec tout ça, on peut commencer la mise en place !

Etape 1 : construction de la requête

Il faut dans un premier temps extraire les clients qui n’ont pas ramené leur vidéo.

  1. Construisez une requête en mode Création, en partant des tables tbl Clients et tbl Locations, principalement.
  2. Placez les champs qui vous intéressent sur la grille de requête.
  3. Sous le champ Retour validé, tapez le critère Non.
  4. Sous le champ Date de retour, tapez un critère du style : < Date()
    Il y a bien anomalie si la date de retour est inférieure à la date du jour.
    Si vous souhaitez un certain niveau de tolérance (!), vous pouvez mettre un critère du style < Date() - 2 (vous laissez 2 jours de plus à votre client…).
  5. Passez en mode Feuille de données pour vérifier les résultats de la requête (pour vos tests, il est pratique d’avoir quelques locations en anomalie, ça facilite la construction du formulaire, au paragraphe suivant).
  6. Enregistrez votre requête (par ex. : rqt Vidéos non ramenées).

Etape 2 : construction du formulaire

Pour améliorer l’interface graphique, la requête ne doit pas apparaître directement à l’utilisateur final (et surtout, on pourra ajouter des boutons plus tard, pour déclencher des actions).
A l’aide de l’Assistant Formulaire, construisez un formulaire qui repose sur cette requête. Je passe ici les étapes de construction, il s’agit surtout de maquettage et ce n’est pas le sujet de l’article 🙂
On suppose dans ce qui suit que le formulaire est de type Tabulaire (appelé aussi « Formulaires multiples« ), et qu’il s’appelle frm Rappel Clients.

Etape 3 : ouverture automatique du formulaire

Maintenant que le formulaire fonctionne, il suffit de faire en sorte qu’il s’ouvre automatiquement avec la base de données. Vous avez plusieurs méthodes pour faire cela (notamment définir des options de démarrage, menu Outils / Démarrage). Au cas où vous auriez déjà un formulaire de démarrage (un formulaire de menu, par exemple), on va procéder autrement :

  1. Activez l’onglet Macros de la fenêtre Base de données.
  2. Créez une nouvelle macro.
  3. Dans cette macro, définissez une action OuvrirFormulaire, avec le paramètre Nom Formulaire = frm Rappel Clients.
  4. Enregistrez la macro en l’appelant précisément AutoExec (les majuscules ne sont pas importantes).
  5. Fermez complètement la base, puis rouvrez-la pour tester…
Info
Lorsqu’une macro s’appelle AutoExec, elle est exécutée automatiquement à l’ouverture de la base de données.

Etape 4 : les finitions

Il n’est pas utile que le formulaire de rappel s’ouvre lorsqu’il n’y a aucune anomalie (aucun client en retard). Voici une façon d’améliorer cela :

  1. Faites apparaître les propriétés du formulaire, onglet Evénement.
  2. Cliquez sur les points de suspension à droite de l’événement Sur ouverture, et choisissez Générateur de code.
  3. Faites en sorte que l’événement Sur ouverture (Form_Open) ressemble à ceci :

A partir de maintenant, si la requête ne renvoie aucune ligne, le formulaire ne s’ouvre plus. Même par un double-clic dans la fenêtre Base de données. C’est normal ! Par contre, vous pouvez toujours ouvrir le formulaire en mode Création, bien sûr.

Info
Notre formulaire comporte des boutons qui lancent des actions spécifiques. Le bouton Fermer peut être construit à l’aide de l’Assistant Bouton de commande (catégorie : Opérations sur formulaire, action : Fermer un formulaire). Pour les autres boutons, ce sera l’affaire d’autres articles sur le blog, patience !

Vous aimerez aussi...

20 réponses

  1. Youssef dit :

    bonjour Hervé,
    je vous remercie pour votre article qui m’a été d’un sécours capital!
    il marche parfaitement comme je le souhaite. j’y ai meme ajouter d’autres elements tels que l’alerte par mail qui marche égalment. Mais le seul hic, c’est lorsque la résultat de la requête contient plusieurs lignes, il ne prend en compte que le premier enregistrement.
    voice mon code:

    Private Sub Form_Open(Cancel As Integer)

    ‘ Annuler l’ouverture du formulaire de rappel
    ‘ si la requête qui l’alimente ne contient
    ‘ aucune ligne
    If Me.RecordsetClone.RecordCount = 0 Then
    Cancel = True
    Else
    Set Obj = CreateObject(« Outlook.Application »).CreateItem(0)
    With Obj
    .To = Me.Email
    .subject = « Vehicle Pass Expired:  » & Me.Registration &  »  » & Me.Plant_No
    .Body = « Hi,Your Vehicle Pass has expired! Please go to the security’s department to renew it »
    .Save
    .Send
    End With
    Set Obj = Nothing
    End If
    End Sub

    A vote avis, qu’est-ce qui manqué pour que le code prend en compte toutes les lignes ?

    Merci d’avance.

    • Hervé Inisan dit :

      Il faudrait faire une boucle sur tous les enregistrements de Me.RecordsetClone pour parcourir chaque enregistrement et envoyer un mail. J’imagine qu’il s’agit d’un mail différent pour un destinataire différent ?

  2. Vince69 dit :

    Oui j’aimerai un affichage « tout bête », j’ai une table congé avec date de début et de fin (entre autres), l’objectif serait que tous les salariés soient « en tête de ligne », et que les périodes de congé soient en couleur contrairement aux périodes travaillées. Comme vous l’avez dit, cela à l’air compliqué mais est ce que se serait lourd pour la base?
    Et (peu importe le poids) comment faire si c’est possible?
    J’ai vu des exemples de planning, mais qui m’avaient l’air peu adaptable..
    Encore merci de partagé vos connaissances 😀

    • Hervé Inisan dit :

      Ça ne sera pas particulièrement lourd pour la base, mais ça demande une mise en place.
      Avant de parler affichage, il faut modéliser les tables et leurs relations (l’affichage viendra ensuite, mais on n’aura pas nativement une forme d’agenda classique).

  3. Vince69 dit :

    Bonjour, je ne sais pas si il y a encore du monde sur ce site mais si c’est le cas, le code VBA que j’ai copié coller ne fonctionne pas. En effet, il n’y a pas de ligne dans ma requête, cependant celle-ci s’ouvre tout de même. Je ne connais pas le langage VBA, mais quand je fais débogage/Compiler, rien n’indique qu’il y a une erreur.

    Faut-il valider le VBA une fois saisie? Est il possible que l’application n’en tienne pas compte? et pourquoi si c’est cela?

    Merci d’avance 🙂

    • Hervé Inisan dit :

      Est-ce, ouverte manuellement, la requête affiche déjà des données ?

      • Vince69 dit :

        A vrai dire, ma macro est composer de 4 requêtes misent dans des formulaires (la macro ouvre donc les formulaire comme dans le tuto ci-dessus). Ouverte manuellement, les requêtes n’indique aucune ligne. Mais quand je lance ma base les formulaires vides s’ouvrent quand même.
        Je me demande si le VBA n’est pas désactiver (ou ne fonctionne pas), car sur d’autres tuto incorporant du VBA,quand je rentre des codes, rien ne se passe…

        • Hervé Inisan dit :

          VBA peut effectivement être désactivé : il y a alors une barre d’avertissement qui s’affiche au-dessous du ruban, à l’ouverture de la base (Access 2007 et plus).

          • Vince69 dit :

            Effectivement le VBA était désactivé donc sa marchai beaucoup moin bien du coup ^^
            Encore merci à toi.
            Et au passage même si ce n’est pas l’endroit exacte, est il possible de créer un planning simple facilement pour voir quand les salariés prennent leurs congés?

          • Hervé Inisan dit :

            Il y a 2 choses dans un planning : la gestion des données, et l’affichage.
            La première est relativement simple. Par contre, pour l’affichage, tout dépend du résultat souhaité (un affichage du type Agenda n’est pas simple nativement).

  4. Hervé Inisan dit :

    Daniel > Une requête SELECT servant à la mise à jour ne doit comporter qu’une table principale (avec tous ses champs sur la grille, de préférence), et éventuellement des tables secondaires liées (avec les champs complémentaires si nécessaire).

  5. Daniel dit :

    Bonjour. Je suis vraiment ravi de tous les outils et réflexions trouvés sur ce blog. J’ai essayé de construire une BDD sur le modèle proposé ici. Avec toutes tables et les relations. Mais lorsque j’essaie de renseigne les tables pour tester la requête, on me dit qu’il faut ajouter ou modifier l’enregistrement associé est requis dans l’ une ou l’autre des tables.
    Pouvez vous m’ envoyer un exemple bien conçu?
    Merci

  6. Hervé Inisan dit :

    Valérie > Est-ce qu’il y a un autre champ permettant de dire que l’opération est terminée ? Par exemple, un champ Oui/Non (comme Retour validé, dans mon scénario). Dans ce cas, il suffirait d’ajouter un critère sur ce champ pour exclure les lignes inutiles.

  7. Valérie dit :

    Bonjour,

    Merci pour l’article ci-dessus. Celui-ci m’est très utile. J’ai créé un rappel pour des distributions de dividendes avec le critère de requête suivant: <=DateAdd(« d »;30;Date())
    La formule fonctionne très bien. Néanmoins, une fois les dates dépassées, celles-ci restent affichées dans mon rappel. Qu’est-ce que je peux rajouter à ma requêtre pour que les distributions ne s’affichent plus à partir de J+1?

    Merci d’avance pour votre aide,

    Valérie

  8. Demba Badji dit :

    MERCI Mr Hervé

  9. Hervé Inisan dit :

    Hed > L’incohérence vient de la condition de ton Iif() : écrit comme cela, "Espace" désigne une chaîne de caractères. Donc tu compares du texte à une valeur numérique (1000). Il faut écrire [Espace] pour faire référence au champ Espace. Je suppose du coup que le champ Espace est de type Numérique.

    Ouala !

  10. Hed dit :

    Salut,

    Je trouve ce site fort utile, car simplifiant beaucoup et pour les debutants, y’a que ca de vrai! Le simple et concret.

    Je poste car j’ai un petit soucis dans l’utilisation de ma base de donnees. Etant dans l’industrie de l’immobilier je souhaite etablir une base de donnee ayant le nom des societes et la date de fin de leur contrat de location.

    Donc dans le tableau il y aura une colonne « Date de fin de contrat » ou il y aura des dates, mais aussi des cases ou rien ne sera rempli. (info inconnue)

    Et le but de cette base de donnee sur access c’est de beneficier de requetes qui, comme tu l’expliques, pourront me rappeler en un coup d’oeil ou j’en suis.

    Desole de rentrer en detail mais cela me semble necessaire, en fait il faut que je contacte les clients avant la fin de leur contrat donc ca marcherait un peu comme toi avec les videos sauf que j’irai dans le passe.

    La ligne de code que j’ai ecris c’est:
    IIf(« Espace »>1000,Date()-365,Date()-180)

    Ce qui se traduit dans mon esprit par si l’espace est plus grand que 1,000 metres carres je suis prevenu 365 jours avant et sinon 180jours avant.

    Le probleme c’est qu’il me dit qu’il y a une inconherence avec le type de donnees, et si j’ai bien compris c’est le fait que sur certaines cases de ma database il y a des cellules vides et la formule ne marche pas quand toutes les cases n’ont pas de valeur precise.

    J’espere avoir ete assez clair, merci par avance de votre aide.

    Hed.

  11. Ismael dit :

    Salut Hervé ! J’ai débuté sous Access il y a peu, et je dois dire que tes articles me sont d’une très grande aide.
    Merci de partager avec nous tes connaissances.
    Bonne continuation !

  12. Hervé Inisan dit :

    fred75 > Euh… je ne vois pas bien le lien entre l’article et la question 🙂 Mais pour ce qui est de la question : le traitement aller/retour tel que le fait Access 2007 en automatique suppose la transmission d’infos spécifiques dans l’en-tête du mail. C’est sûrement faisable de développer un équivalent pour d’autres versions, mais ça prendrait un peu de temps 😉

  13. fred75 dit :

    Bonjour,

    Cette procédure semble intéressante (et alléchante !).

    Je voudrais savoir si vous auriez une identique mais conçue pour Lotus Notes et Access 2000 ?

    Ce que je souhaiterais faire est envoyer des e-mails et, au retour, alimenter automatiquement les tables (à l’instar de ce que permet ACCESS 2007).

    Est-faisable ?

    Cordialement

    fred75

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *