Formulaires et boutons

lil404

XLDnaute Nouveau
Bonjour à tous

Je débute en access et rencontre de nombreuses difficultés. Je ne crois pas qu'il s'agisse de choses très compliquées à faire, mais j'ignore comment on procède, et tous les tutoriels que j'ai pu trouver m'ont plus embrouillée qu'autre chose. Je sollicite donc votre aide =)

Je dois créer une application qui gère ce qu'on appelle des "attachements", c'est à dire une liste de commande. Un attachement possède un numéro, un lieu, et une liste de produits, avec la quantité demandée pour chacun d'eux. J'ai donc créé trois tables dans ma base : une table "attachement", qui contient le numéro et le lieu ; une table "article" contenant le nom des articles et leur prix unitaire ; et une table "commande", contenant une liste d'"articles", leur quantité, ainsi que le numéro d'attachement auquel elle appartient.
Pour résumer, mon "attachement" est donc une liste de "commandes" d'"articles". (Je vous embrouille pas trop là ?)

Voici ce que j'essaie de faire :
- je voudrai qu'un premier formulaire s'affiche pour demander le numéro et le lieu de l'attachement. (ça c'est bon)
- ensuite, en cliquant sur un bouton de ce formulaire, je voudrai pouvoir enregistrer les données ainsi entrées, et ouvrir un deuxieme formulaire, qui demanderait le numéro de produit et la quantité demandée.
Mes problèmes sont que j'arrive pas à faire un bouton ayant une commande "personnalisée" (c'est à dire pas directement proposée par l'assistant d'access). (J'ai essayé maccro, code évennement... je n'y arrive pas).
J'ignore aussi complètement comment faire en sorte que chaque commande entrée dans mon deuxième formulaire puisse garder en mémoire son numéro d'attachement (qui a été entré, je le rappelle, dans le premier formulaire...). Là aussi, j'ai essayé les clauses "where" des maccros, mais aucun résultat..


Je résume une dernière fois pour être bien claire : un formulaire s'ouvre, demandant le numéro et le lieu de l'attachement. On valide, et un deuxieme formulaire s'ouvre, afin de donner un par un tous les produits voulus pour cet attachement, ainsi que leur quantité.


C'est un petit peu compliqué, je vous l'accorde, j'ai essayé de l'expliquer le plus clairement possible... Si vous avez la moindre question n'hésitez pas, je suis à votre disposition.
 

lil404

XLDnaute Nouveau
Re : Formulaires et boutons

J'ai finalement résolu (du moins je crois) le problème que j'avais posé. Il s'agissait d'utiliser un sous formulaire, au lieu d'un formulaire, en prenant comme champ commun celui qui me posait problème.
Ca permet donc de garder les données du premier formulaire en mémoire, et également de faire plusieurs enregistrement de produits consécutifs :) .

En revanche, si quelqu'un se sent l'âme charitable, j'ai des milliers d'autres questions =)


Pour commencer, voici la structure de mes tables :


table Attachement :
- NoAs (texte, clé primaire)
- lieu (texte)
- coefficient (numérique)
- montant (numérique)


table Article
- NumArticle (texte, clé primaire)
- Unité (texte)
- Pu (numérique)


table Commande
- N°Commande (numéro auto, clé primaire)
- NumArticle (texte)
- quantité (numérique)
- NoAttachement (texte)
- SousTotal (numérique)




Et voila les questions ^^"
En vrac,



- Quand on clique sur le bouton pour enregistrer la commande et l'attachement (désormais sur le même formulaire), Access me prévient qu'il risque d'y avoir des doublons, et que je dois remédier à ce problème. Il est vrai que le numéro d'attachement ne doit pas comporter de doublons, puisque c'est une clé primaire, mais cette erreur apparait également quand on entre un numéro qui n'existe pas encore dans la base... Comment cela se fait-il ?



- Mon sous formulaire a été créé selon une requête, qui comporte un champ calculé : SousTotal. Quand on entre les données dans le sous formulaire, tout se passe bien, il les calcule normalement. Cependant, lorsque l'on clique sur le bouton valider, et bien qu'il entre tous les autres champs dans la base, le champ SousTotal reste à 0.00 dans tous les enregistrements... J'ai tenté de l'enregistrer dans le "code évennement" du bouton, à l'aide d'un reccordSet et d'un addNew, mais ça ne fonctionne pas...



- Bien que comme dit ci dessus, les données de mon sous formulaire (excepté SousTotal) sont bien enregistrées dans la base, il reste cependant un problème de taille : à chaque nouvelle ouverture du formulaire, quand on entre de nouvelles données dans le sous formulaires, elles "écrasent" les anciennes. Comment palier à ce problème ?



