Sqlite Edition de bulletins de notes.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Sqlite Edition de bulletins de notes.

Message par falsam »

Niveau de difficulté : Confirmé : Connaissance SQL

■ Cahier des charges résumé.
-Pour 1 à N élèves (SPH si tu passes par là:mrgreen:)
-Pour 1 à N matières.
->Saisir 1 à N notes.
->Afficher la moyenne des notes par matière ainsi que la moyenne générale.

L'objectif est didacticiel. La base de données est stockée en mémoire et non pas sur disque.

Création d'une base de donnée SQLite comprenant les tables suivantes :
■ Eleves

Code : Tout sélectionner

ReqSql = "CREATE TABLE eleves("
ReqSql + "ideleve INTEGER PRIMARY KEY,"
ReqSql + "nom VARCHAR(50)"
ReqSql + ");"
■ Matiere

Code : Tout sélectionner

ReqSql = "CREATE TABLE matieres("
ReqSql + "idmatiere INTEGER PRIMARY KEY,"
ReqSql + "nom VARCHAR(50)"
ReqSql + ");"
■ Notes

Code : Tout sélectionner

ReqSql = "CREATE TABLE notes("
ReqSql + "ideleve INTEGER,"
ReqSql + "idmatiere INTEGER,"
ReqSql + "idnote INTEGER PRIMARY KEY,"
ReqSql + "note INTEGER"
ReqSql + ");"
■ Pour chaque table j'ai codé un jeu de test : 2 Élèves, 2 matières et 4 notes.

■ Qu'est ce que je n'ai pas fait ?
-Ajout, modification et suppression d'un élève.
-Ajout, modification et suppression d'une matière.
-Modification et suppression d'une note.
-Pour un élève une matière : Voir l'historique des notes.
-Pour un élève une matière : Saisir une appréciation. (ça implique une nouvelle table.)
-Impression d'un bulletin.

Code : Tout sélectionner

Enumeration Database
  #Database
EndEnumeration

Enumeration Window
  #Mainform
  #NoteForm
EndEnumeration

Enumeration Gadgets
  #Eleves         ;Liste des éléves 
  #Tableau        ;Moyenne des notes par matiere
  #Moyenne        ;Moyenne générale
  #AjoutNote      ;Ajout d'une note
  #SelectMatiere  ;Sélecteur d'une matiere
  #Note           ;Saisie d'une note
  #Enregistre     ;Enregistrement de la note dans la base de données 
EndEnumeration

  
Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global ReqSql.s, Key.i

