Menu

CHAMP CALCULE CONDITIONNEL ACCESS [Résolu/Fermé]

Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
- - Dernière réponse :  Siroua - 2 avril 2008 à 20:21
BONJOUR,
J'ai besoin , dans un formulaire de base de donée ACCESS 2000 que la valeur d'un contrôle RESULTAT affiche le résultat d'une soustraction correspondant à diffrénce entre la valeur de deux autres contrôle A, B de telle sorte que :
SI (A-B) <0 RESULTAT =0
SI (A-B) >=0 RESULTAT = le montant de cette différence
SI (A-B)=A ( c'est à dire si B=O) qu'une 3émé condition soit vérifié du style C<> NULL POUR AFFICHER RESULTAT = A
SI C= NULL RESULTAT doit rester à O.
Cela peut paraître simple mais je piétine, pouvez-vous m'aider, dois-je créer une macro avec variable ou une procédure évenementielle pour le contrôle RESULTAT ou ???
Merci de vos éventuelles idées sur la question , exemples bienvenus.
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
23909
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2630
9
Merci
Salut,

alors moi je ne passe pas par un champ de precalcul (c'est totalement inutile).

Je te propose la chose suivante :

Tu crées un formulaire "Formulaire1" avec 4 contrôles de type texte dedans (nommés A, B, Date_Sortie, Resultat)

Tu crées un module (dans la fenêtre base de données) avec ce code-là :
Public Sub MajResu()
Dim ValA As Long
Dim ValB As Long
Dim Diff As Long
If IsNull(Forms!Formulaire1.Controls("A").Value) Then
    ValA = 0
Else
    ValA = Val(Forms!Formulaire1.Controls("A").Value)
End If
MsgBox ValA
If IsNull(Forms!Formulaire1.Controls("B").Value) Then
    ValB = 0
Else
    ValB = Val(Forms!Formulaire1.Controls("B").Value)
End If
MsgBox ValB
Diff = ValA - ValB
MsgBox Diff
If Diff < 0 Then
    Forms!Formulaire1.Controls("Resultat").Value = 0
    Exit Sub
End If
If Diff >= 0 Then
    Forms!Formulaire1.Controls("Resultat").Value = Diff
    Exit Sub
End If
If ValB = 0 Then
    If IsNull(Forms!Formulaire1.Controls("Date_Sortie").Value) Then
        Forms!Formulaire1.Controls("Resultat").Value = 0
    Else
        Forms!Formulaire1.Controls("Resultat").Value = Diff
    End If
End If
End Sub

Ensuite, il ne reste plus qu'à affecter du code dans la propriété "après maj" des trois premiers contrôles en mettant un appel à la sous-procédure MajResu définie dans le module :
Private Sub A_AfterUpdate()
MajResu
End Sub

Private Sub B_AfterUpdate()
MajResu
End Sub

Private Sub Date_Sortie_AfterUpdate()
MajResu
End Sub


Comme ça, dès que tu saisis qq chose et que le focus passe sur un autre champ, on recalcule...

Mais comme ton algorithme n'est pas en phase avec les exemples que tu m'as proposés, j'ai fait en fonction de l'algo, à toi de voir ce qu'il faut modifier en fonction de tes besoins...

Dire « Merci » 9

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42202 internautes nous ont dit merci ce mois-ci

Messages postés
23909
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2630
3
Merci
Salut,

selon moi, il ne faut rien mettre pour RESULTAT, puisqu'il dépend du reste.

Il faut donc attacher du code à la propriété 'sur changement' de chaque champ et recalculer la valeur de RESULTAT à chaque fois...

Dans le genre :

controle_A_surchangement :

récupérer la valeur de a,b,c
calculer RESULTAT
affecter RESULTAT à la valeur du controle RESULTAT

controle_B_surchangement :

récupérer la valeur de a,b,c
calculer RESULTAT
affecter RESULTAT à la valeur du controle RESULTAT

Ce qui veut dire que tu auras la même procédure dans chaque contrôle, tu as donc intérêt à créer un module public appelable depuis les deux contrôles, comme ça, tu n'écris le code qu'une seule fois...
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
3
Merci
BLUX, tout d'abord merci de ton aide. Mais comme je ne maîtrise pas VBA ; j'ai, pour recueillir RESULTAT inséré sur mon formulaire un contôle indépendant que je nomme PRECALCUL qui me donne la valeur calculée de A-B.

C'est cette valeur qui est positive négative ou qui doit devenir égale à O en fonction d'une condition du style C<> NULL( en fait l'inscription d'une date dans un contrôle nommé DATESORTIE).
EX A= 50000 B=null bien que PRECALCUL AFFICHE -50000 ? Nn'ayant pas de date de sortie la valeur RESULTAT DOIT ETRE 0.
SI il y a une DATESORTIE la valeur RESULTAT DOIT ËTRE +50000 ET NON-50000.
je dois donc mettre du code pour que le contrôle RESULTAT QUI R2SULTE MAINTENANT D4UN CHAMP CALCULE RESPECTE LES CONDITIONS DE DEPART ;
ET JE NE SAIS PAS OU ENTRER CE CODE , dans le contrôle .
pourrais tu essayer sur un exemple simple avec un formulaire contenat un contrôle A, B, PRECALCUL ET RESULTAT .
MERCI d'avance de tes suggestions.
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
2
Merci
Cher BLUX,
Si tu as encore le courage de me lire , vu que je n’ai même pas été fichu de te donner un exemple correct dans mon précédent post .
Je précise ce que j’aimerais faire .
Sachant que pour l’exemple A ,B ,DATESORTIE , RESULTAT sont des contrôles correspondants aux champs de ma base de données ACCESS et que PRECALCUL est un contrôle de champ calculé.

Exemples de ce que je veux obtenir dans RESULTAT en passant par un contrôle

PRECALCUL = A-B (champ calculé qui récupère les valeurs du calcul afin de pouvoir les manipuler ensuite ,comme j’ai pensé que tu le suggérais ? ?).

A= 50000
B= null
DATESORTIE = NULL ( le contrôle de la date de sortie n’est pas rempli)
PRECALCUL = 50000
RESULTAT DOIT S’afficher O (CAR PAS DE DATE DE SORTIE)

A= 50000
B= 40000
DATESORTIE = 27/09/2005 ( par exemple)
PRECALCUL = 10000
RESULTAT DOIT S’afficher 10000

A= 50000
B= 0
DATESORTIE = 27/09/2005 ( par exemple)
PRECALCUL = 50000
RESULTAT DOIT S’afficher 50000

A= 50000
B= 60000
DATESORTIE = 27/09/2005 ( par exemple)
PRECALCUL = -10000
Mais RESULTAT DOIT S’afficher 0 car PRECALCUL EST NEGATIF.

A= 50000
B= 60000
DATESORTIE = null ( pas de date notée)
PRECALCUL = -10000
RESULTAT DOIT ETRE A 0
MSG box « DATE DE SORTIE DOIT ETRE INSCRITE POUR DONNER UNE VALEUR A B »
Ok
ANNULATION DE LA SAISIE DE B

Ce qui doit qui doit se résumer par mon post de départ :

SI (A-B) <0 RESULTAT =0
SI (A-B) >=0 RESULTAT = le montant de cette différence
SI (A-B)=A ( c'est à dire si B=O) qu'une 3émé condition soit vérifié du style C<> NULL POUR AFFICHER RESULTAT = A
SI C= NULL RESULTAT doit rester à O.


Merci d’avance .

PS : T’es pas parti au moins ?
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
2
Merci
Merci de m'avoir si gentiment aidé.
LES MESSAGES D'avertissement avec les choix OUI OU NON me demandant de confirmer la suppression des tables avant d'exécuter la requêta ction s'affichent toujours malgré les cases décochés dans les outils mais cela est peut-être inévitable .
random
Messages postés
1621
Date d'inscription
vendredi 26 novembre 2004
Statut
Membre
Dernière intervention
30 mars 2006
140 -
voir set warnings
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
1
Merci
bonjour,

Je constate que tu ne t'es pas sauvé et je t'en remercie vivement.
j'ai aménagé ta proposition avec l'algorythme ( partiel) que j'avais exposé.
J'ai enfin testé la dernière partie de ta proposition affectant une valeur à Diff en fonction de l'algorythme prévu , je me suis servi toutefois de l'outil PRECALCUL ( j'ai honte mais ça fonctionne)pour vérifier que le code que tu m'avais fourni était transposble.
Et je te rassures tout de suite il l'est donc : je l'ai essayé je vais l'adopter , car j'ai cru comprendre que ta solution était plus élégante et probablement plus efficace que mon bidouillage.

BRAVO pour le courage que tu as eu à me lire et encore merci;

.... Oserais-je....?
Pendant que j'y pense, en parlant d'élégance , j'ai des requêtes action pour établir des états et j'aimerais savoir comment éviter que s'affichent les avertissements du type :
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
1
Merci
.... Oserais-je....?
Pendant que j'y pense, en parlant d'élégance , j'ai des requêtes action pour établir des états et j'aimerais savoir comment éviter que s'affichent les avertissements du type :

" vous allez effectuer une requête création de table qui modifiera les données de votre table " puis " La table " " existante sera supprimée avant l'exécution de la requête , voulez-vous continuer"
etc....
car pour l'établissement d'un ETAT de RESULTAT , j'ai 3 requêtes de ce genre soit 9 fois à valider OK , et je ne te parles pas du critère de sélection que l'utilisateur doit écrire à la main.

Je croyais avoir vu comment faire dans de la doc mais pas moyen de retrouver .

MERCI ENCORE DE TA PATIENCE ET DE TON AIDE .
blux
Messages postés
23909
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
18 mars 2019
2630 -
Cela s'appelle les messages de confirmation, tu peux les désactiver dans le menu outils/options/éditer-rechercher

Mais il n'est peut-être pas à cet endroit en fonction de la version d'access sur laquelle tu travailles.

Cherche dans l'aide "messages de confirmation"...
Messages postés
27
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
2 septembre 2006
11
1
Merci
merci ramdom , je ne m'en souvenais plus ; sans cliquer 9 fois pour répondre ok à mon groupe de requêtes action : effectivement elle est belle la vie!
------------------------------------------------------------------
Afficher ou masquer des messages d'avertissement à l'aide d'une macro
Ouvrez une macro existante dans la fenêtre Macro.
Procédure

À l'endroit dans la macro où vous voulez interrompre ou reprendre l'affichage de messages d'avertissement modaux, exécutez l'action Avertissements.
Procédure

Pour interrompre temporairement l'affichage de messages d'avertissement, définissez l'argument Avertissements actifs sur Non. Pour réactiver leur affichage, définissez l'argument Avertissements actifs sur Oui.


Cliquez sur Enregistrer pour sauvegarder la macro.


Exécutez la macro.
Procédure

Lorsque l'exécution de la macro s'interrompt, l'affichage des messages d'avertissement est automatiquement réactivé.

------------------------------------------------------------------------
0
Merci
bonjour comment ça va , j'ai préparer une base de données access et j'ai un probleme pour les calcule j'ai créer un champ dans ma table on nsupose que s'appel Moyenne , est qu'il possible de faire des calcule dans la table sans créer une requete pour le calcule
j'attend votre réponse dans les brèves délais et merci pour vos aides
0
Merci
Bonjour,
Je suis entrain de faire un petite application access :
constituée de 5 table : Table client, table Transport, table portage, table hebergement, table materiel.
La table client est composé des champs suivants: Trans, Porta, Heber, Mate. je veux creer un formulaire Client avec ses 4 champs et chaque foiis que je clique sur un champs m'ouvre le formulaire correspondant par exemple le clique sur le champs Trans m'envoie vers un Form Trans, faire des calculs dans ce dernier et recuperer le resultat dans le champ Trans de mon formulaire principal.
Je suis debutant en access
merci d'avance pour tous ce qui me reponderont