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

IHM Discussion :

Automatisation d'enregistrements sur formulaire [AC-2007]


Sujet :

IHM

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut Automatisation d'enregistrements sur formulaire
    Bonjour à tous,

    Je m'appelle Mathieu, c'est mon premier post. Je débute en Access (je travaille sous 2007), je suis jeune ingénieur des Ponts alors autant dire que ce n'est pas vraiment dans ma formation 'scolaire'.

    Bon j'explicite mon problème. Je sais comment fonctionne une BDD (les bases du moins) et j'ai créer les tables, les clés et les relations qui allaient avec, que voici :



    De manière simple, ces trois tables et les relations entre elles illustrent le fait qu'un "Components" peut-être soumis à plusieurs "Environment". Comprenez par exemple qu'un mur semi-enterré est par exemple soumis à "Air-outdoor" (air extérieur) et "Soil" (sol). Enfin, je dis ça, mais avec l'image, tout le monde avait compris je pense.

    Mon problème réside dans la création de formulaires.

    - J'ai créé une formulaire qui me permet de rentrer un enregistrement "Components" et les données qui le concerne (son nom et d'autres informations qui ne sont pas utiles pour mon post)
    - J'ai fait de même avec "Environment".
    - Ensuite, je suis capable de crééer un troisème formulaire qui me permettra d'associer "Components" et "Environment". Si je créé un formulaire depuis la Table ComponentsEnvironment, je pourrais saisir les enregistrements grâce à mes deux clés idEnvironment et idComponents (une bellle table de correspondance bien basique), je sais améliorer le process en transformant les "id" en listes déroulantes de choix dans lesquelles apparaissent les noms, bah oui, c'est plus explicite.

    Seulement, voilà, ce troisième formulaire ne me convient pas. Dans ma bdd, c'est une situation que je rencontre plusieurs fois, et si "Components" est soumis à (disons) 3 "Environment" plus 2 "AutreTableSimilaire1" et encore quatre "AutreTableSimilaire2", si j'ai 5 "Components" je dois enregistrer "à la main" 5 x (3+2+4) = 45 lignes dans les tables de correspondances associées !!! Autant vous dire qu'avec mes centaines de composants et d'options possible pour les tables associées, cela relève du Taylorisme de rentrer toutes ces données...

    En bref, j'aimerais pouvoir construire un formulaire qui me permettrait, pour un composant donné, de dire (par un système de sélection par exemple) qu'il est soumis à "i Environments" ; "j AutreTableSimilaire1" e "k AutreTableSimilaire2", avec (par exemple) une colonne pour ces trois tables, et ensuite avoir une macro magique qui enregistrerai lui même les i, j et k enregistrements dans les tables de correspondance associées.

    J'imagine que ça doit pas être si compliqué que ça, donc si vous avez des idées (au moins pour que je puisse commencer par quelque part), je suis preneur.

    En vous remerciant,
    Mathieu

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Une possibilité :

    remplacer la zone de liste déroulante en liste à sélection multiple.
    Parcourir toutes les lignes en VBA sur un bouton valider permettra d'ajouter ou supprimer l'enregistrement correspondant dans la table de jointure.

    Autre solution, utiliser les champs à valeur multiple d'access 2007

    http://warin.developpez.com/access/multivalue/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Merci pour cette première réponse.

    La solution liste multipe + VBA me semble plus appropriée car elle répond plus à mon problème "solution pour saisie rapide" que la solution de l'autorisation de valeurs multiples.

    Il me semble (si j'ai bien compris le tuto) que l'utilisation des valeurs multiples change mes tables et leurs relations (question de fond) tandis que la première solution semble s'attaquer à la forme seulement.

    Je préfère garder la structure existante, car elle est en réalité bien plus compliquée, ça me parait plus simple comme ceci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Bon, j'ai enfin pu regarder ça, et j'ai exploré ListBox et les propriétés/méthodes associées, notamment la fonction multiselect.

    Access permet d'activer cette propriété facilement en allant dans Popriétés => Autres => Sélection Multiple mais j'aurais préféré le faire moi-même pour 'comprendre' ce que je fais, ce qui par la suite s'avère crucial...

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Form_Load()
    'Activer la sélection multiple dans la liste
    Me.EnvList.MultiSelect (1)
    End Sub

    Et VBE me dit que j'utilise mal la propriété (dans mon access EnvList est la liste des 'Environnements' à activer).

    Donc j'avoue être un peu perdu, je découvre le VBA depuis deux jours, pas facile d'intégrer à la fois les bases et des choses très précises dont j'ai besoin de manière immédiate dans mon travail.

    J'ai aussi une seconde question (de forme) : puisqu'on peut activer la sélection multiple directement sur Acces, comment puis-je récupérer le code VBA correspondant à cette action implicite effectuée ? Ce serait le plus simple...

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Attention, le fait d'activer la sélection multiple autorise juste l'utilisateur à sélectionner plusieurs lignes, cela ne signifie pas qu'Access incorpore cette saisie dans la table. Cette incorporation doit être faite en VBA.

    Pour cela, imaginons une liste contenant les valeurs A,B,C,D. A et C ont été sélectionnées par l'utilisateur.

    Su un bouton Validation, le code VBA doit être en mesure de parcourir toutes les lignes de la listes et pour chaque ligne vérifier si elle est sélectionnée ou non.

    En effet si une ligne est sélectionnée, il faut ajouter le couple IDEnvironment,IdComponent correspondant s'il n'existe pas, et si elle est déselectionnée, il faut supprimer celui-ci si elle existe.

    Imaginons, qu'un controle (zone de texte, liste, ou autre) permettant de choisir le component est nommé txtComponent et que notre liste proposant les environment est nommée lstEnvironment.

    Il est nécessaire d'appliquer un code proche (non testé) du suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub Commande2_Click()
    Dim i As Integer
     
    Dim pIdComponent As Integer, pIdEnvironment As Integer
    Dim oDb As DAO.Database
     
    pIdComponent = txtEnvironment
    Set oDb = CurrentDb
    For i = 0 To lstEnvironment.ListCount - 1
      pIdEnvironment = lstEnvironment.ItemData(i)
      If lstEnvironment.Selected(i) Then
        'Vérifie si le couple existe déja dans la table
        If DCount("(IdComponent]", "[ComponentsEnvrionments]", _
                "[IdComponent]=" & pIdComponent & _
                " AND [IdEnvironment]=" & pIdEnvironment) = 0 Then
     
                'Insertion car inexistant
                oDb.Execute "INSERT INTO ComponentsEnvrionments (IdComponent,IdEnvironment) " & _
                            "VALUES (" & pIdEnvironment & "," & pIdComponent & ")", dbFailOnError
     
        End If
      Else
        'Demande la suppression au moteur
        oDb.Execute "DELETE FROM ComponentsEnvrionments WHERE " & _
                    "IdComponent=" & pIdComponent & " AND " & _
                    "IdEnvironment=" & pIdEnvironment, dbFailOnError
      End If
     
    Next i
    End Sub
    Voilà en ce qui concerne la mise à jour des données.
    Reste maintenant à toi de voir comment remplir la liste et plus particulièrement sa sélection lorsque l'utilisateur navigue entre les différents Components

    J'ai aussi une seconde question (de forme) : puisqu'on peut activer la sélection multiple directement sur Acces, comment puis-je récupérer le code VBA correspondant à cette action implicite effectuée ? Ce serait le plus simple...
    Les propriétés sont définie dans l'éditeur graphique, il n'y a pas besoin de VBA pour cela. Le VBA concerne le traitement, les propriétés concernent "les aspects", il n'y a donc pas (ou a de rares occasions prés) besoin de les modifier en VBA

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    J'avais un code très similaire sauf que le mien ne vérifiait pas l'existence d'enregistrements déjà rentrés dans la table de jointure. DOnc, évidemment, vu comme ça c'est tout de suite mieux.

    J'ai adapté votre code au fichier et le fichier au code, et ce qui est étrange, c'est qu'il plante au même endroit que mon code, à la ligne où il faut inscrire les enregistrements, ligne que je ne maîtrise pas du tout puisque j'ai extrapolé à partir d'autres exemples que j'ai croisé sur le net :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Private Sub Commande34_Click()
    Dim i As Integer
     
    Dim pIdComponents As Integer, pIdEnvironment As Integer
    Dim oDb As DAO.Database
     
    pIdComponents = idComponents
    'Ma source de contrôle est directement le "idComponents" pour faire simple pour le moment
    Set oDb = CurrentDb
    For i = 0 To lstEnvironment.ListCount - 1
      pIdEnvironment = lstEnvironment.ItemData(i)
      If lstEnvironment.Selected(i) Then
        'Vérifie si le couple existe déja dans la table
        If DCount("[idComponents]", "[ComponentsEnvironment]", _
                "[idComponents]=" & pIdComponents & _
                " AND [IdEnvironment]=" & pIdEnvironment) = 0 Then
                'Insertion car inexistant
                oDb.Execute "INSERT INTO ComponentsEnvironment (idComponents,idEnvironment) " & _
                            "VALUES (" & pIdEnvironment & "," & pIdComponents & ")", dbFailOnError
    'Le bug se situe au niveau de cette ligne : "L'enregistrement correspondant est
    'requis dans la table 'Components' "; ce qui me semble très étrange, puisque dans
    'mon exemple j'ai pu vérifier que mon enregistrement
    'idComponents=18 existe bel et bien dans ma table 'components'
     
        End If
      Else
        'Demande la suppression au moteur
        oDb.Execute "DELETE FROM ComponentsEnvironment WHERE " & _
                    "idComponents=" & pIdComponents & " AND " & _
                    "idEnvironment=" & pIdEnvironment, dbFailOnError
      End If
     
    Next i
    End Sub

    Bon mon cas doit être un peu désespérant, dsl !

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Regarde ta requête INSERT, tu as croisé IdComponent et IdEnvironment avec pIdEnvironment et pIdComponment

    L'ordre est important car il défini les champs dans laquelle chaque valeur doit etre inscrite

    Mais tu es excusé, j'avais croisé aussi

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Bien joué !

    Ca marche impeccable, effectivement... en inversant j'avais l'enregistrement 2 dans idComponents, qui -pour le coup- n'existait vraiment pas.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    J'ai une question de forme une nouvelle fois, je pense que ça reste dans le domaine de la question générale de l'automatisation d'enregistrements donc je ne créé pas de nouveau sujet. Un modo pourra toujours scinder s'il pense que j'ai tort...



    Sur l'image ci-dessus, on peut voir que le processus élaboré ci-dessus est répété plusieurs fois pour plusieurs types de données, chaque "Components" étant relié à n "Environment", n "IntendedFunction" et n "AgeingMechanism", le tout de manière indépendante.

    Bon, l'idée est d'avoir 3 colonnes, avec à chaque fois zone de sélection multiple et enregistrement automatique de l'ensemble des sélections dans les 3 tables de jointure correspondante. Le code est au dessus, adapté à chaque table, ok.

    Deux solutions :

    - je peux crééer des formulaires de saisie pour chaque propriétés des Components à partir des tables de jointure, mais ce n'est pas très naturel que la source de contrôle soit l'identifiant de la table de jointure.

    - j'ai donc opté pour la création de formulaires à partir de la table "Components" afin que "idComponents" me permette de balayer l'ensemble des "Components" ce qui est très intuitif. J'ai donc créé :
    1. Un formulaire qui me permet de crééer les "Components".
    2. Un sous-formulaire qui me permet de gérer les relations "Components" <-> "Environement".
    3. Mais lorsque je créée le formulaire "Components" <-> "IntendedFunction", alors qu'il a la même structure que le formulaire du point 2., lorsque je passe en mode page, Access ne semble pas reconnaître idComponents comme source de contrôle et me sort une feuille blanche.
    4. Idem avec "AgeingMechanism".

    C'est embêtant car à terme, je voudrais que les formulaires 2. 3. et 4. soient intégrés comme sous-formulaires dans des onglets du formulaire 1. qui permettrait donc de gérer la création des Components et de leur Propriétés.

    (Par ailleurs, j'ai aussi tenté d'insérer les champs idIntendedFunction / idAgeingMechanism et idEnvironment directement dans le formulaire 1. Le problème reste le même : tant qu'on se limite à l'un d'entre eux, ça marche, dès qu'on en met plus d'un, on retrouve le même problème que le point 3)

    Des suggestions ?

    Merci !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Pour ceux que ça intéresse la solution est simple, prenons le couple "Components/Environment".

    1. Créer un formulaire avec comme source une requête simple sur les components (afin que le contrôle se base sur idComponents)

    2. Une zone de liste à sélection multiple indépendante prenant comme valeur :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Environment.idEnvironment, Environment.name FROM Environment order by name;

    Et se servir de la fonction décrite ci-dessus.

    Eventuellement mettre un tableau récapitulatif par requête components & environment.

    Résolu !

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Arf, désolé, je n'avais pas précisé que la zone de liste doit être indépendante

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    J'en suis pas mort.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modification enregistrement sur formulaire
    Par JeanMikael dans le forum VBA Access
    Réponses: 0
    Dernier message: 26/09/2007, 12h09
  2. Ajout d'enregistrement sur formulaire filtré
    Par bestall666 dans le forum IHM
    Réponses: 2
    Dernier message: 20/02/2007, 10h42
  3. barre d'enregistrement sur formulaire
    Par By-nôm dans le forum Access
    Réponses: 3
    Dernier message: 10/07/2006, 16h14
  4. Réponses: 16
    Dernier message: 16/05/2006, 10h28
  5. Réponses: 19
    Dernier message: 26/01/2006, 08h44

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