Gestion de notes d?élèves?

2»

Réponses

  • TiffTiff Membre
    21:59 modifié #32
    Si, importer et exporter, avec choix des caractères de séparation des champs et des enregistrements. Idéal pour les tableurs par exemple.
    [EDIT]
    Rigolo, mon message de 8h58 s'affiche avant celui de 8h04.
  • cestlogiquecestlogique Membre
    mai 2005 modifié #33
    Hello!

    Me voilà  de retour sur ce projet, maintenant que CoreData est disponible.

    Maintenant je comprends tout à  fait les conseils de ClicCool et la philosophie des tables. Il m'a fallu une après-midi seulement pour construire mon modèle de données dans Xcode alors que dans ma tête ou sur papier je n'étais parvenu à  rien ces derniers mois.

    Après une semaine d'étude et de tests, j'arrive à  gérer les données par tables mais la représentation synthétique d'un tableau de notes me pose problème.

    Voici les entités concernées par le problème et leurs relations:
    • Groupe relations: eleves; devoirs.
    • Eleve relations: groupe; notes.
    • Devoir relations: groupe; notes.
    • Note relations: eleve; devoir.


    Supposons que mon tableau doit représenter les notes de la 4eA:
    A En colonne à  gauche j'affiche les noms des élèves de cette classe.
    B Chaque colonne correspond à  un devoir.
    C Sur sa ligne, chaque élève affiche sa note pour chacun des devoirs.

    On voit tout de suite que cela ne cadre pas avec l'utilisation normale des TableView où les colonnes représentent des attributs d'une série d'objets. Par ailleurs, étant donné que le nombre de devoirs est imprévisible, on ne peut pas binder les colonnes dans IB. Tout se passe programmatiquement (chouette!).

    Sauf si vous avez une meilleure idée, je me suis rendu à  l'évidence qu'il fallait mettre les noms dans une TV, les titres et attributs des devoirs (coeff. ...) verticalement dans une 2e TV et enfin une 3e TV pour les notes elles-mêmes. Un problème ultérieur sera donc de faire défiler la 1re et la 3e simultanément... (Voir capture jointe.)

    Je n'ai toujours pas compris comment trier un tableau directement dans IB, sauf en utilisant un SearchField alors j'utilise setFetchPredicate: d'NSObjectController: pour trouver les élèves dont le groupe est '4eA'.

    J'obtiens également sans problème programmatiquement tous les devoirs dont le groupe est '4eA', je crée le nombre de colonnes nécessaires que je nomme, dans l'unique ligne de ce tableau je donne le coeff. de chaque devoir (on pourrait prévoir d'autres lignes pour la date, etc.).

    À propos, j'aimerais plutôt les référencer par objectID (pour éviter de devoir appeler chaque devoir différemment) mais on ne peut pas accéder à  objectID par keypath, c'est pas très pratique.

    ça se complique pour trouver et afficher les notes en fonction du devoir et de l'élève concernés. À quoi peut bien ressembler la requête? J'ai cru comprendre qu'on ne peut pas insérer arbitrairement une valeur dans une case donnée d'une TV, j'ai donc essayé d'utiliser une dataSource et là  c'est le parcours du combatant: je récupère toutes les notes dont le devoir correspond à  la première colonne en me servant du nom du devoir que j'ai donné comme identifiant à  la colonne. Mais comment faire correspondre les notes obtenues avec chaque élève? Et comment gérer le tri et forcer les autres colonnes à  se mettre à  jour? S'il faut tout gérer par code?

    Je pense que ce qu'il faudrait c'est un bon tuto sur les fetchRequests et fetched Properties dans Xcode et comment les utiliser dans IB ou dans le code. Je sens bien que des tas de choses sont possibles mais la doc Apple s'arrête bien avant cela.

    Si vous avez des pistes?

    [Fichier joint supprimé par l'administrateur]
  • ClicCoolClicCool Membre
    21:59 modifié #34
    Salut cestlogique,

    J'ai pas eu trop le temps de comprendre et approfondir au mieux ta situation mais juste 2 choses:

    - Dans ton modèle il me semble que pour ce qui est des relations je mettrais plutot:
    Devoir: relation avec groupes, notes et élèves
    Notes: relation avec devoir
    ça me semble plus cohérent par apport à  la réalité, faut se méfier des relations dans tous les sens qui finissent parfois par provoquer des incohérences ....

    - On peut mettre plusieurs "sources" dans une seule tableView (dans la mesure bien sur où la relation appelée est "vers UN").
    Par exemple suposons que tu ais une entité Classe et une entité Eleve chacune avec son arrayCtrl convenablement bindée sur le ManagedObjectContext.
    L'entité Classe ayant un attribu nom (de la classe) et une relation eleve (vers N ou "to-Many" en anglais)
    L'entité Eleve ayant un attribut nom (de l'élève) et une relation classe (vers UN ou "to-One en anglais) inverse de la relation issu de Classe bien sur.

    Dans ta tableView (affichant en premier lieu les élèves et tirant parti de la relation vers UN dirigée vers l'entité Classe)
        - Tu peux avoir une colonne affichant le nom de tous les élèves (éventuellement filtrés) en bindant comme d'hab la colonne:
              . Value sur ElevesCtrl/ArangedObjects/nom
        - ET une colonne affichant LA Classe de chaque élève en bindant la colonne:
              . Content: ClasseCtrl/ArrangedObjects
              . ContentValues: ClasseCtrl/ArrangedObjects.nom
              . SelectedObject: EleveCtrl/ArrangedObjects.classe

    Tant que tu n'appèles que des relations "vers UN" tu peux, dans une TableView "parcourir" les liens tissés entre tes entités.

    (Une relation "vers N" n'étant pas adaptée à  la présentation en tableau)

    @+ :)

    P.S. il me semble que j'avais un 3 ème truc à  te dire mais je ne m'en souviens plus :(
    Si ça me revient et que ça un certain interrêt je posterais à  nouveau.
  • cestlogiquecestlogique Membre
    21:59 modifié #35
    dans 1115921939:

    - Dans ton modèle il me semble que pour ce qui est des relations je mettrais plutot:
    Devoir: relation avec groupes, notes et élèves
    Notes: relation avec devoir
    ça me semble plus cohérent par apport à  la réalité, faut se méfier des relations dans tous les sens qui finissent parfois par provoquer des incohérences ....


    Merci pour ta réponse. En effet mon modèle est peut-être incohérent. D'ailleurs je ne sais plus quelle entité a refusé de créer une interface automatiquement par option-déplacer ves IB...

    Cependant, si une note n'a de relation qu'avec le devoir correspondant, comment savoir quel élève a obtenu cette note à  ce devoir?

    Mon idée c'était qu'il n'existe qu'un devoir mais plusieurs notes à  ce devoir, une pour chaque élève l'ayant fait. Bien sûr on a ensuite également un seul devoir d'un autre nom, fait par un seul groupe et par tous les élèves du groupe.

    Où est mon erreur alors?

    Sinon pour ce que je veux faire, j'y suis presque. Dans IB j'arrive à  afficher dans une colonne la liste de toutes les notes tous devoirs confondus pour un groupe (=regroupement d'élèves pouvant provenir de différentes classes) donné. Il ne me resterait plus qu'à  filtrer ces notes pour n'avoir que c'elles d'un devoir donné de ce groupe et de les trier selon le nom des élèves correspondants.

    Le problème c'est que comme je ne sais pas d'avance combien de devoirs il y aura, je crée les colonnes programmatiquement mais en créant et bindant un ArrayController par colonne exactement comme dans IB, je n'obtiens que des colonnes vides!! B)
    Je dois faire une erreur bête dans mon code, mais ça fait plusieurs jours et j'arrive toujours pas à  la trouver. Faudra peut-être que je poste le code ici-même?

    À bientôt.
  • cestlogiquecestlogique Membre
    21:59 modifié #36
    Voici mon code:
    <br />for (i = 0; i &lt; nombreDeDevoirs; i++) {<br />	NSTableColumn * notesTableColumn = [[notesTableView tableColumns] objectAtIndex:i];<br />	<br />	NSArrayController * newArrayController = [[NSArrayController alloc] initWithContent:nil];<br /><br />	[newArrayController setEntityName:@&quot;Note&quot;];<br />	[newArrayController setManagedObjectContext:moc];<br />	<br />	/* J&#39;ai aussi essayé avec:<br />	[newArrayController bind:@&quot;managedObjectContext&quot;<br />		      toObject:appDelegate<br />		   withKeyPath:@&quot;managedObjectContext&quot; <br />		       options:nil];<br />	*/<br /><br />	[newArrayController setAutomaticallyPreparesContent:YES];<br />		<br />	NSMutableDictionary *bindingOptions = [[NSMutableDictionary alloc] init];<br />	[bindingOptions setObject:[NSNumber numberWithBool:YES] <br />			   forKey:@&quot;NSContinuouslyUpdatesValue&quot;];<br />	<br />	[notesTableColumn bind:@&quot;value&quot;<br />		      toObject:newArrayController<br />		   withKeyPath:@&quot;arrangedObjects.eleve&quot; <br />		       options:bindingOptions];<br /><br />	// Je garde un pointeur vers ces ArrayControllers en les stockant dans un autre Array:<br />	[notesDataArrayControllers addObject:newArrayController];<br /><br />	[bindingOptions release];<br />    }<br />
    


    Si quelqu'un voit l'erreur...
  • ClicCoolClicCool Membre
    21:59 modifié #37
    Salut cestlogique

    Où place tu ce code ? après que le nib soit chargé j'espère ?

    Ajoutes, après le parametrage des ArrayCTRL:
    [newArrayController rearrangeObject];
    
  • cestlogiquecestlogique Membre
    21:59 modifié #38
    dans 1116051288:

    Salut cestlogique

    Où place tu ce code ? après que le nib soit chargé j'espère ?

    Ajoutes, après le parametrage des ArrayCTRL:
    [newArrayController rearrangeObject];
    



    Ce code se trouve dans l'action du menu déroulant qui permet de changer le groupe qu'on veut visualiser.

    J'ai essayé le rearrangeObject, le reloadData de la tableView et tout mais ça n'a pas fonctionné!
Connectez-vous ou Inscrivez-vous pour répondre.