Procedure DatabaseInit()
  
    ;-Création de la table <eleves>
    ReqSql = "CREATE TABLE eleves("
    ReqSql + "ideleve INTEGER PRIMARY KEY,"
    ReqSql + "nom VARCHAR(50)"
    ReqSql + ");"
    DatabaseUpdate(#DataBase, ReqSql)       
    
    ;Création d'un jeu de données eleves
    ReqSql = "INSERT INTO eleves (nom) VALUES ("
    ReqSql + Chr(34) + "Laura" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql)
    
    ReqSql = "INSERT INTO eleves (nom) VALUES ("
    ReqSql + Chr(34) + "Janus" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql)
    
    ;-Création de la table des <matieres>
    ReqSql = "CREATE TABLE matieres("
    ReqSql + "idmatiere INTEGER PRIMARY KEY,"
    ReqSql + "nom VARCHAR(50)"
    ReqSql + ");"
    DatabaseUpdate(#DataBase, ReqSql)       
    
    ;Création d'un jeu de données matieres
    ReqSql = "INSERT INTO matieres (nom) VALUES ("
    ReqSql + Chr(34) + "S.V.T" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase)
    
    ReqSql = "INSERT into matieres (nom) VALUES ("
    ReqSql + Chr(34) + "Histoire/Geo" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase)
    
    ;-Création de la table des <notes>
    ReqSql = "CREATE TABLE notes("
    ReqSql + "ideleve INTEGER,"
    ReqSql + "idmatiere INTEGER,"
    ReqSql + "idnote INTEGER PRIMARY KEY,"
    ReqSql + "note INTEGER"
    ReqSql + ");"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase)
        
    ;Création d'un jeu de données  notes
    ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
    ReqSql + Chr(34) + "2" + Chr(34)+Chr(44) ;Janus 
    ReqSql + Chr(34) + "1" + Chr(34)+Chr(44) ;S.V.T.
    ReqSql + Chr(34) + "13" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase)    
    
    ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
    ReqSql + Chr(34) + "2" + Chr(34)+Chr(44) ;Janus 
    ReqSql + Chr(34) + "2" + Chr(34)+Chr(44) ;Histoire/Géo.
    ReqSql + Chr(34) + "10" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase)    

    ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
    ReqSql + Chr(34) + "1" + Chr(34)+Chr(44) ;laura
    ReqSql + Chr(34) + "1" + Chr(34)+Chr(44) ;S.V.T.
    ReqSql + Chr(34) + "11" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase) 
    
    ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
    ReqSql + Chr(34) + "1" + Chr(34)+Chr(44) ;laura
    ReqSql + Chr(34) + "2" + Chr(34)+Chr(44) ;Histoire/Géo
    ReqSql + Chr(34) + "15" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase) 
    
    ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
    ReqSql + Chr(34) + "1" + Chr(34)+Chr(44) ;laura
    ReqSql + Chr(34) + "2" + Chr(34)+Chr(44) ;Histoire/Géo
    ReqSql + Chr(34) + "18" + Chr(34)+")"
    DatabaseUpdate(#DataBase, ReqSql) : FinishDatabaseQuery(#DataBase) 
    
EndProcedure


;Affichage du bulletin et calcul de la moyenne
Procedure AfficheNotes(Key.i)
  Protected Buffer.s
    
  ;Moyenne des notes par matiére
  ReqSql = "SELECT eleves.nom, matieres.nom, AVG(notes.note), notes.idmatiere, notes.ideleve"
  ReqSql + " FROM eleves, matieres, notes"
  ReqSql + " WHERE notes.ideleve = eleves.ideleve"
  ReqSql + " AND notes.idmatiere = matieres.idmatiere"
  ReqSql + " AND notes.ideleve = " + Chr(34)+Key+Chr(34)
  ReqSql + " GROUP BY notes.idmatiere"
  ReqSql + " ORDER BY matieres.nom ASC"
  DatabaseQuery(#DataBase, ReqSql)  
  
  ClearGadgetItems(#Tableau)
  While NextDatabaseRow(#DataBase)
    AddGadgetItem(#Tableau, -1, GetDatabaseString(#DataBase, 1)+Chr(10)+StrD(GetDatabaseFloat(#DataBase, 2),2))
  Wend     
  FinishDatabaseQuery(#DataBase)
  
  ;Moyenne de l'ensemble des notes toutes matiéres confondu
  ReqSql = "SELECT AVG(note) FROM notes WHERE ideleve = " + Chr(34)+Key+Chr(34)
  DatabaseQuery(0, ReqSql)
  While NextDatabaseRow(0)
    SetGadgetText(#Moyenne, StrD(GetDatabaseFloat(0, 0),2))
  Wend     
  
EndProcedure

;Enregistrement d'une note
Procedure EnregistreNote()
  Protected IdEleve.i, IdMatiere, Note.s
  
  IdEleve   = GetGadgetItemData(#Eleves, GetGadgetState(#Eleves))
  IdMatiere = GetGadgetItemData(#SelectMatiere, GetGadgetState(#SelectMatiere))
  Note      = GetGadgetText(#Note)

  ReqSql = "INSERT INTO notes (ideleve, idmatiere, note) VALUES ("
  ReqSql + Chr(34) + IdEleve + Chr(34)+Chr(44) 
  ReqSql + Chr(34) + IdMatiere + Chr(34)+Chr(44)
  ReqSql + Chr(34) + Note + Chr(34)+")"
  DatabaseUpdate(0, ReqSql) : FinishDatabaseQuery(0)    
  
  AfficheNotes(IdEleve)
EndProcedure


Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 400, 600, "Bulletin de notes", WindowStyle)
  
  ;Liste des éléves
  TextGadget(#PB_Any, 10, 20, 100, 20, "Choisir un éléve")
  ComboBoxGadget(#Eleves, 110, 20, 280, 22)
  
  ;Moyenne des notes par matieres
  ListIconGadget(#Tableau, 10, 60, 380, 400, "Matiére", 200)
  AddGadgetColumn(#Tableau, 1, "Note", 150)
  
  ;Moyenne
  TextGadget(#PB_Any, 10, 480, 100, 20, "Moyenne")
  StringGadget(#Moyenne, 110, 480, 50, 22, "00.00", #PB_String_ReadOnly)
  
  ;Ajout d'une note
  ButtonGadget(#AjoutNote, 150, 550, 100, 22, "Ajouter une note")
EndProcedure


Procedure Open_NoteForm()
  OpenWindow(#NoteForm, 0, 0, 300, 300, "Ajout d'une note", #PB_Window_SystemMenu|#PB_Window_ScreenCentered, WindowID(#Mainform))
  
  ;Sélectionner une matiére
  TextGadget(#PB_Any, 10, 20, 150, 20, "Sélectionner une matiére")
  ComboBoxGadget(#SelectMatiere, 165, 20, 120, 22)
  
  ;Lecture des matiére dans la base de donnée : Table matiere
  DatabaseQuery(#Database, "SELECT * FROM matieres")
  While NextDatabaseRow(#Database)
    AddGadgetItem(#SelectMatiere, -1, GetDatabaseString(0, 1)) ;Ajout du libellé 
    SetGadgetItemData(#SelectMatiere, CountGadgetItems(#SelectMatiere)-1, GetDatabaseLong(#DataBase, 0))
  Wend   
  SetGadgetState(#SelectMatiere, 0)
  
  ;Saisie de la note
  TextGadget(#PB_Any, 10, 50, 150, 20, "Note")
  StringGadget(#Note, 165, 50, 50, 22,"0")
  
  ;Validation
  ButtonGadget(#Enregistre, 100, 250, 100, 22, "Enregistre")
  
EndProcedure

Procedure Start()
  
  ;Base de données en mémoire pour cette demo
  UseSQLiteDatabase()
  OpenDatabase(#DataBase, ":memory:", "", "") 
  
  ;Initialisation de la base de données
  DatabaseInit()
  
  ;Ouverture de la fenetre principale
  Open_MainForm()
  
  ;Chargement des éléves
  DatabaseQuery(#DataBase, "SELECT * FROM eleves")
  While NextDatabaseRow(#DataBase)
    AddGadgetItem(#Eleves, -1, GetDatabaseString(#DataBase, 1))
    SetGadgetItemData(#Eleves, CountGadgetItems(#Eleves)-1, GetDatabaseLong(#DataBase, 0))
  Wend     
  SetGadgetState(#Eleves, 0)
  AfficheNotes(GetGadgetItemData(#Eleves, GetGadgetState(#Eleves)))
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent()
  WEvent = EventWindow()
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Eleves
          If IsWindow(#NoteForm)
            CloseWindow(#NoteForm)
          EndIf
          
          AfficheNotes(GetGadgetItemData(#Eleves, GetGadgetState(#Eleves)))
          
        Case #AjoutNote
          Open_NoteForm()
          
        Case #Enregistre
          EnregistreNote()
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      Select WEvent
        Case #Mainform
          End
          
        Case #NoteForm
          CloseWindow(#NoteForm)
      EndSelect
      
  EndSelect
ForEver
Dernière modification par falsam le ven. 06/sept./2013 15:36, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Sqlite Edition de bulletins de notes.

Message par falsam »

Correction du code car il manquait un S à VALUE sur une des lignes d'ajout de notes.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre