Sqlite : Comment gérer une bibliothèque ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Sqlite : Comment gérer une bibliothèque ?

Message par comtois »

[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

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 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 :

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
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

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
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 :

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
Dernière modification par comtois le sam. 29/nov./2008 23:54, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

je sait pas trop quelles normes sql lite utilise mais n'oublie pas les références lors de la création des tables
ex

Code : Tout sélectionner

CheckDatabaseUpdate(0, "CREATE TABLE livres_auteurs (id_livre INTEGER REFERENCE livres(id), ......
cela ne répond pas a la question c'est juste a titre d'informations.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

cha0s a écrit :je sait pas trop quelles normes sql lite utilise mais n'oublie pas les références lors de la création des tables
ex

Code : Tout sélectionner

CheckDatabaseUpdate(0, "CREATE TABLE livres_auteurs (id_livre INTEGER REFERENCE livres(id), ......
cela ne répond pas a la question c'est juste a titre d'informations.
J'ai cherché rapidement de l'aide sur REFERENCE, mais je n'ai rien trouvé, faudra que je cherche plus longuement ce soir.
J'ai malgré tout essayé, et ça génère des erreurs.

Peux-tu en dire plus ?

Sinon pour mon problème, je vais tester autrement mes requêtes ce soir, en décomposant :
Une première requête pour l'affichage de la liste des livres (idem à la liste des auteurs)

et une requête pour l'affichage des auteurs selon le livre sélectionné en fonction de la table livres_auteurs, je ne sais pas encore comment m'y prendre, mais ça me semble plus raisonnable de procéder ainsi :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

eratium : c'est "REFERENCES"

Code : Tout sélectionner

reference_definition:
    REFERENCES tbl_name [(index_col_name,...)]
               [MATCH FULL | MATCH PARTIAL]
               [ON DELETE reference_option]
               [ON UPDATE reference_option]
http://dev.mysql.com/doc/refman/5.0/fr/ ... table.html
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok merci , je jetterai un oeil ce soir.
Et aussi sur les clés étrangères, je crois que c'est ça qu'il faut que j'utilise
Foreign Key
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

sinon pour revenir a la question (j'ai enfin survolé le post en entier :lol: ) ajoute "GROUP BY livres.titre" a la fin de ta requête
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai voulu brûler les étapes, mais je crois que je n'échapperai pas à la lecture de ces articles sur le SQL avant d'aller plus loin :)

http://sqlpro.developpez.com/cours/bddexemple/
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Faut vraiment que je finisse mon tuto pour dvp sur les bases de données !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Progi1984 a écrit :Faut vraiment que je finisse mon tuto pour dvp sur les bases de données !
Bonne idée, tu penses le finir pour quand ?

En attendant je lis les articles sur le SQL de Frédéric Brouard, il a fait un sacré boulot !
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pas pour tout de suite (fin de l'année ou avant). Je travaille sur Moebius pour le rendre viable et m'en réoccupe après.

Je te tiens au courant.
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Bonsoir Comtois,

Je vois que tu veux changer de registre... de la 3D sauter dans la "Multi-Donnée".
:? Tu commence presque bien... La gestion de base de données c'est surtout éviter de répéter les choses. Et si j'en juge les fichier que tu te propos de gérer, c'est à peux prêt ça...
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 :

Il y a principalement dans l'ordre les livres, ceux qui les ont écrit les auteurs et enfin les éditeurs...
Les livres c'est ce qu'il y a de plus, les auteurs eux écrivent plusieurs livres, donc un peu moins et enfin les éditeurs qui sont encore moins... C'est en tout cas 3 fichiers de base.
En général les auteurs sont attaché à une maison d'éditions qui sont peux. Donc la liaisons à faire puis :
En appelant le livre on amène l'auteur qui lui nous amène la maison d'édition.... En supposant qu'après il réédite le bouquins dans une autre maison d'édition, du point de vue "Bibliothécaire" la réédition c'est un autre N° ISBN (International Standard Book Number) ou carte d'identité de cette série de bouquins qui donnera le même auteurs mais auxquels il aura un autre éditeur...

Donc du point de vue de SGBDR on part pour l'organisation du sujet que l'on traite qui devrait être le plus grand nombre dans le même fichier vers le plus petit... Des habitants, ils ont d'abord des des codes postaux, puis des villes en communs, , puis des rues.. Je simplifie mais c'est l'idée. Mais du point de vue encodage, c'est le contraire on encode les plus petits vers les plus grand ou des chose que l'on encode qu'une fois, vers ceux qu'on encodera plusieurs fois.

L'important au départ c'est de définir les contenus, et reconnaitre les points de liaisons qui empêcherons la redondance d'infos... D'où l'importance de bien établir le schéma et d'établir les relations, relations qui seront généralement des clefs d'accès dans chaque fichier. Autrement dit avant même de penser à utiliser l'un ou l'autre système il faut bien savoir ce que l'on va traiter... Dans le cas d'une bibliothèque il y a une différence entre un milliers de bouquins et la biblio nationale, cette différence va faire que l'on va utiliser un SQlite en mémoire (lecture a l'ouverture et écriture à la fermeture)... ]Ou un système totalement spécifique tellement il est gros que le SQL (ou système d'interrogation) devient trop lent pour répondre...

Pour moi, le SQL n'a d'intérêt que par la standardisation (ce qui n'est déjà pas mal) mais reste bien trop lent et c'est tout un langage en lui même par rapport à un bon système ISAM (Idexed Sequential Method), et des fichiers à accès direct associés organisé sous forme de SGBDR bien évidement... C'est en tout cas ce que j'utilisais face et qui faisait la différence face à toute l'armada de Oracles, Dbase,DB2 (IBM), etc. Attention ils ont une très grandes utilité quand les imbrication de bases de données se multiplient.

Si je me remet vraiment à travailler sur PB et que ça accroche, je me propose de justement créer un système de gestion de fichier plus accessible par tous et surtout plus facilement programmable, un peu ce que fait déjà Gnozal d'ailleurs (que je contacterais le moment venus)... Ce serai une gestion d'accès direct à longueur variable (sans trou), ISAM évidement. La gestion se ferait a travers une serie de gadget avec ce que l'on veux faire.. Style GetFileDirect(#Fichier,Operation,BlocDonnee$) Opération ce serait des valeurs de 0 à 9 disant ouvre, ferme, cherche, suivant, précédent, supprime etc...) Bref, mais pour ça il me faudra un peu plus maitriser PB et avoir certaine réponses... Suis aussi, bénévole ici, comme vous tous... Ce serait pour la bonne cause !

A ce propos, je t'ai envoyé un Email sur Developpez... J'aimerais un avis ?
Bonne nuit...Ou Bonjour et à A++
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci pour ta réponse.

J'avais bien pensé à utiliser le N° ISBN comme clé, mais bon c'est un exercice pour apprendre sqlite, pas pour gérer ma bibliothèque, alors pour l'instant je fais simple, je compliquerai plus tard quand la première étape sera opérationnelle :)

Pour ton mail , je regarderai ce soir, je n'y ai pas accès ici.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok j'ai trouvé mon erreur, je faisais mal mes requêtes , mauvaise syntaxe !

voici le code corrigé
Je vais continuer à potasser les cours sur le sql, je suis loin d'être au bout de mes peines, il faut que je tienne compte des relations mère/fille avant de supprimer un enregistrement par exemple, j'ai en conscience, mais encore aucune idée de la façon de le faire :)

Code : Tout sélectionner

;Ajouter un Nocase pour les vérifs UNIQUE !!
;Ajouter la possibilité d'éditeur un titre, un nom ! (pour corriger sans tout ressaisir )


UseSQLiteDatabase()
UsePNGImageDecoder()

;Thank's NetMastro for PikPak.pb !
*unpacked = AllocateMemory(1440)
If *unpacked 
  If UnpackMemory(?Poubelle, *unpacked)
    CatchImage(0, *unpacked, 1440)
  EndIf
EndIf

Declare NouveauFichier()
Declare OuvrirFichier()  
Declare OpenMDIFilles()
Declare CloseMDIFilles()
Declare AjoutLivre(titre.s)
Declare AjoutAuteur(nom.s, prenom.s)
Declare AjoutEditeur(nom.s)
Declare AjoutLivreAuteur(id_livre, id_auteur)
Declare AjoutLivreEditeur(id_livre, id_editeur)
Declare ModifieLivre(id_livre, livre.s)
Declare ModifieAuteur(id_auteur, auteur.s)
Declare ModifieEditeur(id_editeur, editeur.s)
Declare AfficheLivres()
Declare AfficheAuteurs()
Declare AfficheEditeurs()
Declare AfficheAuteursLivre(id_livre)
Declare AfficheEditeursLivre(id_livre)
Declare AfficheLivresAuteur(id_auteur)
Declare AfficheLivresEditeur(id_editeur)
Declare SupprimeLivre(id_livre)
Declare SupprimeAuteur(id_auteur)
Declare SupprimeEditeur(id_editeur)
Declare SupprimeAuteurLivre(id_livre,id_auteur)
Declare SupprimeEditeurLivre(id_livre,id_editeur)
Declare CheckDatabaseUpdate(Database, Query$)
Declare CheckDatabaseQuery(Database, Query$)

 Enumeration 
  #WinPrincipale
  #WinLivres 
  #WinAuteurs
  #WinEditeurs
 EndEnumeration
 
  Enumeration 
  #MDI
  ;Panel livres
  #ListeLivres
  #ListeAuteursLivre
  #ListeEditeursLivre
  #StringTitre
  #ImagePoubelleLivres
  #BoutonRechercheLivre
  ;Panel auteurs
  #ListeAuteurs
  #ListeLivresAuteur
  #StringNomAuteur
  #StringPrenomAuteur
  #ImagePoubelleAuteurs
  ;Panel editeurs
  #ListeEditeurs
  #ListeLivresEditeur
  #StringNomEditeur
  #ImagePoubelleEditeurs
EndEnumeration

#MENU = 0

Enumeration
  #ToucheReturn
  #MENU_Nouveau
  #MENU_Ouvrir
  #MENU_Quitter
  
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  
  #MENU_FirstMDI
EndEnumeration

#Option = #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines

Global IDLivre, IDAuteur, IDEditeur, IDAuteurLivre, IDEditeurLivre, IDLivreAuteur, IDLivreEditeur

If OpenWindow(#WinPrincipale, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)

  If CreateMenu(#MENU, WindowID(#WinPrincipale))
    MenuTitle("Fichier")
      MenuItem(#MENU_Nouveau, "Nouveau")
      MenuItem(#MENU_Ouvrir, "Ouvrir...")
      MenuBar()
      MenuItem(#MENU_Quitter, "Quitter")      
    MenuTitle("Fenêtres")
      MenuItem(#MENU_TileV, "Verticales")
      MenuItem(#MENU_TileH, "Horizontales")
      MenuItem(#MENU_Cascade, "Cascade")
      MenuItem(#MENU_Previous, "Précédente")
      MenuItem(#MENU_Next, "Suivante")
      
      ; MDI subwindows will get added here
  EndIf
  
  AddKeyboardShortcut(#WinPrincipale, #PB_Shortcut_Return, #ToucheReturn)    
  
  MDIGadget(0, 0, 0, 0, 0, 1, #MENU_FirstMDI, #PB_MDI_AutoSize)



EndIf

;-Boucle principale
Repeat

  Event = WaitWindowEvent()

  Select Event
    Case 0
      Delay(20)
    Case #PB_Event_CloseWindow
      quit = 1
    Case #PB_Event_Menu
      Select EventMenu()
        
        Case #ToucheReturn
          If GetGadgetState(#MDI)=#WinLivres
            AjoutLivre(GetGadgetText(#StringTitre))
            AfficheLivres()
            SetGadgetText(#StringTitre,"")
          ElseIf GetGadgetState(#MDI)=#WinAuteurs 
            AjoutAuteur(GetGadgetText(#StringNomAuteur),GetGadgetText(#StringPrenomAuteur))
            AfficheAuteurs()
            SetGadgetText(#StringNomAuteur,"")
            SetGadgetText(#StringPrenomAuteur,"")
          ElseIf GetGadgetState(#MDI)=#WinEditeurs          
            AjoutEditeur(GetGadgetText(#StringNomEditeur))
            AfficheEditeurs()
            SetGadgetText(#StringNomEditeur,"")
          EndIf
        Case #MENU_Nouveau
          If NouveauFichier()
            OpenMDIFilles()
            AfficheAuteurs()
            AfficheLivres()
            AfficheEditeurs()
          EndIf  
        Case #MENU_Ouvrir
          If OuvrirFichier()
            OpenMDIFilles() ; A tester avant si déjà fait ?
            AfficheAuteurs()
            AfficheLivres()
            AfficheEditeurs()
          EndIf
        Case #MENU_Quitter
          Quit = 1     
  
        Case #MENU_TileV
          SetGadgetState(#MDI, #PB_MDI_TileVertically)
          
        Case #MENU_TileH
          SetGadgetState(#MDI, #PB_MDI_TileHorizontally)
                
        Case #MENU_Cascade
          SetGadgetState(#MDI, #PB_MDI_Cascade)
        
        Case #MENU_Arrange
          SetGadgetState(#MDI, #PB_MDI_Arrange)
        
        Case #MENU_Previous
          SetGadgetState(#MDI, #PB_MDI_Previous)
        
        Case #MENU_Next
          SetGadgetState(#MDI, #PB_MDI_Next)
        
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListeLivres
          IDLivre = GetGadgetItemData(#ListeLivres,GetGadgetState(#ListeLivres))
          AfficheAuteursLivre(IDLivre)
          AfficheEditeursLivre(IDLivre)
          If EventType() = #PB_EventType_DragStart And IDLivre>0
            Livre$ = "LL"+Str(GetGadgetItemData(#ListeLivres,GetGadgetState(#ListeLivres)))
            DragText(Livre$)
          ElseIf EventType() = #PB_EventType_LeftDoubleClick And IDLivre>0
            Modif$=InputRequester("Modification titre","Modifiez le titre et validez",GetGadgetItemText(#ListeLivres,GetGadgetState(#ListeLivres)))
            If Modif$ >""
              ModifieLivre(IDLivre, Modif$)
              AfficheLivres()
            EndIf
          EndIf  
        Case #ListeAuteursLivre
          If EventType() = #PB_EventType_DragStart And IDLivre>0
            Auteur$ = "LA"+Str(GetGadgetItemData(#ListeAuteursLivre,GetGadgetState(#ListeAuteursLivre)))
            DragText(Auteur$)
          EndIf  
        Case #ListeEditeursLivre
          If EventType() = #PB_EventType_DragStart And IDLivre>0
            Editeur$ = "LE"+Str(GetGadgetItemData(#ListeEditeursLivre,GetGadgetState(#ListeEditeursLivre)))
            DragText(Editeur$)
          EndIf                    
        Case #ListeAuteurs
          IDAuteur = GetGadgetItemData(#ListeAuteurs,GetGadgetState(#ListeAuteurs))
          AfficheLivresAuteur(GetGadgetItemData(#ListeAuteurs,GetGadgetState(#ListeAuteurs)))
          If EventType() = #PB_EventType_DragStart And IDAuteur>0
            Auteur$ = "AA"+Str(GetGadgetItemData(#ListeAuteurs,GetGadgetState(#ListeAuteurs)))
            DragText(Auteur$)
          ElseIf EventType() = #PB_EventType_LeftDoubleClick And IDAuteur>0
            Modif$=InputRequester("Modification nom","Modifiez le nom et validez",GetGadgetItemText(#ListeAuteurs,GetGadgetState(#ListeAuteurs)))
            If Modif$ >""
              ModifieAuteur(IDAuteur, Modif$)
              AfficheAuteurs()
            EndIf
          EndIf
        Case #ListeLivresAuteur
          IDLivreAuteur = GetGadgetItemData(#ListeLivresAuteur, GetGadgetState(#ListeLivresAuteur))
          If EventType() = #PB_EventType_DragStart And IDLivreEditeur>0
            Livre$ = "AL"+Str(GetGadgetItemData(#ListeLivresAuteur,GetGadgetState(#ListeLivresAuteur)))
            DragText(Livre$)
          EndIf 
        Case #ListeEditeurs
          IDEditeur = GetGadgetItemData(#ListeEditeurs, GetGadgetState(#ListeEditeurs))
          AfficheLivresEditeur(GetGadgetItemData(#ListeEditeurs,GetGadgetState(#ListeEditeurs)))    
          If EventType() = #PB_EventType_DragStart And IDEditeur>0
            Editeur$ = "EE"+Str(GetGadgetItemData(#ListeEditeurs,GetGadgetState(#ListeEditeurs)))
            DragText(Editeur$)
          ElseIf EventType() = #PB_EventType_LeftDoubleClick And IDEditeur>0
            Modif$=InputRequester("Modification nom","Modifiez le nom et validez",GetGadgetItemText(#ListeEditeurs,GetGadgetState(#ListeEditeurs)))
            If Modif$ >""
              ModifieEditeur(IDEditeur, Modif$)
              AfficheEditeurs()
            EndIf
          EndIf    
        Case #ListeLivresEditeur
          IDLivreEditeur = GetGadgetItemData(#ListeLivresEditeur, GetGadgetState(#ListeLivresEditeur))
          If EventType() = #PB_EventType_DragStart And IDLivreEditeur>0
            Livre$ = "EL"+Str(GetGadgetItemData(#ListeLivresEditeur,GetGadgetState(#ListeLivresEditeur)))
            DragText(Livre$)
          EndIf            
      EndSelect 
    Case #PB_Event_GadgetDrop  
      Select EventGadget()
        Case #ImagePoubelleLivres
          Texte$=EventDropText()
          If Left(Texte$,2)="LA"And IDLivre>0
            Auteur=Val(Mid(Texte$,3))
            SupprimeAuteurLivre(IDLivre, Auteur)
            AfficheAuteursLivre(IDLivre)
          ElseIf Left(Texte$,2)="LE"And IDLivre>0
            Editeur=Val(Mid(Texte$,3))
            SupprimeEditeurLivre(IDLivre, Editeur)
            AfficheEditeursLivre(IDLivre)
          ElseIf Left(Texte$,2)="LL"And IDLivre>0
            Livre=Val(Mid(Texte$,3))
            SupprimeLivre(Livre)
            AfficheLivres()          
          EndIf        
        Case #ImagePoubelleAuteurs
          Texte$=EventDropText()
          If Left(Texte$,2)="AA"
            Auteur=Val(Mid(Texte$,3))
            SupprimeAuteur(Auteur)
            AfficheAuteurs()
          ElseIf Left(Texte$,2)="AL" And IDAuteur>0 
            Livre=Val(Mid(Texte$,3))
            SupprimeAuteurLivre(Livre, IDAuteur)
            AfficheLivresAuteur(IDAuteur)  
          EndIf  
        Case #ImagePoubelleEditeurs
          Texte$=EventDropText()
          If Left(Texte$,2)="EE"
            Editeur=Val(Mid(Texte$,3))
            SupprimeEditeur(Editeur)
            AfficheEditeurs()    
          ElseIf Left(Texte$,2)="EL" And IDEditeur>0 
            Livre=Val(Mid(Texte$,3))
            SupprimeEditeurLivre(Livre, IDEditeur)
            AfficheLivresEditeur(IDEditeur)   
          EndIf    
        Case #ListeAuteursLivre
          Texte$=EventDropText()
          If Left(Texte$,2)="AA" And IDLivre>0
            Auteur=Val(Mid(Texte$,3))
            AjoutLivreAuteur(IDLivre, Auteur)
            AfficheAuteursLivre(IDLivre)
          EndIf
        Case #ListeEditeursLivre
          Texte$=EventDropText()
          If Left(Texte$,2)="EE" And IDLivre>0
            Editeur=Val(Mid(Texte$,3))
            AjoutLivreEditeur(IDLivre, Editeur)
            AfficheEditeursLivre(IDLivre)            
          EndIf
      EndSelect    
  EndSelect
Until Quit = 1

End

;- *** PROCEDURES **********

Procedure OpenMDIFilles()
    AddGadgetItem(0, #WinLivres, "Livres",0, #PB_Window_BorderLess)
      ListIconGadget(#ListeLivres,0,0,400,250,"Titre", 395, #Option)
      SetGadgetColor(#ListeLivres, #PB_Gadget_BackColor  , RGB(248,248,248))
      SetGadgetColor(#ListeLivres, #PB_Gadget_LineColor , RGB(228,228,228))
      ListIconGadget(#ListeAuteursLivre, 0, 302, 199, 200, "Auteurs", 195,  #Option) 
      ListIconGadget(#ListeEditeursLivre, 201, 302, 199, 200, "Editeurs", 195, #Option) 
      StringGadget(#StringTitre,5,255,350,20,"")
      ImageGadget(#ImagePoubelleLivres,358,255,36,35, ImageID(0),#PB_Image_Border)
    AddGadgetItem(0, #WinAuteurs, "Auteurs",0,#PB_Window_BorderLess)
      ListIconGadget(#ListeAuteurs, 0, 0, 400,250,"Nom",197, #Option)
        AddGadgetColumn(#ListeAuteurs,1,"Prénom",197)
      ListIconGadget(#ListeLivresAuteur, 0, 302, 400, 200, "Livres", 395, #Option)  
      StringGadget(#StringNomAuteur,5,255,350,20,"")
      StringGadget(#StringPrenomAuteur,5,280,350,20,"")
      ImageGadget(#ImagePoubelleAuteurs,358,255,36,35, ImageID(0),#PB_Image_Border)
    AddGadgetItem(0, #WinEditeurs, "Editeurs",0,#PB_Window_BorderLess)
      ListIconGadget(#ListeEditeurs,0,0,400,250,"Nom", 395, #Option)
      ListIconGadget(#ListeLivresEditeur, 0, 302, 400, 200, "Livres", 395, #Option) 
      StringGadget(#StringNomEditeur,5,255,350,20,"")
      ImageGadget(#ImagePoubelleEditeurs,358,255,36,35, ImageID(0),#PB_Image_Border)
      
  ResizeWindow(#WinLivres, #PB_Ignore, #PB_Ignore, 402, 505) 
  ResizeWindow(#WinAuteurs, #PB_Ignore, #PB_Ignore, 402, 505) 
  ResizeWindow(#WinEditeurs, #PB_Ignore, #PB_Ignore, 402, 505) 
    
  EnableGadgetDrop(#ListeAuteursLivre,  #PB_Drop_Text, #PB_Drag_Copy)
  EnableGadgetDrop(#ListeEditeursLivre, #PB_Drop_Text, #PB_Drag_Copy)
  EnableGadgetDrop(#ImagePoubelleLivres, #PB_Drop_Text, #PB_Drag_Copy)
  EnableGadgetDrop(#ImagePoubelleAuteurs, #PB_Drop_Text, #PB_Drag_Copy)
  EnableGadgetDrop(#ImagePoubelleEditeurs, #PB_Drop_Text, #PB_Drag_Copy)  
EndProcedure

Procedure CloseMDIFilles()
  If IsWindow(#WinLivres)
    CloseWindow(#WinLivres)
  EndIf 
  If IsWindow(#WinAuteurs)
    CloseWindow(#WinAuteurs)
  EndIf 
  If IsWindow(#WinEditeurs)
    CloseWindow(#WinEditeurs)
  EndIf
EndProcedure

Procedure NouveauFichier()
  FichierParDefaut$ = "C:\MaBiliotheque.sqlite"   ; Répertoire et fichier par défaut qui seront affichés
  Filtre$ = "Bibliothèque (*.sqlite)|*.sqlite;|Tous les fichiers (*.*)|*.*"
  Filtre = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = SaveFileRequester("Choisissez le nom de votre bibliothèque", FichierParDefaut$, Filtre$, Filtre)
  If Fichier$
    If FileSize(Fichier$)>0
      Reponse=MessageRequester("Nouveau fichier", "Ce fichier existe déjà , vous allez le supprimer, voulez vous vraiment continuer ?",#PB_MessageRequester_YesNo)
    EndIf
    If Reponse = #PB_MessageRequester_Yes    
    
      If LCase(GetExtensionPart(Fichier$))<>"sqlite"
        Fichier$ + ".sqlite"
      EndIf     
      
      If CreateFile(0,Fichier$)
        
        CloseFile(0)
       
        If OpenDatabase(0, Fichier$, "", "")
          CheckDatabaseUpdate(0,"BEGIN")
      
          Table.s="CREATE TABLE livres  (id INTEGER PRIMARY KEY,"
          Table  +                      "titre TEXT NOT NULL COLLATE NOCASE,"
          Table  +                      "UNIQUE(titre))"
          CheckDatabaseUpdate(0, Table)
      
          Table.s="CREATE TABLE auteurs (id INTEGER PRIMARY KEY,"
          Table  +                      "nom TEXT NOT NULL COLLATE NOCASE,"
          Table  +                      "prenom TEXT COLLATE NOCASE," 
          Table  +                      "UNIQUE(nom, prenom))"
          CheckDatabaseUpdate(0, Table)          
      
          Table.s="CREATE TABLE editeurs(id INTEGER PRIMARY KEY,"
          Table  +                      "nom TEXT NOT NULL,"
          Table  +                      "UNIQUE(nom))"
          CheckDatabaseUpdate(0, Table)  
      
          Table.s="CREATE TABLE livres_auteurs (id_livre INTEGER,"
          Table  +                             "id_auteur INTEGER,"
          Table  +                             "UNIQUE(id_livre,id_auteur))"
          CheckDatabaseUpdate(0, Table)  
      
          Table.s="CREATE TABLE livres_editeurs(id_livre INTEGER,"
          Table  +                             "id_editeur INTEGER,"
          Table  +                             "UNIQUE(id_livre,id_editeur))"
          CheckDatabaseUpdate(0, Table)           
      
          ;Trigger
          Trigger.s = "CREATE TRIGGER livre_insert_trg "
          Trigger   + "BEFORE INSERT ON livres "
          Trigger   + "BEGIN "
          Trigger   + "  SELECT CASE "
          Trigger   + "    WHEN (SELECT titre FROM livres WHERE LENGTH(NEW.titre)<=0) > 0 "
          Trigger   + "    THEN RAISE(ABORT, 'le titre de ce livre est erroné') "
          Trigger   + "  END; "
          Trigger   + "END; "   
          CheckDatabaseUpdate(0, Trigger)
    
          Trigger.s = "CREATE TRIGGER auteur_insert_trg "
          Trigger   + "BEFORE INSERT ON auteurs "
          Trigger   + "BEGIN "
          Trigger   + "  SELECT CASE "
          Trigger   + "    WHEN (SELECT nom FROM auteurs WHERE LENGTH(NEW.nom)<=0) > 0 "
          Trigger   + "    THEN RAISE(ABORT, 'le nom de cet auteur est erroné') "
          Trigger   + "  END; "
          Trigger   + "END; "   
          CheckDatabaseUpdate(0, Trigger)
    
          Trigger.s = "CREATE TRIGGER editeur_insert_trg "
          Trigger   + "BEFORE INSERT ON editeurs "
          Trigger   + "BEGIN "
          Trigger   + "  SELECT CASE "
          Trigger   + "    WHEN (SELECT nom FROM editeurs WHERE LENGTH(NEW.nom)<=0) > 0 "
          Trigger   + "    THEN RAISE(ABORT, 'le nom de cet éditeur est erroné') "
          Trigger   + "  END; "
          Trigger   + "END; "   
          CheckDatabaseUpdate(0, Trigger)
                
          Trigger.s = "CREATE TRIGGER auteur_delete_trg "
          Trigger   + "BEFORE DELETE ON auteurs "
          Trigger   + "BEGIN "
          Trigger   + "  SELECT CASE "
          Trigger   + "    WHEN (SELECT COUNT(id_auteur) FROM livres_auteurs WHERE id_auteur=OLD.id) > 0 "
          Trigger   + "    THEN RAISE(ABORT, 'cet auteur est utilisé dans une table, supprimez ou modifiez les fiches livres qui s''y réfèrent') "
          Trigger   + "  END; "
          Trigger   + "END; "   
          CheckDatabaseUpdate(0, Trigger)
          
          Trigger.s = "CREATE TRIGGER editeur_delete_trg "
          Trigger   + "BEFORE DELETE ON editeurs "
          Trigger   + "BEGIN "
          Trigger   + "  SELECT CASE "
          Trigger   + "    WHEN (SELECT COUNT(id_editeur) FROM livres_editeurs WHERE id_editeur=OLD.id) > 0 "
          Trigger   + "    THEN RAISE(ABORT, 'cet éditeur est utilisé dans une table, supprimez ou modifiez les fiches livres qui s''y réfèrent') "
          Trigger   + "  END; "
          Trigger   + "END; "   
          CheckDatabaseUpdate(0, Trigger)
          
    
  ;{         ;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") 
  ;         AjoutLivre("Honni soit qui mal y pense") 
  ;         AjoutLivre("Apologie de Socrate") 
  ;         AjoutLivre("Feux follets et champignons nucléaires")
  ;         AjoutLivre("Des souris et des hommes")
  ;         AjoutLivre("Erasme")
  ;         AjoutLivre("La guerre des boutons")      
  ;         AjoutLivre("Les découvreurs")
  ;         AjoutLivre("Journaux (1912 - 1940)")
  ;         AjoutLivre("Le joueur d'échecs")
  ;         AjoutLivre("Trois poètes de leur vie")
  ;         AjoutLivre("Trois Maîtres")
  ;         
  ;         AjoutAuteur("Walter", "Henriette")       
  ;         AjoutAuteur("Platon", " ")
  ;         AjoutAuteur("Garwin","Richard L.")
  ;         AjoutAuteur("Charpak","Georges")      
  ;         AjoutAuteur("Steinbeck","John") 
  ;         AjoutAuteur("Zweig","Stefan")  
  ;         AjoutAuteur("Pergaud","Louis") 
  ;         AjoutAuteur("Boorstin","Daniel")
  ;         AjoutAuteur("Toto","titi")
  ;         
  ;         AjoutEditeur("Le livre de poche")
  ;         AjoutEditeur("HATIER")
  ;         AjoutEditeur("Editions Odile Jacob")
  ;         AjoutEditeur("folio")
  ;         AjoutEditeur("Robert Laffont - édition illustrée")
  ;         AjoutEditeur("Seghers")
  ;         
  ;         AjoutLivreAuteur(1,1) : AjoutLivreEditeur(1,1)
  ;         AjoutLivreAuteur(2,1) : AjoutLivreEditeur(2,1)
  ;         AjoutLivreAuteur(3,2) : AjoutLivreEditeur(3,2)
  ;         AjoutLivreAuteur(4,3) : AjoutLivreEditeur(4,3)
  ;         AjoutLivreAuteur(4,4)
  ;         AjoutLivreAuteur(5,5) : AjoutLivreEditeur(5,4)
  ;         AjoutLivreAuteur(6,6) : AjoutLivreEditeur(6,1)
  ;         AjoutLivreAuteur(7,7) : AjoutLivreEditeur(7,4)
  ;         AjoutLivreAuteur(8,8) : AjoutLivreEditeur(8,5)
  ;                                 AjoutLivreEditeur(8,6)
  ;         AjoutLivreAuteur(9,6) : AjoutLivreEditeur(9,1)
  ;         AjoutLivreAuteur(10,6): AjoutLivreEditeur(10,1) 
  ;         AjoutLivreAuteur(11,6): AjoutLivreEditeur(11,1) 
  ;         AjoutLivreAuteur(12,6): AjoutLivreEditeur(12,1)                        
  ;}         
          CheckDatabaseUpdate(0,"COMMIT") 
  
          ProcedureReturn #True
                                 
        Else
          Debug "Can't open database !"
        EndIf
    Else
      Debug "Can't create the database file !"
    EndIf
    EndIf
  EndIf
EndProcedure

Procedure OuvrirFichier()
FichierParDefaut$ = "C:\MaBiliotheque.sqlite"   ; Répertoire et fichier par défaut qui seront affichés
  Filtre$ = "Bibliothèque (*.sqlite)|*.sqlite;|Tous les fichiers (*.*)|*.*"
  Filtre = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = OpenFileRequester("Choisissez le nom de votre bibliothèque", FichierParDefaut$, Filtre$, Filtre)
  If Fichier$
    ;Si le fichier existe demander si on peut écraser !
    
    If LCase(GetExtensionPart(Fichier$))<>"sqlite"
      Fichier$ + ".sqlite"
    EndIf     
    CloseMDIFilles()
    If OpenDatabase(0, Fichier$, "", "")

       ProcedureReturn #True
                             
    Else
      Debug "Can't open database !"
    EndIf
  
  EndIf
EndProcedure
 
Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      MessageRequester("Erreur", DatabaseError(),0)
   EndIf
   
   ProcedureReturn Result
EndProcedure

Procedure CheckDatabaseQuery(Database, Query$)
   Result = DatabaseQuery(Database, Query$)
   If Result = 0
      MessageRequester("Erreur", DatabaseError(),0)
   EndIf
   
   ProcedureReturn Result
EndProcedure

;- Ajout ------------------------------

Procedure AjoutLivre(titre.s)
  Define Sql.s
  Sql = "INSERT INTO livres (titre) "
  Sql + "VALUES (" + Chr(34) + titre + 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 AjoutLivreEditeur(id_livre, id_editeur)
  Define Sql.s
  Sql = "INSERT INTO livres_editeurs (id_livre, id_editeur) "
  Sql + "VALUES (" + Chr(34) + Str(id_livre) + Chr(34)+"," + Chr(34) + Str(id_editeur) + 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

;- Modifie ----------------------------

Procedure ModifieLivre(id_livre, livre.s)
  Define Query.s
  IDLivre = -1
  Query = "UPDATE livres "
  Query + "SET titre="+ Chr(34) + livre + Chr(34)
  Query + "WHERE id=" + Chr(34)+Str(id_livre)+Chr(34)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
  
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT")   
EndProcedure

Procedure ModifieAuteur(id_auteur, auteur.s)
  Define Query.s
  IDAuteur = -1
  Query = "UPDATE auteurs "
  Query + "SET nom="+ Chr(34) + auteur + Chr(34)
  Query + "WHERE id=" + Chr(34)+Str(id_auteur)+Chr(34)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
  
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT")   
EndProcedure

Procedure ModifieEditeur(id_editeur, editeur.s)
  Define Query.s
  IDEditeur = -1
  Query = "UPDATE editeurs "
  Query + "SET nom="+ Chr(34) + editeur + Chr(34)
  Query + "WHERE id=" + Chr(34)+Str(id_editeur)+Chr(34)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
  
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT")     
EndProcedure
;- Affiche ----------------------------

Procedure AfficheLivres()
  Define Query.s
  IDLivre = -1
  Query = "SELECT * FROM livres ORDER BY titre "
  ClearGadgetItems(#ListeLivres)
  ClearGadgetItems(#ListeAuteursLivre)
  ClearGadgetItems(#ListeEditeursLivre)  
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
      AddGadgetItem(#ListeLivres, -1, GetDatabaseString(0, 1))
      SetGadgetItemData(#ListeLivres,CountGadgetItems(#ListeLivres)-1, Val(GetDatabaseString(0, 0)))      
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT")  
EndProcedure

Procedure AfficheAuteurs()
  Define Query.s
  IDAuteur = -1
  Query = "SELECT * FROM auteurs ORDER BY nom"
  ClearGadgetItems(#ListeAuteurs)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
      AddGadgetItem(#ListeAuteurs, -1, GetDatabaseString(0, 1)+Chr(10)+ GetDatabaseString(0, 2))
      SetGadgetItemData(#ListeAuteurs,CountGadgetItems(#ListeAuteurs)-1, Val(GetDatabaseString(0, 0)))
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure AfficheEditeurs()
  Define Query.s
  IDEditeur = -1
  Query = "SELECT * FROM editeurs ORDER BY nom"
  ClearGadgetItems(#ListeEditeurs)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
      AddGadgetItem(#ListeEditeurs, -1,GetDatabaseString(0, 1))
      SetGadgetItemData(#ListeEditeurs,CountGadgetItems(#ListeEditeurs)-1, Val(GetDatabaseString(0, 0)))
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure AfficheAuteursLivre(livre)
  Define Query.s
  Query = "SELECT nom, prenom, id "
  Query + "FROM livres_auteurs "
  Query + "JOIN auteurs "
  Query + "ON auteurs.id=livres_auteurs.id_auteur AND id_livre="+Chr(34)+Str(livre)+Chr(34) + "ORDER BY nom " 
  ClearGadgetItems(#ListeAuteursLivre)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0) 
      AddGadgetItem(#ListeAuteursLivre,-1,GetDatabaseString(0, 0) + " " + GetDatabaseString(0, 1))
      SetGadgetItemData(#ListeAuteursLivre,CountGadgetItems(#ListeAuteursLivre)-1, Val(GetDatabaseString(0, 2)))  
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure AfficheEditeursLivre(livre)
  Define Query.s
  Query = "SELECT nom, id "
  Query + "FROM livres_editeurs "
  Query + "JOIN editeurs "
  Query + "ON editeurs.id=livres_editeurs.id_editeur AND id_livre="+Chr(34)+Str(livre)+Chr(34) + "ORDER BY nom " 
  ClearGadgetItems(#ListeEditeursLivre)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
      AddGadgetItem(#ListeEditeursLivre,-1,GetDatabaseString(0, 0))
      SetGadgetItemData(#ListeEditeursLivre,CountGadgetItems(#ListeEditeursLivre)-1, Val(GetDatabaseString(0, 1))) 
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure AfficheLivresAuteur(auteur)
  Define Query.s
  Query = "SELECT titre "
  Query + "FROM livres, livres_auteurs "
  Query + "WHERE livres.id=livres_auteurs.id_livre AND id_auteur="+Chr(34)+Str(auteur)+Chr(34) + "ORDER BY titre "
  ClearGadgetItems(#ListeLivresAuteur)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0) 
      AddGadgetItem(#ListeLivresAuteur,-1,GetDatabaseString(0, 0))
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure AfficheLivresEditeur(editeur)
  Define Query.s
  Query = "SELECT titre "
  Query + "FROM livres, livres_editeurs "
  Query + "WHERE livres.id=livres_editeurs.id_livre AND id_editeur="+Chr(34)+Str(editeur)+Chr(34) + "ORDER BY titre "
  ClearGadgetItems(#ListeLivresEditeur)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseQuery(0, Query)
    While NextDatabaseRow(0)
      AddGadgetItem(#ListeLivresEditeur,-1,GetDatabaseString(0, 0))
    Wend
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

;- Supprime ---------------------------

Procedure SupprimeLivre(livre)
  Define Query.s
  ;Supprime les auteurs du livre
  Query = "DELETE FROM livres_auteurs "
  Query + "WHERE id_livre=" + Chr(34) + Str(livre) + Chr(34) 
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  ;Supprime les éditeurs du livre
  Query = "DELETE FROM livres_editeurs "
  Query + "WHERE id_livre=" + Chr(34) + Str(livre) + Chr(34) 
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  ;Supprime le livre
  Query = "DELETE FROM livres "
  Query + "WHERE id=" + Chr(34) + Str(livre) + Chr(34) 
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure SupprimeAuteurLivre(livre, auteur)
  Define Query.s
  Query = "DELETE FROM livres_auteurs "
  Query + "WHERE id_livre=" + Chr(34) + Str(livre) + Chr(34) + "AND id_auteur=" + Chr(34) + Str(auteur) + Chr(34)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure SupprimeEditeurLivre(livre, editeur)
  Define Query.s
  Query = "DELETE FROM livres_editeurs "
  Query + "WHERE id_livre=" + Chr(34) + Str(livre) + Chr(34) + "AND id_editeur=" + Chr(34) + Str(editeur) + Chr(34)
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure SupprimeAuteur(auteur)
  Define Query.s
  Query = "DELETE FROM auteurs "
  Query + "WHERE id=" + Chr(34) + Str(auteur) + Chr(34) 
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure

Procedure SupprimeEditeur(editeur)
  Define Query.s
  Query = "DELETE FROM editeurs "
  Query + "WHERE id=" + Chr(34) + Str(editeur) + Chr(34) 
  CheckDatabaseUpdate(0,"BEGIN")
  If CheckDatabaseUpdate(0, Query)
    FinishDatabaseQuery(0)
  EndIf
  CheckDatabaseUpdate(0,"COMMIT") 
EndProcedure


DataSection
  Poubelle:
  Data.b $4A,$43,$A0,$05,$00,$00,$32,$ED,$3A,$60,$14,$6A,$E2,$20,$15,$36,$3C,$EA,$03,$45
  Data.b $26,$1A,$12,$45,$9A,$14,$40,$32,$04,$A4,$20,$C2,$91,$11,$ED,$CB,$33,$60,$11,$48
  Data.b $22,$D6,$54,$EA,$DC,$80,$77,$1D,$11,$7A,$03,$E9,$39,$3A,$83,$9E,$25,$58,$9B,$03
  Data.b $26,$4D,$F9,$2F,$7C,$1C,$0C,$82,$82,$61,$A9,$48,$C7,$82,$49,$BD,$50,$53,$84,$01
  Data.b $43,$80,$A6,$09,$F4,$43,$75,$21,$00,$7D,$B0,$EA,$21,$98,$21,$CC,$3A,$21,$37,$67
  Data.b $B8,$17,$10,$E0,$19,$55,$99,$42,$65,$0A,$C0,$FF,$A2,$54,$25,$B2,$5F,$13,$B8,$7D
  Data.b $E0,$83,$0F,$F5,$BF,$5E,$C6,$19,$4F,$68,$66,$3F,$FA,$FC,$B6,$A9,$C0,$BB,$F6,$DB
  Data.b $94,$F0,$5F,$7E,$F9,$BE,$C9,$D0,$11,$F7,$33,$5F,$77,$5E,$E6,$B5,$09,$80,$82,$DE
  Data.b $BC,$F3,$3E,$67,$8F,$7C,$25,$25,$77,$E9,$21,$E0,$13,$D4,$D2,$AC,$2F,$98,$EE,$FA
  Data.b $3F,$75,$C4,$67,$4E,$E1,$48,$16,$27,$A6,$A9,$8D,$64,$8E,$C9,$07,$C2,$0C,$AF,$FF
  Data.b $BA,$7C,$D3,$CF,$F3,$FE,$74,$F5,$94,$EC,$DC,$AF,$A6,$7E,$BC,$13,$07,$CC,$6B,$87
  Data.b $F0,$63,$E4,$9D,$77,$E4,$9E,$76,$5B,$FD,$36,$CF,$FE,$F2,$3E,$D8,$AF,$F7,$A7,$0B
  Data.b $80,$34,$F8,$EF,$EB,$EF,$FE,$D3,$5B,$22,$A7,$E4,$5F,$FF,$C8,$85,$0B,$ED,$4F,$3E
  Data.b $43,$94,$EA,$CC,$97,$11,$3D,$F3,$FF,$3A,$87,$A7,$F5,$1F,$3E,$F4,$D4,$6B,$FF,$36
  Data.b $DF,$FB,$7E,$FD,$EE,$C3,$F0,$CE,$58,$DA,$C6,$AE,$B9,$FB,$24,$D0,$9F,$9F,$49,$D3
  Data.b $9F,$54,$EC,$D7,$FC,$D7,$0A,$B0,$88,$24,$A9,$21,$BD,$BF,$30,$40,$A0,$F4,$A2,$49
  Data.b $25,$52,$8A,$93,$6A,$50,$EB,$29,$D7,$7E,$11,$A6,$6A,$B9,$04,$2A,$29,$4C,$C0,$37
  Data.b $51,$0A,$8A,$96,$30,$D1,$5E,$2E,$3A,$A6,$AB,$9F,$4A,$A2,$FB,$7F,$5F,$8E,$53,$0A
  Data.b $57,$7B,$71,$FB,$D1,$A8,$C7,$A4,$EB,$FC,$71,$E6,$30,$87,$2F,$6B,$56,$F9,$DF,$5A
  Data.b $69,$BF,$7D,$E2,$40,$EB,$A4,$FD,$AB,$1E,$87,$36,$DB,$9F,$C3,$AA,$51,$8B,$F6,$2F
  Data.b $D3,$75,$D9,$E8,$35,$4B,$8B,$91,$AC,$4A,$B6,$7F,$67,$F6,$6A,$CB,$51,$C1,$F8,$AB
  Data.b $C0,$CA,$7C,$0B,$74,$A2,$FA,$C3,$73,$AF,$3E,$75,$FB,$C7,$E8,$D7,$DE,$FE,$D8,$0A
  Data.b $EB,$B6,$7F,$7A,$BD,$EB,$A0,$4B,$29,$AB,$1A,$53,$AA,$60,$43,$A9,$66,$2E,$31,$62
  Data.b $D0,$BC,$ED,$80,$2F,$7B,$F2,$93,$05,$46,$7A,$37,$BE,$E0,$1F,$B9,$CF,$CE,$59,$29
  Data.b $66,$91,$07,$5F,$4C,$4B,$FA,$41,$27,$57,$CD,$5B,$79,$C7,$C3,$E3,$9A,$D6,$9B,$7E
  Data.b $4F,$9E,$9B,$9E,$4D,$DE,$34,$62,$90,$2F,$DA,$E4,$3D,$12,$E4,$F4,$04,$EB,$0F,$7D
  Data.b $10,$3A,$B9,$3D,$51,$97,$ED,$D6,$3F,$C5,$9F,$D7,$A7,$F4,$37,$6C,$C0,$C5,$37,$82
  Data.b $BE,$7E,$78,$C5,$BA,$72,$64,$AE,$8C,$D8,$06,$73,$8A,$BF,$90,$AD,$C6,$BB,$15,$1A
  Data.b $9E,$58,$B3,$7A,$A0,$03,$AA,$9E,$5A,$3B,$BB,$05,$DA,$D6,$C0,$94,$1D,$B1,$37,$AF
  Data.b $59,$A4,$DB,$B4,$D9,$BF,$BE,$39,$BC,$56,$ED,$A1,$84,$75,$B1,$E1,$0A,$3E,$15,$B8
  Data.b $E6,$C5,$23,$83,$1E,$BE,$70,$42,$DA,$A6,$16,$56,$29,$7A,$EC,$E7,$01,$09,$1E,$AF
  Data.b $D4,$A6,$2D,$8B,$D1,$F6,$9D,$11,$A1,$89,$1D,$56,$39,$4A,$C2,$C1,$73,$A4,$FF,$FB
  Data.b $F6,$DE,$F9,$D3,$70,$C2,$FF,$4B,$21,$38,$A3,$08,$EF,$B6,$DA,$FB,$3E,$C6,$AB,$49
  Data.b $9F,$DE,$94,$70,$5F,$D5,$BD,$2B,$16,$09,$76,$DB,$8C,$AE,$6C,$9D,$3C,$F8,$50,$B9
  Data.b $D7,$CF,$B2,$A4,$51,$DA,$95,$FC,$8E,$38,$9D,$67,$81,$72,$B2,$DB,$A7,$9D,$5E,$79
  Data.b $35,$66,$22,$DF,$AB,$34,$D0,$EB,$E8,$DC,$EF,$42,$9D,$88,$61,$61,$8F,$BD,$7C,$FB
  Data.b $52,$59,$B9,$B9,$E2,$C5,$D5,$6E,$E6,$E8,$5D,$06,$04,$4A,$7C,$EC,$93,$2A,$EE,$0F
  Data.b $CC,$50,$DA,$EA,$B8,$09,$44,$58,$51,$A7,$FE,$E8,$35,$3A,$5F,$B5,$29,$74,$60,$53
  Data.b $0E,$77,$17,$FE,$74,$A0,$45,$12,$FE,$EC,$62,$E0,$E2,$6F,$BE,$EF,$9B,$95,$67,$B1
  Data.b $58,$C3,$AF,$18,$50,$60,$88,$40,$C9,$EF,$30,$4C,$14,$5F,$20,$BF,$6E,$DE,$52,$2A
  Data.b $63,$C6,$CE,$C3,$09,$8D,$B7,$8C,$BF,$20,$EA,$66,$DB,$C7,$AE,$DC,$BE,$6E,$87,$93
  Data.b $46,$3D,$70,$25,$42,$C4,$07,$FA,$1D,$DB,$A6,$7B,$AD,$84,$33,$D7,$AC,$B7,$44,$FA
  Data.b $FC,$71,$FF,$EE,$85,$B8,$39,$27,$EF,$B9,$A5,$E9,$86,$3C,$72,$B4,$9E,$B4,$7B,$F7
  Data.b $6B,$43,$67,$D9,$DF,$E6,$81,$57,$99,$CB,$58,$FA,$B8,$E7,$9B,$5D,$97,$A5,$33,$B9
  Data.b $C8,$FA,$9D,$BF,$6C,$3F,$6D,$6D,$9A,$80,$36,$65,$39,$BB,$5B,$F9,$4C,$1D,$D0,$F4
  Data.b $E4,$CA,$61,$CB,$FD,$BB,$E9,$41,$23,$7D,$DB,$BF,$EB,$4F,$B3,$EC,$03,$F5,$D3,$A2
  Data.b $49,$FD,$15,$EA,$9A,$A8,$00,$00,$04,$83
  Poubelleend:
EndDataSection
Dernière modification par comtois le sam. 29/nov./2008 0:01, modifié 2 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai un peu avancé, cette fois ci , je peux ajouter, supprimer des livres, des auteurs ,des éditeurs.Et les supprimer.

J'utilise de drag&drop pour remplir la fiche d'un livre,
en faisant glisser un auteur dans la liste auteurs de la fiche livre , il faut avoir sélectionné un livre au préalable en cliquant dessus.
Il faudra que j'améliore l'affichage ,on ne voit pas quel livre a été sélectionné !

Toutes remarques, critiques seront les bienvenues, je vais encore bosser dessus.

(J'ai mis à jour le code dans le post précédent)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Comme dab tu fais un super travail COMTOIS
T'es une vraie doc vivante 8)
Pour l'instant, je n'ai pas encore mis le nez dans les BD, mais ça ne saurait tarder et ce jour la, ce POST sera une mine d'or :D

Encore merci pour ton travail et partage 8)

NB: J'ai juste une petite erreur ligne 129, mais c'est peut etre normal, j'ai la 4.30 B2

Je confirme je viens de me mettre a jour en B4 pour etre sur, et maintenant ça roule

Encore merci
Répondre