Champs calculés sous formulaires - ACCESS

Fermé
jaff - 3 août 2011 à 10:42
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 - 4 août 2011 à 11:14
Bonjour,

J'aurai besoin de votre aide !

Voila, j'ai mis des formules (addition et multiplication) sous un de mes sous formulaires. Ce sous formulaire est censé remplir la table qui en découle automatiquement. Un Etat est aussi généré à partir de ce sous formulaire. Seulement voilà, la table qui découle de ce sous-formulaire n'enregistre pas les champs calculés... de même pour l'Etat que je génère, les champs calculés apparaissent vides ...

Seriez-vous m'aider ?
Merci beaucoup !!!



3 réponses

Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
Modifié par Syzygy le 3/08/2011 à 13:57
Bonjour,

Je n'ai pas très bien compris un détail. Vos champs calculés se trouvent-ils dans votre sous-formulaire ou sont-ils situés dans votre formulaire ?

Par la même, s'il s'agit d'une simple fonction d'addition ou multiplication et que ce résultat doit juste être affiché dans un état ou un formulaire, il n'est pas nécessaire de le stocker. Vous pouvez recréer un champ calculé dans votre état/formulaire qui effectuera cette opération et affichera directement le résultat.

Si vous voulez vraiment stocker la valeur, il va falloir placer votre champ lié à la table dans votre formulaire et rajouter un peu de VBA pour réaliser le calcul. Toutefois, sans votre base, difficile d'être précis sur la démarche à suivre.

Bon après-midi
1
Re-Bonjour,

Mes champs calculés sont bien dans un sous-formulaire. Je souhaiterai stoker la valeur calculée dans une table ... seulement je ne m'y connais que très peu en VBA ...

Pour vous donner un peu plus de détail sur ma base :
J'ai un formulaire basé sur plusieurs tables et requêtes qui me donnent des informations sur des clients (Nom, contacts, adresse...). J'ai un sous-formulaires "devis". Ce sous formulaire est rattaché à la table "devis" qui stockent les données. Lorsque qu'on crée un nouveau devis, j'ai mis des champs calculés pour les totaux. mais ceci ne se stockent pas dans la table correspondante "devis". Je génère ensuite un Etat à partir de ce sous formulaire, un peu comme un devis près à être imprimé et envoyé.

je ne sais pas si je suis plus claire ... pas facile par écrit ! :)
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
3 août 2011 à 15:36
Re,

Effectivement, ces problèmes ne sont pas facile à expliquer par écrit, et la solution est toute aussi difficile à détailler ;-)

Avez-vous possibilité de mettre votre base dans un fichier zip et la déposer sur http://www.cijoint.fr et de retransmettre le lien ici (ou par message privé si vous ne voulez pas que cette base soit accessible par tous) ?

Si vous ne pouvez pas, pouvez-vous me confirmer que vous avez bien une table "Devis" (reprenant par exemple, un numéro, une référence client, un champ correspondant au montant du devis) et une table liée "Détail-devis" reprenant les différentes lignes stockées dans votre devis (par ex : références articles, prix unitaire, quantité...) ?
0
en fait je n'ai qu'une table "devis", je n'ai pas de table liée, excepté une table "facture".
j'ai réussi à mettre ma base sur cijoint : http://www.cijoint.fr/cjlink.php?file=cj201108/cijqUw3xTL.zip

Il faut regarder le formulaire "SUIVI" et l'onglet "DEVIS", qui se rattache donc à la table "DEVIS". j'ai mis un bouton sur ce sous-formulaire (avec un point d'exclamation) pour générer un Etat, qui s'appelle "GENERER UN DEVIS"...

Merci beaucoup de m'aider ! je ne demande qu'a apprendre :)
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
4 août 2011 à 00:59
Bonsoir,

Alors j'ai regardé votre base et j'ai trouvé la source du problème. Dans votre onglet devis le champ contenant le montant total de votre prestation est en champ calculé et de fait "indépendant". Il n'est pas relié au champ correspondant dans votre table. (idem pour les champs correspondant aux totaux des frais).

Si vous voulez que le calcul se fasse automatiquement et s'implémente dans votre base suivez les opérations suivantes :
- Dans l'onglet données sélectionnez la source de données "MONTANT PRESTATIONS" pour le champ portant le même nom.
- Sélectionnez ensuite le champ "QUANTITE (nombre d'untité)" puis cliquez sur l'onglet événement et ajouter une procédure événementielle sur l'événement "Sur perte focus"
Avec l'éditeur VBA, entrez le code suivant dans la procédure :
Me.[MONTANT PRESTATIONS] = Me.QUANTITE__nombre_d_untité_ * Me.PRIX_UNITAIRE

- Répétez l'opération avec le champ "PRIX UNITAIRE".

Le montant s'enregistrera ainsi lors de la validation de votre devis
Pour info, le mot "Me" en VBA représente (approximativement), l'objet dans lequel est exécuté le code. Dans votre cas de figure il s'agit du sous-formulaire "Devis"
Suivez le même procédé pour enregistrer les autres champs "Totaux".

