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 :

Petit souci sous access 2007


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    administartion
    Inscrit en
    Avril 2017
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : administartion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2017
    Messages : 345
    Points : 135
    Points
    135
    Par défaut Petit souci sous access 2007
    bjr

    je suis novice....
    la question que je voudrez poser dans ce forum, j'ai deux champs à calculer avec un total et il me donne le reste du calcul jusque là c'est bon.

    exemple :
    Annuel=30 ; Reliquat=30 ; Total=60

    je consomme 10 de 60 ce que je veux en faisant une mise à jour automatique qui donnera Annuel=30 ; Reliquat=20 ; Total=50

    pour le même employé. je mets le fichier en pièce jointe merci de m'aider
    Images attachées Images attachées   

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Pour moi, utiliser des champs calculés dans une table est vraiment une fausse bonne idée. Voir ce post.

    Par ailleurs normalement ces champs calculés font des calculs en utilisant les valeurs des champs se trouvant dans le même enregistrement (la même ligne). Ce n'est vraiment pas évident de créer pour un champ calculé de table une formule qui reprend la valeur qui se trouve dans un autre enregistrement que l'enregistrement courant, ce qui est demandé pour le calcul du nouveau reliquat: Nouveau reliquat = ancien reliquat - durée nouveau congé pris.

    Bref, à mon avis, il faudrait:
    - supprimer les champs Durée, Annuel, Total, Reste, Total2 de la table Conges11,
    - le droit annuel devrait plutôt se trouver dans la table Agents (cette valeur restant quasi inchangée pour chaque agent),
    - avoir dans un formulaire une partie "nouveau congé" où sera calculée (par du code) la valeur du Reliquat,
    - la valeur du Reliquat sera augmentée du droit annuel quand il le faut (aussi dans cette partie "nouveau congé").

    Bonne continuation.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    En fait, il est recommandé, sauf problèmes de performance de ne pas enregistrer le résultat d'un calcul dans une table.
    Donc pour calculer ton reliquat, il est préférable de ne garder que les entrées et les sorties de produits et de faire la somme à la date voulue.
    Le problème des calculs "figés" dans les tables c'est que si un élément est "glissé" entre 2 étapes (par exemple en ajoutant un enregistrement directement dans la table sans passer par un formulaire), il est très possible qu'on oublie de refaire le calcul et que le résultat ne soit donc faux.

    Donc champ calculé reliquat dans une requête est égale à quelque chose comme Dsum("TonChampEntree";"TaTableMouvement";"[ClefMouvemnet]<=" & [ClefMouvement]) - Dsum("TonChampSortie";"TaTableMouvement";"[ClefMouvemnet]<=" & [ClefMouvement]).

    Le champ solde avant est : Dsum("TonChampEntree";"TaTableMouvement";"[ClefMouvement]<" & [ClefMouvement]) - Dsum("TonChampSortie";"TaTableMouvement";"[ClefMouvemnet]<" & [ClefMouvement]).

    Suppose que ClefMouvement augmente toujours et que les données sont entrées dans l'ordre des clefMouvement. Sinon, il faut revoir le critère de sélection en ajoutant par exemple la date de mouvement.

    Pour ce qui est des champs calculés dans les tables, personnellement j'ai fini par bien les aimés pour des choses comme présenter le nom et le prénom concaténé dans mes listes de sélection de personnes.
    J'ai aussi un champ calculé qui fait la somme de 12 % mensuels, Il me permet facilement de vérifier qu'elle est bien égale à 100.
    J'aurai pu le faire dans une requête mais cela m'a permis d'économiser un objet et c'est assez logique de le placer là.

    Un denier point à partir de 2010 on peut utiliser les macros de données (même si je ne les aime pas vraiment) pour faire les calculs de solde directement DANS la table.
    Et là même si quelqu'un entre un enregistrement directement dans la table le calcul se refera et les cumuls seront mis à jour.

    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.

  4. #4
    Membre habitué
    Homme Profil pro
    administartion
    Inscrit en
    Avril 2017
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : administartion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2017
    Messages : 345
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par EricDgn Voir le message
    Bonjour,

    Pour moi, utiliser des champs calculés dans une table est vraiment une fausse bonne idée. Voir ce post.

    Par ailleurs normalement ces champs calculés font des calculs en utilisant les valeurs des champs se trouvant dans le même enregistrement (la même ligne). Ce n'est vraiment pas évident de créer pour un champ calculé de table une formule qui reprend la valeur qui se trouve dans un autre enregistrement que l'enregistrement courant, ce qui est demandé pour le calcul du nouveau reliquat: Nouveau reliquat = ancien reliquat - durée nouveau congé pris.

    Bref, à mon avis, il faudrait:
    - supprimer les champs Durée, Annuel, Total, Reste, Total2 de la table Conges11,
    - le droit annuel devrait plutôt se trouver dans la table Agents (cette valeur restant quasi inchangée pour chaque agent),
    - avoir dans un formulaire une partie "nouveau congé" où sera calculée (par du code) la valeur du Reliquat,
    - la valeur du Reliquat sera augmentée du droit annuel quand il le faut (aussi dans cette partie "nouveau congé").

    Bonne continuation.
    .

  5. #5
    Membre habitué
    Homme Profil pro
    administartion
    Inscrit en
    Avril 2017
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : administartion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2017
    Messages : 345
    Points : 135
    Points
    135
    Par défaut
    Merci ERICdgn pour vos précieuses orientations ...je m'incline vers le pose proposé

  6. #6
    Membre habitué
    Homme Profil pro
    administartion
    Inscrit en
    Avril 2017
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : administartion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2017
    Messages : 345
    Points : 135
    Points
    135
    Par défaut
    bonjour Marot_r

    si j'ai bien compris .....

    TonChampEntree = Annuel
    TaTableMouvement = Table2
    ClefMouvemnet = ????? "est ce que c'est la clé primaire"

    TonChampSortie = Reliquat
    TaTableMouvement = Table2
    ClefMouvemnet = ????

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    J'ai supposé une architecture comme celle là :

    tblMouvement
    ClefMouvement (Clef primaire, autonum).
    NbEntree 'Nombre d'entrées
    NbSortie 'Nombre de sorties
    DateHeureMouvement (date/heure)

    Les autres informations (NbAvant, NbApre) sont calculées à partir de ces données dans une requête utilisée pour alimenter le formulaire.

    Ça donne quelque chose comme :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select tblMouvement.*, 
             DSum("NbEntree"; "tblMouvement"; "[ClefMouvement]<" & [tblMouvement].[ClefMouvement] & " and [DateHeureMouvement]<#" & format([tblMouvement].[DateHeureMouvement], "yyyy\-mm\-dd hh:nn:ss" & "#")
             -DSum("NbSortie"; "tblMouvement"; "[ClefMouvement]<" & [tblMouvement].[ClefMouvement] & " and [DateHeureMouvement]<#" & format([tblMouvement].[DateHeureMouvement], "yyyy\-mm\-dd hh:nn:ss" & "#") as NbAvant
             DSum("NbEntree"; "tblMouvement"; "[ClefMouvement]<=" & [tblMouvement].[ClefMouvement] & " and [DateHeureMouvement]<=#" & format([tblMouvement].[DateHeureMouvement], "yyyy\-mm\-dd hh:nn:ss" & "#")
             -DSum("NbSortie"; "tblMouvement"; "[ClefMouvement]<=" & [tblMouvement].[ClefMouvement] & " and [DateHeureMouvement]<=#" & format([tblMouvement].[DateHeureMouvement], "yyyy\-mm\-dd hh:nn:ss" & "#") as NbApres
    from TaTable

    J'ai ajouté le critère sur la date pour ne pas dépendre seulement de l'ordre de saisie des données.

    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. Imprimante sous Access 2007
    Par texas2607 dans le forum Access
    Réponses: 6
    Dernier message: 02/08/2007, 10h57
  2. crée un multi utilisateur sous access 2007 possible ou pas
    Par popofpopof dans le forum Sécurité
    Réponses: 0
    Dernier message: 22/07/2007, 19h32
  3. [Monthname] impossible sous access 2007
    Par Fredo02 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2007, 15h30
  4. Probleme de création nouvelle base sous ACCESS 2007
    Par choco95 dans le forum Sécurité
    Réponses: 3
    Dernier message: 10/07/2007, 08h09
  5. Pourquoi développez vous sous Access 2007 encore en beta ?
    Par Lou Pitchoun dans le forum Sondages et Débats
    Réponses: 22
    Dernier message: 25/01/2007, 12h12

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