Quelques soucis avec Access

Résolu
Bonjour,

Je me présente comme je suis nouveaux. Je m'appel Claude, et e suis étudiant en Génie Méca Prod à l'IUT de Besançon-Vesoul. Pour valider mon Semestre 4, j'effectue un stage de 10 semaines en entreprise. Le but de mon stage est de faire une base de donné sous ACCESS pour la gestion des stocks des outils de l'entreprise (pour le fraisage, tournage, etc).

Ca fait longtemps que j'ai pas retouché à ACCESS, donc j'ai un peu de mal à me remettre dedans.

Ce que j'ai fais pour commencer, c'est une petite base de donnés pour tester un peu les fonctionnalité d'ACCESS:

J'ai mis en place mes liens comme ci-dessous :
https://imageshack.com/
On a les produits, et leurs fournisseurs (ne tenez pas compte des mouvements, ca ne m'est pas utile pour l'instant).

Maintenant ce que je veux, c'est créer un formulaire, avec une liste deroulante ou je choisis la reference d'un produit, et ma bdd m'affiche toutes les infos sur le produit et le fournisseur associé à cet article. Seulement je n'y arrive pas...

Je crois que ce n'est pas possible a cause des clé primaire que j'ai mis, puisque je peux faire l'inverse, à savoir chercher le fournisseur dans une liste deroulante pour trouver les articles qui lui sont associé.
https://imageshack.com/

Pour info, je ne peux pas selectionner l'onglet ci-dessous
https://imageshack.com/

Si vous pouviez me dire comment résoudre ce problème, ca m'oterais une épine du pied. Merci !

Je reste disponible à d'éventuelles questions sur ma base de donné! ;)

13 réponses

Résumé de la discussion

Un étudiant en Génie Mécanique développe une base Access pour gestion des stocks et cherche un formulaire avec une liste déroulante affichant les informations d'un produit et du fournisseur lié à sa référence. Le problème réside dans le modèle relationnel et les clés primaires; les solutions évoquées incluent une requête paramétrée liée au formulaire et, alternativement, une recherche FindRecord. D'autres interventions proposent de corriger les noms et d'utiliser le code AfterUpdate sur une saisie pour déclencher la recherche, mais cela nécessite une concordance des noms. Pour éviter les conflits de référence et gagner en fiabilité, une piste consiste à créer une clé auto-numéro pour les tables et à s'appuyer sur des relations 1:N entre produits et fournisseurs.

