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

Modélisation Discussion :

Problème de table de jonction - Formulaire - Sous Formulaire


Sujet :

Modélisation

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de table de jonction - Formulaire - Sous Formulaire
    Bonjour,

    Je cherche à créer sous access 2013 une base de gestion parc informatique ( PC, logiciels et maintenance).

    La base est conçue comme ci-dessous :
    Nom : relations access.jpg
Affichages : 622
Taille : 85,8 Ko

    Le problème est quand je crée un formulaire Ordi avec juste les 3 premiers champs de la table Ordinateurs, j'essaye d'insérer un sous formulaire permettant d'afficher et de choisir les logiciels installés sur le poste.

    J'arrive à afficher les logiciels mais impossible via une liste déroulante d'insérer de nouveaux logiciels ( issus de ma table logiciel).

    Nom : logiciels.jpg
Affichages : 361
Taille : 35,6 Ko

    Quelqu'un aurait il une solution?


    Merci d 'avance.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonsoir,

    C'est logique vu les relations entre tes tables. Tu ne peux ajouter de "nouveau logiciels" parce que la nouvelle valeur n'a pas de clé primaire dans ta table logiciel.
    Fais une recherche dans l'aide sur l'évènement NotInList ou Absence dans liste ou regarde la FAQ ICI qui t'apporterait la solution.

    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut merci
    Merci pour ta réponse.
    Je vais essayer de voir ça .

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour désolé,

    J'ai tenté de voir ou cela ne fonctionnait pas mais en vain.

    Serait ce possible que quelqu'un puisse résoudre mon problème sur la base jointe ?

    Gestion PC1.rar

    Un grand merci d'avance !

  5. #5
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 84
    Points : 107
    Points
    107
    Par défaut
    Bonjour,

    Voilà une solution, ce n'est peut être pas la meilleure mais c'est la plus simple à mettre en œuvre que je connaisse (si tu commence à avoir énormément de logiciels dans la liste, il faudrait envisager de pouvoir filtrer le contenu de la liste déroulante...)

    Gestion PC1.rar
    Il y a 10 types de personnes dans le monde : ceux qui comptent en binaire et les autres.

  6. #6
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Nono02P, loic2810 bonjour

    Nono02P : ta solution fonctionne très bien mais trouve rapidement ses limites (sélection unique, rattrapage d'erreur en cas de doublons). Je propose une approche différente permettant d'afficher une sélection multiple n'affichant que les logiciels disponibles (non affectés au poste). La partie droite de l'écran affichant les logiciels affectés ainsi nous pourrions obtenir ce type d'ihm.

    Nom : Capture.JPG
Affichages : 345
Taille : 50,9 Ko

    La première liste (logiciels dispponibles) est nourrie par une requête de type Not in :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT Logiciels.Idlogiciel,
           Logiciels.Nom,
           Logiciels.Version
    FROM Logiciels
    WHERE (((Logiciels.Idlogiciel) NOT IN (
      SELECT LogicielOrdinateur.IdLogiciel
      FROM LogicielOrdinateur WHERE (((LogicielOrdinateur.Idposte)=[Forms]![Ordinateurs2]![Idposte]));
     
    )))
    ORDER BY Logiciels.Nom,
             Logiciels.Version;

    La seconde liste (logiciels affectés) par celle-ci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Logiciels.Idlogiciel,
           Logiciels.Nom,
           Logiciels.Version
    FROM Logiciels
    INNER JOIN LogicielOrdinateur ON Logiciels.Idlogiciel = LogicielOrdinateur.IdLogiciel
    WHERE (((LogicielOrdinateur.Idposte)=[Forms]![Ordinateurs2]![IdPoste]));

    Il nous reste plus qu'à implémenter le code permettant d'ajouter les logiciels sélectionnés :

    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
    Private Sub Bt_add_Click()
    If Me.Lb_Disponible.ListIndex >= 0 Then
        For i = 0 To Me.Lb_Disponible.ListCount - 1
            If Me.Lb_Disponible.Selected(i) Then
            'Msg = Msg & Me.Lb_Disponible.ItemData(i) & "-" & Me.Lb_Disponible.Column(0, i) & "-" & Me.Lb_Disponible.Column(1, i) & vbCrLf
            '
            Me.Lb_Disponible.Selected(i) = False
            '
            reponse = insert_Logiciels(Me.Lb_Disponible.Column(0, i), Me.idposte)
            '
            End If
        Next i
        '
        Call LB_Refresh
        '
    End If
    End Sub
    L'appel de la fonction d'insertion :

    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
    Function insert_Logiciels(Logiciel_Id As Long, Poste_id As Long) As Boolean
    '
    ' Fonction d'insertion des privileges par groupe dans la table de regroupement TJ_USR_PrivilegesGroupes
    '
    On Error GoTo Err_insert_Logiciels
    Dim R_Sql As String
    '
        insert_Logiciels = False
        '
            R_Sql = "INSERT INTO LogicielOrdinateur " & _
            "(IdLogiciel, Idposte) " & _
            " VALUES (" & _
            "" & Logiciel_Id & ", " & _
            "" & Poste_id & "" & _
            ")"
        '
        CurrentDb.Execute R_Sql, dbFailOnError
        insert_Logiciels = True
        '
        Exit Function
    Err_insert_Logiciels:
        MsgBox Err.Description
        insert_Logiciels = False
        Exit Function
    End Function
    End Function
    ainsi que le code concernant la suppression :

    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 Bt_Retry_Click()
    '
    ' Fonction de suppression des privileges
    '
    Dim reponse As Integer
    '
     
    ' Me.Zl_Affected.ListIndex retourne -1 si aucune sélection dans la boite liste
    ' http://office.microsoft.com/fr-fr/access-help/listindex-propriete-HA001232756.aspx
    '
    If Me.LB_Affecte.ListIndex = -1 Then
      reponse = MsgBox("Vous devez sélectionner des lignes", vbInformation + vbOKOnly, "Erreur Sélection")
      Exit Sub
    End If
    '
    If Me.LB_Affecte.ListIndex >= 0 Then
        For i = 0 To Me.LB_Affecte.ListCount - 1
            If Me.LB_Affecte.Selected(i) Then      ' verifie si la ligne a été sélectionnée
                '
            ' Recupere l'id Logiciel
            '
                Me.LB_Affecte.Selected(i) = False
                '
                reponse = Delete_Logiciels(Me.LB_Affecte.Column(0, i), Me.idposte)
            End If
        Next i
        '
        Call LB_Refresh ' rafraichir les 2 listes
    End If
    End Sub
    L'appel de la fonction permettant de retirer des logiciels précédemment affectés :

    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
    Function Delete_Logiciels(Logiciel_Id As Long, Poste_id As Long)
    '
    ' Fonction d'de suppression des privileges par groupe dans la table de regroupement TJ_USR_PrivilegesGroupes
    '
    On Error GoTo Err_Delete_Privileges
    '
    Dim R_Sql As String
    '
        R_Sql = "DELETE LogicielOrdinateur.* From LogicielOrdinateur WHERE (((LogicielOrdinateur.IdLogiciel)=" & Logiciel_Id & ") AND ((LogicielOrdinateur.Idposte)=" & Poste_id & "));"
        '
        CurrentDb.Execute R_Sql, dbFailOnError
        Delete_Logiciels = True
     
        Exit Function
    Err_Delete_Privileges:
        MsgBox Err.Description
        Delete_Logiciels = False
        Exit Function
    End Function
    A noter la procédure LB_refresh permettant de rafraîchir le contenu des deux zones de liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub LB_Refresh()
        Me.LB_Affecte.Requery
        Me.Lb_Disponible.Requery
    End Sub
    J'ai conservé le formulaire Ordinateur1 correspond à la proposition de Nono02P (plus simple à mettre en oeuvre), et la mienne (niveau plus averti) dans un formulaire Ordinateur2.

    Ci-joint ma version

    Cordialement

    Jimbolion
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  7. #7
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 84
    Points : 107
    Points
    107
    Par défaut
    Ta solution est simple à mettre en place, efficace, propre !
    J'adore, je me permets de récupérer l'idée pour l'adapter sur ma bd (si tu n'y vois pas de soucis bien sûr)

    Merci !

    Jimbolion --> Je suis nouveau (pour poster des messages) mais je consulte depuis un petit moment le site !
    Sans le savoir tu m'a déjà aidé à plusieurs reprises, et je t'en remercie pour ce partage =)
    Il y a 10 types de personnes dans le monde : ceux qui comptent en binaire et les autres.

  8. #8
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Nono02P

    Si j'avais voulu garder çà pour moi, je n'aurai jamais publié !

    Donc profites-en, adapte à ton aise et éclate toi

    Si j'ai pu t'aider par le passé, ben j’aurai réussi une partie de ma mission

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

Discussions similaires

  1. [AC-2010] Formulaire - Sous formulaire - Sous sous formulaire
    Par meli74 dans le forum IHM
    Réponses: 1
    Dernier message: 21/04/2011, 19h35
  2. Réponses: 4
    Dernier message: 11/04/2007, 18h46
  3. formulaire/sous formulaire/sous formulaire
    Par aimejielle dans le forum Access
    Réponses: 1
    Dernier message: 24/07/2006, 22h48
  4. Réponses: 1
    Dernier message: 10/07/2006, 09h15
  5. Mise à jour d'une table à partir d'un sous formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 02/11/2005, 20h07

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