J'en profite pour faire 2-3 remarques générales sur votre base :

- Si possible, il est préférable de bannir l'utilisation d'espace, de parenthèse, de guillemet, d'apostrophe dans le nom de vos champs. Cela ne vous apportera que des ennuis si vous allez plus loin en VBA.

- Concernant la table client, je n'ai pas compris pourquoi vous aviez mis le nom du client comme clé primaire. L'idéal serait de reprendre le numéro du client qui sera forcément un identifiant unique

- Concernant la table contacts, la clé primaire basée sur le nom et le prénom implique que vous ne pourrez pas avoir 2 contacts différents portant les mêmes noms et prénoms. Comment comptez-vous gérer la chose si cela devait arriver ?
De préférence, rajoutez une colonne "ID" en NuméroAuto dans votre table. Elle vous servira de clé primaire.

- Même remarque pour la table "devis". Bien que cela dépende de la nomenclature que vous utiliserez, n'y a-t-il pas un risque que 2 devis différent se retrouvent avec le même nom ? Si la réponse et oui, ajoutez une colonne "ID" en NuméroAuto et définissez la comme clé primaire.

Et 2 suggestions d'amélioration au passage

- Concernant la table devis, vous pourriez envisager (si cela vous est utile évidemment), de la séparer en 2 tables comme indiqué ci-dessus. Cela vous permettrait notamment de mettre plusieurs produits sur un seul et même devis (formation 1 pour x€, formation 2 pour y€...).

- Idem pour la table "facture" au niveau du suivi des paiements, êtes-vous sur que tous vos clients règleront vos factures en une fois ? Si ce n'est pas le cas, dissociez votre table facture en 2 tables : une facture (reprenant la référence du devis et/ou client, le montant...) et une table paiements (reprenant le montant du paiement, sa date et la facture à laquelle il est rattaché).

Je pense avoir fait le tour.

Bonne soirée,
0
Bonjour !

Merci infiniment pour ces précieux conseils ! et surtout pour m'avoir consacré du temps.

J'ai commencé à changé les clefs primaires et à effectuer les changements sur mon sous-formulaire devis. J'ai donc re-sélectionner en source contrôle [MONTANT PRESTATION] pour le Total prestation et j'ai fait le code vba sur l'événement perte focus sur les 2 paramètres de ce champ. Mais je ne sais pas ce que j'ai pu (encore) faire de pas bien, mais mon champ ne se calcule pas automatiquement ... Est-ce que j'aurai louper une étape ?

Concernant votre suggestion de séparer ma table "devis" en 2 tables, j'en prends bonne note parce que justement on propose plusieurs types de prestations, qu'on voudrait donc bien séparer sur le devis : prestations 1, prestations 2 ... mais je cherchais une solution pour ne pas afficher ces prestations si celle ci sont vides sur mon Etat (Afficher/cacher un champ vide). C'est un problème que je n'ai pas encore résolu (puisque je ne suis pas très douée en code), mais finalement votre idée de 2 tables pourrait bien être ma solution. bien merci !

Encore merci pour votre aide Syzygy !
0
J'espère que je n'abuse pas mais j'ai encore une question...

Lorsque je fais des liste de choix, par exemple pour ma table facture qui fait référence à un devis, est-il possible que quand je sélectionne un client qu'ensuite ma liste de choix des devis se cantonne seulement à ceux qui sont rattachés à ce client ? au lieu de me proposer une liste de tout les devis qui sont enregistrer dans ma base ?

Encore merci
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
4 août 2011 à 11:14
Bonjour,

C'est assez étrange que celà ne fonctionne pas, tout marche nikel de mon côté et j'ai suivi les mêmes étapes que je vous ai indiqué. Toutefois j'ai omis de vous dire que la procédure ne fonctionnait que si vous naviguiez entre les champs à l'ai de la touche tabulation.
Si la navigation par tabulation vous pose problème, rajoutez cette procédure au moment sur le bouton de sauvegarde de l'enregistrement. La mise à jour du montant se fera à chaque fois que vous cliquerez sur ce bouton.

Concernant la deuxième remarque de votre premier commentaire, si vous séparez en 2 tables votre table devis, vous n'aurez pas besoin de coder quoique ce soit pour la mise en page de vos états.

Enfin pour la troisième question, oui c'est tout à fait possible (avec très peu de code!). J'ai trouver ce lien qui devrait correspondre à votre attente :

https://grenier.self-access.com/?post/2007/09/05/Listes-deroulantes-liees

Un détail par rapport au lien, dans Access 2007 et 2010 (je ne suis pas sur pour les versions antérieures), il est possible de créer la requête pour la source de données de la seconde liste déroulante, directement dans la source de données de celle ci.
Cela évite la multiplication des objets, mais à vous de voir ce qui est le plus simple pour vous et ce que vous préférez.

Bonne journée,
0