Bobot (l’IA à votre service)
  1. Gleude25,

    Je viens de traiter ce dossier pour un autre déposant. Il me semble que la requête qui est sur le formulaire : Unités
    - et qui se nomme listage machin-chose (en plein milieu) pourrait vous être utile
    Il s'agit d'une requête paramétrée, qui peut être habillée avec un formulaire.
    - Plus simple, je n'y crois pas ! ;-)

    http://www.cijoint.fr/cjlink.php?file=cj201104/cijM2Qx58E.zip

    Nota : Je m'absente le reste de l'après-midi
    1
    1. Gleude25,
      J'ai connu les mêmes affres de l'incompréhension ..... Chacun sont tour, si j'ose dire ;-)

      Voilà pour avancer. A tester en harmonie avec le cosmos. Zen quoi !

      - Il faut bien comprendre que l'information saisie manuellement est d'abord comparée à chacun des enregistrements de la colonne [Ref client].

      Private Sub Champ_de_saisie_AfterUpdate()
      With CodeContextObject
      DoCmd.GoToControl "Champ_de_saisie"
      DoCmd.FindRecord [Ref client], , True, , True

      If Champ_de_saisie <> [Ref client] Then
      MsgBox "Ce code est inconnu : " & Me!Champ_de_saisie
      Me!Champ_de_saisie = ""

      End If

      End With

      End Sub

      NB : Text17 doit être remplacé partout par Champ_de_saisie
      A+
      La science ne fait que trouver ce qui existe depuis toujours.
      REEVES Hubert.
      1
      1. Jean-Jacques,
        ca commence à prende forme un peu, par contre, ne faut-il pas plutôt mettre [Produits]![Ref] quand je vais chercher dans ma table, plutôt que [Ref] ?
        [Produits]![Ref], c'est pour dire que je vais chercher dans me table Produits; parce que à chaque fois, il me met: "ce code est inconnu"

        Cordialement
        0
      2. Gleude25,

        La procédure travaille uniquement sur une table. Le nom du champ suffit.
        Et puis la requête à peut-être raison ....
        Quel est le format du code saisi manuellement ? Chiiffres ? lettres ? Un mix des 2 ? minuscules ? ...
        A+
        0
      3. Simplement chiffres dans cet exemple la,
        mais dans la base de donnée ou je vais mettre en place ce petit systeme, il y aura des refenrences avec des chiffres, majuscules, minuscules, et caracteres speciaux à savoir /,-. et même des espaces...

        Cordialement
        0
    2. J'allais oublier de préciser, j'ai cocher certaines cases pour les relations entre les tables, car c'est recommandé j'ai l'impression...

      https://imageshack.com/
      0
      1. Bonjour
        Pour les relations, il te faut prendre un N°auto Comme cle Primaire
        Exemple: N°Four, N°Prod
        Si tu as un meme nom de fournisseur ou de produit tu seras embeté.
        0
        1. Sur ce lien tu trouveras des exemples de formulaires

          http://www.cijoint.fr/cjlink.php?file=cj201104/cijW2BJbXT.zip
          0
        2. Bonjour Castours,
          Merci d'attirer mon attention
          Je m'en suis aperçu, il y a un caractère de trop (à vide qui se sélectionne par défaut, à la fin de la chaîne de caractères).
          La solution : copier le tout, tel quel, dans la barre d'adresse. Ça fonctionne chez moi.
          Cordialement
          0
      2. Bonour Gleude25,

        Votre question est bien connue sur CCM.
        Dans ce bricolo à télécharger vous trouverez comment afficher un enregistrement à partir d'un argument sélectionné dans une liste déroulante

        http://www.cijoint.fr/cjlink.php?file=cj201104/cijWwdrtak.zip

        Bon stage
        Cordialement
        ....
        La science ne fait que trouver ce qui existe depuis toujours.
        REEVES Hubert
        0
        1. Bonjour
          Le lien ne fonctionne pas
          0
        2. Bonjour,
          Dans ton formulaire, je ne comprend pas l'utilité de pouvoir changer la désignation et la classification, puisque la seule chose à changer (si j'ai bien compris), c'est la saisie.
          De plus, je ne comprend pas l'utilité d'avoir la désignation et la classification, car n'étant pas liés, ca amene à des incohérences...

          A part ca, je ne comprend pas comment ta liste de saisie (independante de tous les autres champs) peut renvoyer a ta table T_Article ? Ca a été fait avec la Macro "saisie" j'immagine, mais n'y a t-il pas moyen de faire plus simple avec une requete préalablement créée ?

          Cordialement.
          0
      3. Gleude25,

        Petite mise au point : Il ne faut pas prendre ce bricolo comme un outil rationnel, ce qu'il n'est pas.
        Pour moi, c'est une sorte de petit banc d'essai ou ce cotoient des fonctions apparemment disparates que j'ai accumulées au fil du temps. Pour le cas où ...

        Il convient donc d'y prélever, s'il y a lieu, ce qui peu vous convenir. Un peu comme dans un magasin de pièces détachées, si j'ose dire.

        A propos de la liste indépendante : La recherche est gérée, en effet, par une procédure événementielle, dite sur Mise à jour, que vous trouverez dans les propriétés du champ ou apparaît la liste déroulante.

        A+
        0
        1. Oui, j'avais bien compris que c'etait une petite bdd pour tester les fonctions d'access, mais que veux tu j'adore quand les choses sont bien faites ^^.

          Sinon, je suis désolé, je ne trouve pas ta procédure dans les propriété du champ de ta liste deroulante. Je n'ai aucun champ renseigné dans l'onglet evennement dans les propriété. J'ai cherché également dans les donnés, il n'y a rien de special non plus...

          Cordialement.
          0
      4. Gleude25,
        C'est vrai que ce n'est pas joli, mais j'ai pris sur moi, et m'y suis habitué...
        - Par ailleurs -
        J'ai vérifié. Apparemment le transit du fichier via-ci-joint a semé le désordre ...
        Voici les 4 lignes de codes en question. Il agissent sur l'évènement après Mise à jour ...
        Philosophiquement, il me semble que les autres solutions envisageables sont d'un niveau de ... simplicité ... comparable.

        '------------------------------------------------------------
        ' Champ_de_Saisie_AfterUpdate()
        '
        '------------------------------------------------------------

        With CodeContextObject
        DoCmd.GoToControl "[Référence_Facture]"
        DoCmd.FindRecord Champ_de_Saisie, , True, , True
        End With

        Cordialement
        0
        1. Gleude25,
          Entendu comme ça,
          Je suis toujours preneur de nouvelles astuces et solutions

          A+
          0
        2. Ok, je regarde ca ce soir et je te redis ca..

          Par contre j'ai testé ce que tu m'as affiché au dessus, et j'ai un probleme...
          Les lignes de code que tu viens de me donner servent a ajouter de nouvelles saisies, et donc mettre a jour ta base de donné. Moi tout ce que je voilais, c'etait pouvoir retrouver la reference de mon article, et d'avoir toutes les infos sur cet article.

          Avec ton code, des que je cherche une reference, il me remplace dans la table de mes produits l'ancienne reference (celle que je voulais) par cele que j'ai rentré. C'est assez bizarre en fait...

          La recherche de la reference, il n'y aurait pas moyen de la faire avec une macro plutot ?
          0
      5. C'est bon, j'ai réussi à faire ce que je voulais avec une liste deroulante, le probleme venait du fait que j'ai renseigné le champ "Source contrôle" dans mon champ de recherche (la liste deroulante). Je l'ai supprimé et ca marche.

        Par contre ce qui m'interesserait maintenant, c'est plutot que de chercher la reference dans une liste deroulante, la chercher dans un champ.
        Je m'explique, il y a une zone de texte ou je tape ma reference, et quand je lance la recherche, le fomulaire est capable de chercher dans mes tables (associés à l'article concerné) les informations qui m'interessent.
        Ca serait préférable parce que je dois gérer une liste de 500 references environ, alors avec une liste deroulante, c'est même pas la peine d'y penser...

        J'ai posté une nouvelle question à ce sujet sur le forum.

        Et merci à toi, tu m'as vachement aidé mine de rien (j'ai découvert deux trois trucs assez sympas dans les bdd que tu m'a envoyé aussi :p ), merci !
        0
        1. Gleude25,

          Pour saisir manuellement, vous devez d'abord transformer la liste déroulante en simple champ texte. Ensuite adaptez cette syntaxe à votre base de données

          Au premier coup d'oeil il semble bien qu'il ne que remplacer Référence par le nom de votre choix.

          With CodeContextObject
          DoCmd.GoToControl "[Référence]"
          DoCmd.FindRecord Champ_de_saisie, , True, , True

          If Référence <> Champ_de_saisie Then
          MsgBox "Ce code est inconnu : " & Me!Champ_de_saisie
          Me!Champ_de_saisie = ""

          End If

          End With

          Cordialement
          0
          1. Ok, merci de m'aider encore sur ce point.

            Je ne comprends pas ce qui doit être remplacé par "[Référence]", est-ce:
            1-Le champ de ma table ou je veux chercher l'informations (la reference) ?
            2-La zone de texte ou j'entre ma recherche ?

            Et sinon, le code que tu viens de me donner, je dois le rentrer dans quel champ ?

            Ce que je veux faire exactement, c'est un un peu comme une RECHERCHEV (dans excel) de la valeur entré dans la zone de texte, et RECHERCHEV s'effectue dans la table des references.
            0
        2. Gleude25,

          1 - [Référence] est à remplacer par le vrai nom du champ qui contient l'information recherchée

          2 - La zone de texte (Champ_de_saisie) accueille, elle, l'argument sur la foi duquel la recherche aura lieu.

          Le code fourni est celui d'une procédure événementielle dite après mise à jour
          Il est activé par la validation de l'argument de recherche.

          Cordialement
          0
          1. Je ne comprends pas de quel champ tu parles pour la [Référence]

            Voila ce que j'ai mis :
            https://imageshack.com/
            Ca boggue des que je tente une recherche.

            Sinon, voila les onglets "données", "evennement" et "autres" de mon champ Texte17 (la ou je veux entrer la reference a chercher) :
            https://imageshack.com/

            Cordialement
            0
        3. Gleude25,

          Le champ [texte17] doit être renommé Champ_de_Saisie pour être reconnu dans le code.

          A+
          0
          1. Désolé ca ne marche pas. Je ne vois vraiment pas comment tu veux que je tourne ton bout de code (je ne le comprend pas).

            Table [Fournisseurs]
            Nom
            Ref client
            Code postal
            Production

            Table [Produits]
            Ref
            Description
            Quantite
            Fournisseur

            Dans mon formulaire [Produits1], j'ai un champ de texte Champ_de_saisie, dans l'ongle evennement dans ses propriétés, je met dans "Après_Maj", "Générateur de code", et là j'entre le code que tu m'as donné, à savoir celui ci:

            Private Sub Champ_de_saisie_AfterUpdate()
            With CodeContextObject
            DoCmd.GoToControl "Champ_de_saisie"
            DoCmd.FindRecord Champ_de_saisie, , True, , True

            If Champ_de_saisie <> Champ_de_saisie Then
            MsgBox "Ce code est inconnu : " & Me!Champ_de_saisie
            Me!Champ_de_saisie = ""

            End If

            End With

            End Sub

            Alors à partir de la, j'ai du un peu paniquer, parce que je me suis retrouver avec des "Champ_de_saisie" partout dans mon code.
            C'est ca qui m'inquiete, j'ai changé les Texte17 par des "Champ_de_saisie" comme tu me l'a dis...
            En tout cas ca ne marche pas, j'ai du mal te comprendre.

            Cordialement.
            0
            1. Et bien écoute, je viens de me rendre compte d'un truc, c'est que dans ta liste deroulante, au lieu de chercher ta reference avec, tu peux taper ta reference dans le champ de la liste et il te la retrouve...
              Je savais pas qu'on pouvait faire ca (ou je ne me souvenais plus ? ^^ )

              Bref, je peux passer par ce chemin la pour faire ce que je voulais, mais j'aimerais tout de meme comprendre comment fonctionne ce que tu m'a proposé ?

              Cordialement.
              0
              1. Gleude25,
                La compréhension viendra peu à peu.
                Et puis, attention, je crois me souvenir que si le code recherché n'existe pas, la procédure suggère de le créer, ou le crée spontanément, je ne sais plus bien au juste ...
                A+
                0
              2. Non, pas de soucis pour ca, il n'a pas cherché à me créer de nouveau code;
                en tous cas, je te remercie du temps que tu m'a accorder!

                Cordialement.
                0