Sqlite : Comment gérer une bibliothèque ?
Publié : lun. 17/nov./2008 23:04
[EDIT]
La dernière archive se trouve ici
__________________________________________
bonsoir tout le monde
Je commence à apprendre Sqlite, autant dire que je n'y connais rien.
Pour me faire la main je tente de créer une petite base pour gérer ma bibliothèque.
Pour l'instant ça fait deux fois que je change les tables, je n'arrive pas à me décider sur la meilleure méthode.
Actuellement j'ai créé ces tables
la première table livres contient le titre du livre et l'id de l'éditeur.
la seconde table auteurs contient la liste des auteurs
la troisième table contient la liste des éditeurs
la dernière table livres_auteurs permet de gérer plusieurs auteurs pour un seul livre. c'est là que je ne sais pas trop comment procéder.
Pour afficher les différentes listes je passe par des ListIconGadget(); par exemple pour afficher la liste des éditeurs :
par contre c'est un peu plus compliqué pour afficher la liste des livres, car au titre d'un livre , je veux associer le nom et le prénom de(s) (l')auteur(s), ainsi que l'éditeur.
Pour l'instant je procède ainsi
le problème c'est pour les livres avec plusieurs auteurs , comme 'Feux follets et champignons nucléaires', actuellement j'affiche deux lignes avec le même titre, mais quand le titre est identique j'aimerais regrouper les auteurs dans une liste. comment procéder avec les requêtes sql ?
à terme , je pense que la listicongadget() ne contiendra que la liste des titres des livres. et si on clique sur un titre le complément des informations s'affichera dans une zone de la fenêtre , avec le nom de l'éditeur, le nom du ou des auteurs dans une listicongadget, de cette façon je pourrai en afficher plusieurs pour le même livre.
Si je ne suis pas clair, n'hésitez pas à poser des questions.
voici le code complet de mes essais :
La dernière archive se trouve ici
__________________________________________
bonsoir tout le monde
Je commence à apprendre Sqlite, autant dire que je n'y connais rien.
Pour me faire la main je tente de créer une petite base pour gérer ma bibliothèque.
Pour l'instant ça fait deux fois que je change les tables, je n'arrive pas à me décider sur la meilleure méthode.
Actuellement j'ai créé ces tables
Code : Tout sélectionner
CheckDatabaseUpdate(0, "CREATE TABLE livres (id INTEGER PRIMARY KEY, titre CHAR(50), id_editeur INTEGER)")
CheckDatabaseUpdate(0, "CREATE TABLE auteurs (id INTEGER PRIMARY KEY, nom CHAR(50), prenom CHAR(50))")
CheckDatabaseUpdate(0, "CREATE TABLE editeurs (id INTEGER PRIMARY KEY, nom CHAR(50))")
CheckDatabaseUpdate(0, "CREATE TABLE livres_auteurs (id_livre INTEGER, id_auteur INTEGER)")
la seconde table auteurs contient la liste des auteurs
la troisième table contient la liste des éditeurs
la dernière table livres_auteurs permet de gérer plusieurs auteurs pour un seul livre. c'est là que je ne sais pas trop comment procéder.
Pour afficher les différentes listes je passe par des ListIconGadget(); par exemple pour afficher la liste des éditeurs :
Code : Tout sélectionner
Procedure AfficheEditeurs()
Define Query.s
Query = "SELECT * FROM editeurs"
If DatabaseQuery(0, Query)
While NextDatabaseRow(0)
AddGadgetItem(#ListeEditeurs,0,GetDatabaseString(0, 1))
Wend
FinishDatabaseQuery(0)
EndIf
EndProcedure
Pour l'instant je procède ainsi
Code : Tout sélectionner
Procedure AfficheLivres()
Define Query.s
Query = "SELECT livres.titre, auteurs.nom, auteurs.prenom, editeurs.nom "
Query + "FROM livres, livres_auteurs, auteurs, editeurs "
Query + "WHERE livres.id=livres_auteurs.id_livre and auteurs.id=livres_auteurs.id_auteur and livres.id_editeur=editeurs.id"
If DatabaseQuery(0, Query)
While NextDatabaseRow(0)
AddGadgetItem(#ListeLivres,0, GetDatabaseString(0, 0) + Chr(10)+GetDatabaseString(0, 1) + " " + GetDatabaseString(0, 2) + Chr(10)+GetDatabaseString(0, 3))
Wend
FinishDatabaseQuery(0)
EndIf
EndProcedure
à terme , je pense que la listicongadget() ne contiendra que la liste des titres des livres. et si on clique sur un titre le complément des informations s'affichera dans une zone de la fenêtre , avec le nom de l'éditeur, le nom du ou des auteurs dans une listicongadget, de cette façon je pourrai en afficher plusieurs pour le même livre.
Si je ne suis pas clair, n'hésitez pas à poser des questions.
voici le code complet de mes essais :
Code : Tout sélectionner
Enumeration
#ToolBar
#Panel
#ListeLivres
#ListeAuteurs
#ListeEditeurs
#BoutonAjouter
#BoutonSupprimer
#StringTitre
#ComboAuteur
#ComboEditeur
EndEnumeration
Enumeration
#Titre
#Auteur
#Editeur
EndEnumeration
If OpenWindow(0, 100, 200, 650, 500, "Ma bibliothèque", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)=0
MessageRequester("Erreur","C'est balot !",0)
End
EndIf
ButtonGadget(#BoutonAjouter,530,50,100,20,"Ajouter")
ButtonGadget(#BoutonSupprimer,530,75,100,20,"Supprimer")
PanelGadget(#Panel,10,30,500,400)
AddGadgetItem(#Panel,-1,"Livres")
ListIconGadget(#ListeLivres,0,0,500,350,"Titre",300, #PB_ListIcon_GridLines)
AddGadgetColumn(#ListeLivres,#Auteur,"Auteur",100)
AddGadgetColumn(#ListeLivres,#Editeur,"Editeur",100)
;ComboBoxGadget(#ComboAuteur,30,350,250,20)
AddGadgetItem(#Panel,-1,"Auteurs")
ListIconGadget(#ListeAuteurs,0,0,500,400,"Nom",100, #PB_ListIcon_GridLines)
AddGadgetColumn(#ListeAuteurs,1,"Prénom",100)
AddGadgetItem(#Panel,-1,"Editeurs")
ListIconGadget(#ListeEditeurs,0,0,500,400,"Nom",100, #PB_ListIcon_GridLines)
If CreateToolBar(#ToolBar,WindowID(0))
ToolBarStandardButton(0, #PB_ToolBarIcon_New)
ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
EndIf
If CreateStatusBar(0,WindowID(0))
AddStatusBarField(90)
AddStatusBarField(100)
AddStatusBarField(#PB_Ignore) ; dimensionne automatiquement ce champ
AddStatusBarField(100)
EndIf
UseSQLiteDatabase()
Declare AjoutLivre(titre.s, id_editeur)
Declare AjoutAuteur(nom.s, prenom.s)
Declare AjoutLivreAuteur(id_livre, id_auteur)
Declare AjoutEditeur(nom.s)
Declare AfficheLivres()
Declare AfficheAuteurs()
Declare AfficheEditeurs()
Declare CheckDatabaseUpdate(Database, Query$)
If CreateFile(0,"MaBiblio.sqlite")
CloseFile(0)
If OpenDatabase(0, "MaBiblio.sqlite", "", "")
CheckDatabaseUpdate(0, "CREATE TABLE livres (id INTEGER PRIMARY KEY, titre CHAR(50), id_editeur INTEGER)")
CheckDatabaseUpdate(0, "CREATE TABLE auteurs (id INTEGER PRIMARY KEY, nom CHAR(50), prenom CHAR(50))")
CheckDatabaseUpdate(0, "CREATE TABLE editeurs (id INTEGER PRIMARY KEY, nom CHAR(50))")
CheckDatabaseUpdate(0, "CREATE TABLE livres_auteurs (id_livre INTEGER, id_auteur INTEGER)")
;Remplissage des tables, c'est provisoire en attentant de gérer des formulaires avec des
;StringGadget() et des boutons pour la saisie des données
AjoutLivre("Le français dans tous les sens", 1)
AjoutEditeur("Le livre de poche")
AjoutAuteur("Walter", "Henriette")
AjoutLivreAuteur(1,1)
AjoutLivre("Honni soit qui mal y pense", 1)
AjoutLivreAuteur(2, 1)
AjoutLivre("Apologie de Socrate", 2)
AjoutEditeur("HATIER")
AjoutAuteur("Platon", " ")
AjoutLivreAuteur(3,2)
AjoutLivre("Feux follets et champignons nucléaires",3)
AjoutEditeur("Editions Odile Jacob")
AjoutAuteur("Garwin","Richard L.")
AjoutAuteur("Charpak","Georges")
AjoutLivreAuteur(4,3)
AjoutLivreAuteur(4,4)
Else
Debug "Can't open database !"
EndIf
Else
Debug "Can't create the database file !"
EndIf
AfficheAuteurs()
AfficheLivres()
AfficheEditeurs()
;-Boucle principale
Repeat
Event = WaitWindowEvent()
Select Event
Case 0
Delay(20)
Case #PB_Event_CloseWindow
quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #BoutonAjouter
Debug "ajouter"
Case #BoutonSupprimer
EndSelect
EndSelect
Until Quit = 1
End
Procedure CheckDatabaseUpdate(Database, Query$)
Result = DatabaseUpdate(Database, Query$)
If Result = 0
Debug DatabaseError()
EndIf
ProcedureReturn Result
EndProcedure
Procedure AjoutLivre(titre.s, id_editeur)
Define Sql.s
Sql = "INSERT INTO livres (titre, id_editeur) "
Sql + "VALUES (" + Chr(34) + titre + Chr(34) + ","+ Chr(34) + Str(id_editeur) + Chr(34) + ")"
CheckDatabaseUpdate(0, Sql)
EndProcedure
Procedure AjoutAuteur(nom.s, prenom.s)
Define Sql.s
Sql = "INSERT INTO auteurs (nom, prenom) "
Sql + " VALUES (" + Chr(34) + nom + Chr(34) + "," + Chr(34) + prenom + Chr(34) + ")"
CheckDatabaseUpdate(0, Sql)
EndProcedure
Procedure AjoutLivreAuteur(id_livre, id_auteur)
Define Sql.s
Sql = "INSERT INTO livres_auteurs (id_livre, id_auteur) "
Sql + "VALUES (" + Chr(34) + Str(id_livre) + Chr(34)+"," + Chr(34) + Str(id_auteur) + Chr(34) + ")"
CheckDatabaseUpdate(0, Sql)
EndProcedure
Procedure AjoutEditeur(nom.s)
Define Sql.s
Sql = "INSERT INTO editeurs (nom) "
Sql + "VALUES (" + Chr(34) + nom + Chr(34) + ")"
CheckDatabaseUpdate(0, Sql)
EndProcedure
Procedure AfficheLivres()
Define Query.s
Query = "SELECT livres.titre, auteurs.nom, auteurs.prenom, editeurs.nom "
Query + "FROM livres, livres_auteurs, auteurs, editeurs "
Query + "WHERE livres.id=livres_auteurs.id_livre and auteurs.id=livres_auteurs.id_auteur and livres.id_editeur=editeurs.id"
If DatabaseQuery(0, Query)
While NextDatabaseRow(0)
AddGadgetItem(#ListeLivres,0, GetDatabaseString(0, 0) + Chr(10)+GetDatabaseString(0, 1) + " " + GetDatabaseString(0, 2) + Chr(10)+GetDatabaseString(0, 3))
Wend
FinishDatabaseQuery(0)
EndIf
EndProcedure
Procedure AfficheAuteurs()
Define Query.s
Query = "SELECT * FROM auteurs"
If DatabaseQuery(0, Query)
While NextDatabaseRow(0)
nom.s= GetDatabaseString(0, 1)
AddGadgetItem(#ListeAuteurs,0,nom + Chr(10)+GetDatabaseString(0, 2))
;AddGadgetItem(#ComboAuteur,-1,nom)
Wend
FinishDatabaseQuery(0)
EndIf
EndProcedure
Procedure AfficheEditeurs()
Define Query.s
Query = "SELECT * FROM editeurs"
If DatabaseQuery(0, Query)
While NextDatabaseRow(0)
AddGadgetItem(#ListeEditeurs,0,GetDatabaseString(0, 1))
Wend
FinishDatabaseQuery(0)
EndIf
EndProcedure