1. #21
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    j'ai réussi à remplir ma table PARTICIPATION en fonction des données copiées à partir d'une requête qui liait la table INSCRIPTION et la table PERSONNE.

    Comme cela j'ai pu résoudre mon problème d'hier ou je n'avais pas les ID.personne en relation avec les NOM.personne


    Ta Table des personnes ?
    Ta Table des inscriptions ?
    Tbl Personne
    - Personne ID (clé primaire)
    - Structure
    - Nom

    Tbl Inscription
    - Inscription ID (clé primaire)
    - Nom (de la personne)
    - Decison ( un critère non évoqué pour simplifié ma demande)
    - Formation ID
    - Année
    - NumChoix

    La requete m a permis de lié PERSONNE et INSCRIPTION avec une jointure sur le Nom qui est identique dans les deux tables, j'ai pu ensuite ajouter à PARTICIPATION les enregistrements suivant pour la remplir :

    - Formation ID
    - Personne ID
    - Année
    - NumChoix

    Ensuite j'ai fait copier/coller du résultat obtenu dans la requête dans la table PARTICIPATION

  2. #22
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Ensuite j'ai fait copier/coller du résultat obtenu dans la requête dans la table PARTICIPATION
    Ok l'idée initiale était de faire la copie par code mais l'important c'est le résultat.

    As-tu besoin d'aide pour la partie "optimisation" ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    Ah oui je veut bien

    car là c'est un cran au dessus, autant je me débrouille avec quelques fondamentaux d'access autant le VBA, les modules je ne suis pas du tout au niveau pour le moment mais cela me permet de m apprendre

  4. #24
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Bonjour.

    Pour les noms internes je recommande de se limiter
    • aux lettres majuscules et minuscules sans accent ni "décoration" (pas de ç).
    • aux chiffres
    • au souligné (_)


    Même si Access accepte d'autres caractères, ils sont parfois source de bugs sournois et vicieux.
    De plus ces limitations facilitent les échanges avec d'autres systèmes comme Excel.

    Si tu as besoin de textes plus agréables pour les humains les formulaires et leurs étiquettes sont là pour cela.

    Bon revenons à ton problème.

    Je remets les étapes pour rappel :

    1. Puis je sélectionnerai toutes les Participation avec NumChoix=1 qui ont un nombre de participants > Limite (ex : 25)
      Pour chacune de ces Participation je regarderai chacune des personnes.
      Si je trouve une Participation pour la même personne avec NumChoix>1,
      alors j'élimine cette personne
      Si je suis maintenant <= Limite, j'arrête le parcourt des personnes.
    2. Puis je sélectionnerai de nouveau toutes les particpation avec NumChoix=1 qui ont un nombre de participants > Limite (ex : 25)
      Pour chacune de ces Participation je regarderai chacune des personnes.
      Si je trouve une Participation pour la même personne avec année=année courante-1 ou année=année courante-2
      alors j'élimine cette personne
      Si je suis maintenant <= Limite, j'arrête le parcourt des personnes.
    3. Tu répètes l'oppération (personne inscrite à d'autres formations, personnes qui a déjà eu la formation) pour chacun des NumChoix
    4. En final pour chacun des NumChoix, tu fais une nouvelle ronde pour t'assurer qu'une personne qui est dans Participation avec un NumChoix X n'a pas de participation dans un NumChoix > X. Cela fait en sorte qu'une personne n'a qu'une et une seule formation.


    Et je mets la solution dans les prochains messages.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #25
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Bonjour.

    Je pense que mon 1er algorithme n'est finalement pas le meilleur.

    Voici une version que je pense plus simple.

    Les nouvelles étapes sont :

    1. supprime la personne de la participation à la formation si il y a trop de personnes et si la personne est inscrite à une participation avec un NumChoxi inférieur.
    2. supprime la personne de la participation à la formation si il y a trop de personnes et si la personne a déjà été présente à la même formation dans les 2 année précédentes.
    3. Supprime les personnes qui ont plus d'une participations aux formations dans l'année.
      Ne conserve que la formation dont le NumChoix est le plus petit.


    Il te faut 3 requêtes et 3 procédures (+1 de test).

    reqFormationTropEtudiant
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tblParticipation.*, DCount("PersonneId","tblParticipation","[Annee]=" & [prmAnnee] & " and [FormationId]=" & [tblParticipation].[FormationId])+0 AS NbEtudiant
    FROM tblParticipation
    WHERE (((DCount("PersonneId","tblParticipation","[Annee]=" & [prmAnnee] & " and [FormationId]=" & [tblParticipation].[FormationId])+0)>=[prmNbEtudiantMax]) AND ((tblParticipation.Annee)=[prmAnnee]))
    ORDER BY tblParticipation.FormationId, tblParticipation.NumChoix DESC , tblParticipation.PersonneId;

    Donne la liste des étudiants qui sont dans des formations dont le nombre d'étudiants dépasse le max.

    Note : prm est une abréviation personnelle pour paramètre.

    reqDoubleFormationAnnee
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tblParticipation.PersonneId, tblParticipation.NumChoix
    FROM tblParticipation
    WHERE (((tblParticipation.NumChoix)>DMin("NumChoix","tblParticipation","[PersonneId]=" & [tblParticipation].[PersonneId])) AND ((tblParticipation.Annee)=[prmAnnee]));

    Donne la liste des formations en double pour chaque étudiant qui en a.

    reqSupprimerDoubleFormationAnnee
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE reqDoubleFormationAnnee.*
    FROM reqDoubleFormationAnnee;

    Supprime les formations en double
    Elle va hériter de prmAnnee de reqDoubleFormationAnnee

    et le code pour faire le ménage à mettre dans un module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Compare Database
    Option Explicit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Test_Supprimer()
        'Procédure de test permet d'exécuter avec les valeurs voulues.
        ' Faire une sauvegarde des données de tblParticipation avant
        Call Supprimer(2018, 25)
    End Sub
     
    Public Sub Supprimer(prmAnnee As Long, prmNbMaxEtudiant As Long)
        Call SupprimerTropEtudiant(prmAnnee, prmNbMaxEtudiant)
        Call SupprimerDoubleFormation(prmAnnee)
    End Sub
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Private Sub SupprimerTropEtudiant(prmAnnee As Long, prmNbMaxEtudiant As Long)
        Dim db As DAO.Database: Set db = CurrentDb
        Dim q As DAO.QueryDef: Set q = db.QueryDefs("reqFormationTropEtudiant")
        Dim r As DAO.Recordset
     
        q.Parameters("prmAnnee") = prmAnnee
        q.Parameters("prmNbMaxEtudiant") = prmNbMaxEtudiant
     
        '=== Supprime les multi-inscrits
        Set r = q.OpenRecordset(dbOpenDynaset)
     
        Do While Not r.EOF
            'Est-ce que cette personne a une participation < NumChoix
            If Not IsNull(DFirst("PersonneId", "tblParticipation", "[Annee]=" & r![Annee] & " and [NumChoix]<" & r![numChoix])) Then
                'oui, elle a une participation pour une autre formation qu'elle préfère
                ' on peut la supprimer de celle-ci
                r.Delete
            End If
     
            If DCount("PersonneId", "tblParticipation", "[FormationId]=" & r![FormationId]) <= prmNbMaxEtudiant Then
                'Ok on est en dessous de la limite plus besoin de faire du ménage.
                Exit For
            End If
     
            r.MoveNext
        Loop
     
        r.Close: Set r = Nothing
        '--- Supprime les multi-choix
     
        '=== Supprime les participations précedentes
        Set r = q.OpenRecordset(dbOpenDynaset)
     
        Do While Not r.EOF
     
            'Est-ce que cette personne a une participation en Annee-1 et Annee-2
            'J'utilise between qui pemet de définir un interval, il est alors facile de changer les frontières si on décide d'ajoutre des années.
            If Not IsNull(DFirst("PersonneId", "tblParticipation", "[Annee] between " & r![Annee] - 2 & " and " & r![Annee] - 1 & " and [EstPresent]=True")) Then
                'oui, elle a participé à la même formation dans les années précédentes
                ' on peut la supprimer de celle-ci
                r.Delete
            End If
     
            If DCount("PersonneId", "tblParticipation", "[FormationId]=" & r![FormationId]) <= prmNbMaxEtudiant Then
                'Ok on est en dessous de la limite plus besoin de faire du ménage.
                Exit For
            End If
     
            r.MoveNext
        Loop
     
        r.Close: Set r = Nothing
        '--- Supprime les participations précedentes
     
        Set q = Nothing
        db.Close: Set db = Nothing
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub SupprimerDoubleFormation(prmAnnee As Long)
        'Supprime les formations des personnes qui sont inscrites à plus d'une formation dans l'année.
        ' Ne garde que la "1ère" dans l'ordre des NumChoix.
        Dim db As DAO.Database: Set db = CurrentDb
        Dim q As DAO.QueryDef: Set q = db.QueryDefs("reqSupprimerDoubleFormationAnnee")
        q.Parameters("prmAnnee") = prmAnnee
        Call q.Execute(dbFailOnError)
        Set q = Nothing
        db.Close: Set db = Nothing
    End Sub
    Je n'ai pas tester le code mais cela devrait marcher.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    Merci je m'y remet je suis en train d'analyser ton code pour le comprendre.

    dans la première requête :

    PrmAnnee je le remplace par une valeur donc l'année des nouvelles formations

    PrmNbEtudiantMax je le remplace par le nombre de place

  7. #27
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Bonjour.

    Le remplacement des paramètres se fait par l'appelle de la procédure Supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Supprimer(2018, 25)
    C'est la procédure qui se charge d'appeller les requêtes avec les valeurs choisies.
    Cela te permet facilement de changer l'année ou la limite sans rien modifier ailleur.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #28
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    Ha oui d'accord donc il faut que je fasse tout d'un coup à commencer par les procédures.

    j'étais en train de tester la première requête comme ça toute seule

  9. #29
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Bonjour.

    j'étais en train de tester la première requête comme ça toute seule
    Oui tu peux et, en effet, il faut dans ce cas fournir les valeurs (ex : 2018 et 25) demandées.
    C'est d'ailleur une des méthodes utilisées comme interface avec l'utilisateur.

    Désolé j'avais mal compris le sens de ta question.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    1 - Pour la première requête :


    reqFormationTropEtudiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tblParticipation.*, DCount("PersonneId","tblParticipation","[Annee]=" & [prmAnnee] & " and [FormationId]=" & [tblParticipation].[FormationId])+0 AS NbEtudiant
    FROM tblParticipation
    WHERE (((DCount("PersonneId","tblParticipation","[Annee]=" & [prmAnnee] & " and [FormationId]=" & [tblParticipation].[FormationId])+0)>=[prmNbEtudiantMax]) AND ((tblParticipation.Annee)=[prmAnnee]))
    ORDER BY tblParticipation.FormationId, tblParticipation.NumChoix DESC , tblParticipation.PersonneId;
    Lorsque j'entre les valeurs manuellement pour les paramètres, j'obtiens une erreur : L'expression entrée comme paramètre est à l origine de l'erreur suivante " Microsoft ne parvient pas à trouver le nom là y a la référence d'une formation et j'ai des multiples fenêtres qui se succèdent pour chaque référence de formation.

    pour moi cela doit se jouer à ce niveau là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    
    SELECT tblParticipation.*, DCount("PersonneId","tblParticipation","[Annee]=" & [prmAnnee] & " and [FormationId]=" & [tblParticipation].[FormationId])+0 AS NbEtudiant
    FROM tblParticipation

    2 - Le module va donc intervenir sur le contenu de la table participation en supprimant notamment des entrées si j'ai bien compris ?

  11. #31
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Oui c'est l'idée.

    Dans la 1ère passe on ne s'occupe pas de savoir si la personne "Participe" à plusieurs formations la même année.
    Puis on l'élimine si elle est surnuméraire et participe à d'autres formations ou si elle a déjà participé à la formation dans les 2 ans.
    Ensuite on fait un nouveau passage pour éliminer les personnes qui sont inscrites à plusieurs formations mais qui ne sont pas surnuméraires.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    Donc la première requête ne peut pas fonctionner toute seule il faut l'appeler via le module

  13. #33
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Tu peux appeler toutes les requête à la main en "donnant" les paramètres qu'elles attendent.
    Il faut par contre les appeller dans le bon ordre sinon tu vas avoir des résultats incohérents.
    La procédure fait cela pour toi.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    avril 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : avril 2015
    Messages : 62
    Points : 9
    Points
    9

    Par défaut

    Oui c est ce que j'ai fais sur la première, entrant 2018 pour l'année et 25 pour le chiffre et j'ai le message d'erreur

  15. #35
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    11 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 11 834
    Points : 17 898
    Points
    17 898

    Par défaut

    Bonjour.

    Si cela ne te pose pas de problème, pourrais-tu m'envoyer ta BD sur mon courriel perso.
    Zippé la BD.

    Je te l'envoi en message privé.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [AC-2007] Création base de donnée pour gérer inscriptions des étudiants
    Par eternal1001 dans le forum Modélisation
    Réponses: 18
    Dernier message: 25/05/2015, 16h40
  2. aide pour les changement des labels des icones de mon menu
    Par Invité dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 15/08/2009, 01h45
  3. Réponses: 14
    Dernier message: 06/07/2007, 11h51
  4. Réponses: 2
    Dernier message: 28/06/2007, 18h00

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