- Mon champ montant ne fonctionne pas... :(
J'ai fait exactement la démarche expliquée ici : Access - Les sous-formulaires (mon probleme étant très similaire à leur exemple, mon champ "montant" correspondant à leur champ "Total" ), mais le champ montant indique "#Nom". Est-ce que ça veut dire qu'il ne trouve pas le champ "TotalItem" présent dans le sous formulaire ? Pourtant, c'est lui qui me l'a proposé à l'aide du générateur d'expression... Cela veut dire donc qu'il le reconnait...



- J'ai voulu, à l'aide d'un code évennement lancé quand le sous formulaire est "load", effacer toutes les anciennes lignes, et n'en laisser qu'une, dont les champs sont remis à zéro (avoir un sous formulaire vierge, en fait). Le code pour remettre les lignes à zéro fonctionne (initial est une fonction qui remet les champs à "" ) :

Dim rst As RecordSet
Set rst = me.RecordSetClone

If Not rst.BOF Then rst.MoveFirst
Do Until rst.EOF
Me.Bookmark = rst.Bookmark
initial
rst.MoveNext
Loop


J'ai donc voulu l'améliorer pour effacer les lignes supperflues, en le remplaçant par ce code ci :

Dim rst As RecordSet

Set rst = me.RecordSetClone

If not rst.BOF Then rst.MoveFirst
Do Until rst.BOF <> rst.EOF
rst.Delete
rst.MoveNext
loop
If Pu <> "" Then Me.Bookmark = rst.Bookmark ' (j'ai ajouté cette ligne, car quand on chargeait le sous formulaire alors que la table commande était vide, le débugueur indiquait une erreur à cette instruction)
initial



Il ne marque aucune erreur, mais mes lignes ne s'effacent pas...



- Enfin, j'ai remarqué un phénomène un peu étrange : quand le formulaire s'affiche et que ce n'est pas la première fois, on voit toutes les lignes précédentes dans le sous formulaire. Jusqu'ici, normal, puisque je n'ai pas réussi à les effacer (cf question précédente). Mais ce qui est étrange, c'est que quand je valide un nouveau numéro d'attachement, le sous formulaire se remet à zéro, juqu'à ce qu'on clique dessus pour le remplir. Là, les anciennes lignes réapparaissent... Je suis perplexe.




Voila, un résumé de toutes les questions que je me pose ^^
Si l'un d'entre vous a la réponse à ne serait-ce qu'une seule d'entre elles, ou même rien qu'une idée, je suis ouverte à tout =)
Merci de votre patience et de votre attention ^^


Lil désespérée
 

chris

XLDnaute Barbatruc
Re : Formulaires et boutons

Bonjour

Pas sûre d'avoir compris la structure de ta base et cette notion d'attachement.
Il doit y avoir

  • Attachements qui doit avoir une relation de 1 à n vers commandes
  • Articles qui doit avoir une relation de 1 à n vers commandes.
Le formulaire doit avoir attachement en formulaire et commandes en sous formulaire.

Soit tu crées un nouvel attachement et les commandes correspondantes.
Soit tu sélectionnes un attachement et tu y ajoutes des commandes.

Tu peux utiliser le même formulaire mais dans un cas il faut se positionner à la fin des enregistrements existants soit il faut rechercher l'attachement à compléter.

Donc un choix à prévoir puis le chargement du formulaire soit en mode ajout( on ne verra pas les attachements existants), soit en modif (il faut empêcher l'accès aux autres attachements en contrôlant l'évènement avant mise à jour).

Le formulaire n'est qu'un moyen de restituer les données présentes dans la base et ne contient lui-même aucune donnée.

Ce que tu appelles "anciennes lignes" c'est le contenu de ta base de données : il ne faut donc surtout pas effacer mais seulement sélectionner le bon affichage du formulaire (ou le bon formulaire. Quand on débute il est souvent plus simple de dupliquer le formulaire de façon à avoir un formulaire par mode d'affichage, ajout ou non).

Le sous-formulaire ne doit pas être issu d'une requête mais de la table commandes.

Le sous-total correspond à quoi : le prix-U X quantité ? Si oui :
Pour saisir une ligne commande, il faut une liste déroulante des articles. Lors du choix dans cette liste, il faut par macro ou VBA valoriser le champ sous-total.
 

lil404

XLDnaute Nouveau
Re : Formulaires et boutons

Pas sûre d'avoir compris la structure de ta base et cette notion d'attachement.

