Generateur automatique de code dans Access

Résolu
Math_Love Messages postés 12 Statut Membre -  
random Messages postés 1612 Statut Membre -
Bonjour.
Mon probleme n'est certainemnt pas si complique que ca. mais je ne reussi pas bien à le résoudre.
Voila disons que j'ai une Table Access "Eleves" avec 11 Eleves: A,B,C,D,E,F,G,H,I,J,K.

Structure de la Table Elèves: NomEleve,ClasseEleve,NumeroGroupe

Je voudrai que Access me répartisse automatiquement ces élèves par groupe de 3. C'est à dire:

Groupe 1: A,B,C
Groupe 2: D,E,F
Groupe 3: G,H,I
Groupe 4: J,K
de sorte que dans la structure de la table "Elèves" le champs NumeroGroupe puisse contenir automatiquement le numero de groupe de chaque élève.

Je suis certain que c'est pas très comliqué mon truc, mais je suis débutant en programmation.

Merci de vos coups de pouce.
Math.

4 réponses

  1. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    salut

    c'est en effet pas compliqué du tout

    il te suffit de créer une table groupe ayant comme champs, le n° de groupe et une référence vers l'élève avec une relation de 1 (le groupe) à plusieurs (les élèves).
    3
    1. Math_Love Messages postés 12 Statut Membre
       
      Merci Choubaka, Je vais essayer ta proposition.

      Math
      0
  2. Utilisateur anonyme
     
    ce ne doit pas être bien difficile en effet.
    Pour remplir tous les champs d'une table automatiquement en programmation il
    faut (en access 97):

    ouvrir un recordset avec ta table

    dim db as database
    dim matable as recordset
    set db = currentdb
    set matable = db.openrecordset (« eleves »)

    balayer un par un tous les champs

    with matable
    while .eof = false
    .
    .
    insértion du code ci dessous
    .
    .
    .movenext
    wend

    editer le champ et lui donner la valeur voulue prise dans la variable vnumero

    .edit
    !NumeroGroupe = vnumero
    .update

    calculer la valeur de la variable

    le plus simple : compter les enregistrements,diviser par 3 et donner ce numero au groupe

    au début

    dim vcompte as integer
    vcompte = 1

    après while ...

    vnumero = vcompte / 3

    avant wend

    vcompte=vcompte + 1

    J'espère avoir été clair car j'ai décomposé les actions pour expliquer le principe. Il faut remettre les lignes dans l'ordre.

    maintenant il faut déterminer plusieurs choses dans le fonctionnement de ta base
    cette manip doit elle servir une fois ou plusieurs
    dans ce cas, l'ancien numéro doit il être conservé
    le numéro de groupe à t'il de l'importance par rapport aux élèves (ce n'est pas le cas dans l'exemple)
    comment veux tu déclencher cette action (bouton dans un formulaire, ...)
    0
    1. Math_Love Messages postés 12 Statut Membre
       
      Merci Jean. je me mets au travail tout de suite.
      Math
      0
    2. Math_Love Messages postés 12 Statut Membre
       
      Salut Jean. J'ai essayé ton programme, tout le weekend, mais je me suis heurté à un problème de compilation avec les variables et les déclarations (surtout les commandes SET et DIM) . Pourrais-tu s'il te plait, me redonner ton programme tout entier sans le subdiviser exactement comme il devrait être saisi, et mettre les explications en fin de page ? Pour lancer cette opération comme tu me le demandais , ca se fera à partir d'un boutton sur un formulaire du genre : "Regrouper les élèves"Voici les lignes de programmes que tu m'a envoyé samedi dernier:

      ouvrir un recordset avec ta table

      dim db as database
      dim matable as recordset
      set db = currentdb
      set matable = db.openrecordset (« eleves »)

      balayer un par un tous les champs

      with matable
      while .eof = false
      .
      .
      insértion du code ci dessous
      .
      .
      .movenext
      wend

      editer le champ et lui donner la valeur voulue prise dans la variable vnumero

      .edit
      !NumeroGroupe = vnumero
      .update

      calculer la valeur de la variable

      le plus simple : compter les enregistrements,diviser par 3 et donner ce numero au groupe

      au début

      dim vcompte as integer
      vcompte = 1

      après while ...

      vnumero = vcompte / 3

      avant wend

      vcompte=vcompte + 1
      Merci de m'aider encore Jean.
      A Plus
      0
    3. Utilisateur anonyme
       
      Le problème avec access c'est que ce qui marche dans une version, ne marche plus dans l'autre. Apparement, tu es en access 2000 ou 2002.
      J'ai access 2002 au boulot et effectivement ça plante. Le plus beau, c'est que lorsque je convertis une base 97 programmée de la même manière, je n'ai pas l'erreur. J'ai mis un ami programmeur de métier sur le coup. Je te tiens au courant.
      0
    4. Utilisateur anonyme
       
      J'ai fait des test et utilisé l'exemple envoyé par mon ami. Apparement, il ne faut plus utiliser database mais connection. Lorsque j'arrive à passer ce cap, le programme butte sur la proprièté edit du recordset qui semble gérée différement. Je te confirme que les lignes ci-dessous marchent en access 97 et sous access 2002 une fois la base convertie mais pour programmer proprement il ne faut plus utiliser les mêmes objets et méthodes. Je n'ai access 2002 qu'au boulot et je ne peux donc pas passer aussi longtemps dessus que je le voudrais. J'espère arriver à finir demain.
      En tous cas cela confirme tout à fait ce que je pensais d'access, c'est une vraie vérole avec ses versions différentes. J'en arrive à passer plus de temps à convertir la base que j'ai créée pour le boulot pour que cela fonctionne chez mes différents utilisateurs qui n'ont pas tous la même version qu'a travailler sur le programme lui même.
      Dès que je peux, je passe à python.

      ci joint le code qui marche sous 97 en attendant.

      Dim db As Database
      Dim matable As Recordset
      Dim vnumero As Integer
      Dim vgroupe As Integer
      Set db = CurrentDb
      Set matable = db.OpenRecordset("eleves")
      With matable
      vnumero = 1
      While .EOF = False
      .Edit
      vgroupe = vnumero / 3
      !numerogroupe = vgroupe
      .Update
      .MoveNext
      vnumero = vnumero + 1
      Wend
      End With
      0
  3. Utilisateur anonyme
     
    après quelques déboires (l'aide d'access ne marchait pas au boulot) voici quelque chose qui marche en access 2002. Le principe est toujours le même, c'est la façon d'ouvrir le recordset qui change. Je ne suis pas certain que ce soit la meilleure façon de procéder en access 2002 mais ça marche.

    Sub groupe()
    Dim cn As ADODB.Connection
    Dim matable As ADODB.Recordset
    Dim vnumero As Integer
    Dim vgroupe As Integer
    Set matable = New ADODB.Recordset
    Set cn = Application.CurrentProject.Connection
    matable.Open "eleves", cn, adOpenKeyset, adLockOptimistic
    With matable
    vnumero = 3
    While .EOF = False
    vgroupe = vnumero / 3
    !groupe = vgroupe
    .Update
    .MoveNext
    vnumero = vnumero + 1
    Wend
    End With
    matable.Close
    End Sub
    0
    1. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Salut,

      si l'ancienne méthode ne marche pas, c'est sans doute que tu n'as pas validé dans le menu 'references' (accessible par le menu 'outils' quand tu es dans le code), Microsoft DAO x.x object library...

      Avec ça, on peut utiliser le code des anciennes versions (et surtout le openrecordset)
      0
  4. random Messages postés 1612 Statut Membre 155
     
    on ajoute à la table un champ numéro auto nommé clef
    on fait tourner cette requête
    PARAMETERS [taille des groupes] Short;
    UPDATE matable SET matable.groupe = Right(Partition([clef],1,100,3),Len(Partition([clef],1,100,[taille des groupes]))-InStr(Partition([clef],1,100,3),":"))\[taille des groupes];
    on supprime cleg
    0