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

Macros Access Discussion :

Je n'arrive pas à faire passer la valeur retournée par la fonction Environ() à la macrodonnée AfterUpdate [AC-2010]


Sujet :

Macros Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Je n'arrive pas à faire passer la valeur retournée par la fonction Environ() à la macrodonnée AfterUpdate
    Bonjour à tous,

    Habituellement, lorsque j'ai un problème, je surf un peu (ou beaucoup) sur ce forum et je fini par trouver une solution.
    Cette fois, malgré avoir cherché et recherché depuis (15 jours sur ce forum et d'autres) ainsi que sur les sites officiels de Microsoft, je reste collé.

    Voici dans quoi je me suis embarqué :

    J'ai une base de donnée dorsale, située sur un serveur, à laquelle on accède par une base frontale locale client ou admin selon le type d'utilisateur.
    Les tables de la dorsale sont donc des tables liées dans les frontales.
    Dans la dorsale, j'ai une table "inscription" sur laquelle je voudrais utiliser le trigger lors d'une mise à jour (par la macrodonnée AfterUpdate).
    Pour ce faire, j'ai une 3ème base (localisée ailleurs sur le serveur) dont les 2 tables (qui servent à enregistrer les modifs faites dans la table "inscription") sont des tables liées dans la dorsale.
    Jusque là tout va bien et le log se construit bien.

    Je voudrais pouvoir aussi enregistrer dans le log le nom d'utilisateur qui a modifié l'enregistrement de la table "inscription".
    Pour ce faire, je dois utiliser la fonction Environ(USERNAME).
    C'est là que ça se corse ( comme disait Napoléon) : la macrodonnée n'accepte pas l'utilisation de la fonction Environ()
    J'avais pensé utiliser le code vba beforeupdate() du formulaire utilisé pour la modif pour stocker la valeur retournée par environ() mais le hic c'est que si c'est un admin qui fait la modif il peut très bien l'avoir fait dans la table "inscription" directement ( d'où le choix d'utiliser le trigger).

    Alors voilà, je cherche donc une solution soit pour passer à la macro donnée la valeur reçue de Environ() soit la stocker quelque part pour pouvoir la récupérer la macrodonnée.

    Voilà un petit schéma pour tenter d'éclaircir les choses.

    Nom : bd.jpg
Affichages : 152
Taille : 38,0 Ko

    Je reste à votre disposition pour tout renseignement complémentaire.
    Je suis carrément perdu sur ce coup là alors toutes idées même là plus stupide ou saugrenue sera la bien venue pour me faire progresser.

    Je vous remercie d'avance pour le temps que vous voudrez bien me consacrer.

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Les macro de donnees acceptent les appels a toutes les fonctions publiques, je te propose la solution suivante


    la premiere des choses a faire est de tracer qui a fait le changement dans la table inscription, en y ajoutant le champ "LastModifPar"

    Dans un module client tu crees une function publique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function GetEnviron(TypeEnviron As String) As String
        GetEnviron = Environ(TypeEnviron)
    End Function
    Dans la table "Inscription' tu crees une macro de donnees "Before Change", (et non pas After Update)

    SetField: LastModifPar
    Value:GetEnviron("UserName")




    La deuxieme chose est de tracer l'information dans le log, pour ca tu ne peux pas utiliser exclusivement les macro de donnees, parceque ton log et ton inscription ne sont pas dans la meme base. (les macro de donnees ne fonctionnent pas entre tables liees)

    Dans un module tu peux creer une function publique de mise a jour du log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function CreateLog(TypeLog,... autres parametres...,LastModifPar as String) 
    Docmd.runsql "Insert into log etc...."
    End Function
    Dans la table "Inscription' tu crees une macro de donnees "After Update", et tu declenches la creation du log par la mise a jour d'une variable locale

    SetLocalVar:toto
    Value:CreateLog([TypeLog], ... autres parametres..., [LastModifPar])

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Access is good but accessisgood is very good :-)
    Un tout tout grand merci à toi accessisgood : j'obtiens le résultat escompté :-)

    Le point 1, je l'avais. Mais le gros truc auquel je n'avais pas pensé c'est d'utiliser la macro BeforeChange.

    la commande Docmd.runsql me donnait un message me demandant de confirmer l'ajout de l'enregistrement. Hors je voulais que ça tourne en stealth donc je l'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim query As String
    Dim db As DAO.Database
      query = "Insert into Evenement (EnregistrementEvenement,TableEvenement,TypeEvenement,UserEvenement) " & " Values ('" & RegEvent & "', '" & TblEvent & "', '" & TpEvent & "', '" & LastModifPar & "');"
    ' ---
    ' EXTRACTION DU DERNIER NUMEROAUTO ATTRIBUE
    ' ---
      Set db = CurrentDb
      db.Execute (query)
      CreateLogEvenement = db.OpenRecordset("SELECT @@IDENTITY")(0)
      ' On ferme !
      Set db = Nothing
    Ce qui me permet aussi de récupérer la valeur de la clé primaire du nouveau record pour pouvoir lui lier mes lignes de détail dans ma seconde table de log.

    En fait, c'était beaucoup plus simple que je ne le pensais, je ne cherchais juste pas dans la bonne direction. (pour tout dire j'avais même pensé à répliquer ou déclasser des fonctions intégrées ...)
    Encore un tout grand merci.
    PS : accessisgood >>si tu veux m'envoyer tes coordonnées par MP, je me ferai un plaisir de t'envoyer un petit coli gourmand pour te remercier... ;-)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/09/2009, 10h52
  2. Valeur retournée par une fonction
    Par defluc dans le forum Langage
    Réponses: 15
    Dernier message: 04/05/2009, 22h47
  3. Réponses: 2
    Dernier message: 11/04/2008, 22h58
  4. Réponses: 4
    Dernier message: 07/04/2007, 20h02
  5. valeur retournée par une fonction
    Par Biosox dans le forum C
    Réponses: 13
    Dernier message: 19/01/2007, 23h17

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