Un attachement est, si tu préfères, une sorte de facture. Il contient plusieurs lignes avec, pour chacune d'elle, un produit, son prix unitaire, la quantité souhaité, et le sous total ainsi calculé. A la fin elle possède également un montant total, somme des sous-totaux.


Il y a effectivement une relation de un à plusieurs de Attachement à Commande, ainsi que de Article à Commande.


J'ai essayé de tout refaire en ne basant pas le sous formulaire sur une requête, mais sur la table Commande, comme tu me le conseillais.
Mon formulaire a donc bien Attachement en formulaire, et Commande en sous formulaire.


Pour ce qui est des différents formulaires (ajout et modif), je ne suis pas sûre d'avoir compris : comment le choisit-on ? Il y a une option spéciale proposée par Access ? Ou tout se joue dans le code ?


Concernant les champs du sous formulaire, mon ancienne requête, sur laquelle il était basé, permettait d'afficher le Pu du produit, et ainsi de calculer le sous total. Maintenant qu'il est basé sur la table Commande, je ne sais pas comment retrouver ce Pu.
J'ai essayé différentes méthodes, pour afficher ce champ, comme de mettre [Article]![Pu] en tant que source contrôle (ce à quoi il me répond "#Nom?" dans le champ Pu), d'écrire une requête SQL dans son code évennement pour l'initialiser grâce aux valeurs de la table (ce que je n'ai pas su faire, puisque je ne sais pas où récupérer les résultats d'une requête sélection dans du VBA), ou encore de créer une requête Access ayant deux champ : le champ Pu, visible, de la table Article, et le champ NumArticle, invisible, possédant comme critère "[Forms]![SF_Commande]![NumArticle]". J'ai ensuite mis cette requête en source contrôle de mon champ Pu, mais là aussi, il me marque "#Nom?". Bref je crois que j'embrouille un petit peu le problème ^^', peu importe, aucune de ces méthodes n'a marchée.

D'où ma question initiale : comment calculer le SousTotal, sans avoir le champ Pu grâce à la requête ?



De plus, j'ai toujours mon problème d'écrasement des données. Celles ci ne se mettent pas à jour dans le sous formulaire quand les valeurs du formulaire changent, et bien qu'elles soient enregistrées dans la base de données, elles écrasent les valeurs précédentes...
 
Dernière édition:

lil404

XLDnaute Nouveau
Re : Formulaires et boutons

Waow. Je viens de résoudre la totalité de mes problèmes d'un coup... C'était des plus stupides, en fait..

J'ignorais simplement qu'il fallait utiliser les flêches en bas pour créer un nouvel enregistrement. Du coup, au lieu de créer, je modifiais à chaque fois... -_-'


D'où la remise à zéro qui ne se faisait pas
D'où l'écrasement des données
D'où le sous formulaire ne correspondant plus au formulaire


La totalité de mes problèmes, excepté le montant, ont été résolus du même coup. Concernant le montant, c'était une simple erreur technique, que j'ai fini par trouver...


Merci à tout ceux qui m'avaient lue, et à Chris pour sa réponse ;)
 

chris

XLDnaute Barbatruc
Re : Formulaires et boutons

Bonjour

Pour le formulaire tu trouveras dans l'onglet Données des propriétés du formulaire : Entrée données à Non.
Si tu mets à Oui ton formulaire sert à ajouter des enregistrements mais ne montre pas ceux existants.
Si on saisit 2 nouveaux enregistrements on peut se promener de l'un à l'autre (si les boutons de passage d'un enregistrement à l'autre sont présents et non interceptés par du code) mais dès qu'on ferme le formulaire on n'a à nouveau plus accès au contenu de la base. C'est que j'appelle le mode ajout.

Sinon il faut se positionner par VBA sur un nouvel enregistrement, enlever du formulaire les fameux boutons et créer un bouton pour valider sa saisie et remettre le formulaire à 0 en repassant sur un nouvel enregistrement.

Pour le PU tu peux créer un champ indépendant de type liste déroulante mais de hauteur 1 ligne (nommé PU_Ligne par exemple). Tu y associes une requête qui cherche le PU du produit sélectionné dans la case code produit du formulaire. Tu valorise ton champ PU de commande par la formule =PU_Ligne.
Dès que le champs code produit est changé (évenement sur changement ou après mise à jour selon le type du champs), il faut lancer la mise à jour du champ PU_Ligne.
Après test ce champ PU_Ligne est à masquer (changer la propriété Visible à non).
 

Discussions similaires

Réponses
22
Affichages
773

Statistiques des forums

Discussions
312 337
Messages
2 087 390
Membres
103 534
dernier inscrit
Kalamymustapha