Page 1 sur 1

[Résolu]Comment choisir une table dans une bdd muli tables

Publié : dim. 04/oct./2015 9:46
par Micoute
Bonjour à tous,

toujours avec mon problème de bases de données, j'aimerais choisir un table dans une base multi tables, pour pouvoir la lister.

Code : Tout sélectionner

Procedure OuvrirUneBaseDeDonnees()
  FichierParDefaut$ = "*.SQL"
  Filtre$ = "SQlite (*.Sqlite)|*.SQL*"
  Filtre  = 0
  FichierBdd = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
  If FichierBdd
    
    ; Liste des tables
    OpenDatabase(#Fichier_Bdd, FichierBdd, "", "", #PB_Database_SQLite)
    SetGadgetText(#Str_BDD,FichierBdd)
    ReqSQL = "Select * From sqlite_master order by type Desc, name Asc"
    If DatabaseQuery(#Fichier_Bdd, ReqSQL)
      Index = 0
      While NextDatabaseRow(#Fichier_Bdd)
        If GetDatabaseString(#Fichier_Bdd, 0) = "table"
          Table = GetDatabaseString(#Fichier_Bdd, 1)
          AddGadgetItem(#Cmb_Table, -1, Table)
          Index + 1
        EndIf
      Wend
    EndIf
    SetGadgetText(#Cmb_Table, Table)
    
    ;lister la structure d'une table
    Index = 0
    Table = GetGadgetText(#Cmb_Table)
    ReqSql = "Pragma table_info(" + Chr(34) + Table + Chr(34) + ")"
    If DatabaseQuery(#Fichier_Bdd, ReqSql)
      While NextDatabaseRow(#Fichier_Bdd)
        AddElement(nom())
        nom() = GetDatabaseString(#Fichier_Bdd, 1)    ;nom
        
        ;sType.s =  GetDatabaseString(#Fichier_Bdd, 2)
        ;Debug sType
        ;snonnul.s =  GetDatabaseString(#Fichier_Bdd, 3)
        ;Debug snonnul
        ;sDefVal.s =  GetDatabaseString(#Fichier_Bdd, 4)
        ;Debug sDefVal
        ;sCle_primaire.s =  GetDatabaseString(#Fichier_Bdd, 5)
        ;Debug sCle_primaire
      
        Index + 1
      Wend
    EndIf
    
    ;Créer l'en-tête de la ListIcon
    Index = 0
    ForEach nom()
      AddGadgetColumn(#ListIcon, Index, nom(), 200)
      Index + 1
    Next 
    

    
    ; lister les éléments d'un table et remplir la ListIcon
    Global Donnee$ = ""
    ReqSql = "Select * From " + table
    If DatabaseQuery(#Fichier_Bdd, ReqSql)
      While NextDatabaseRow(#Fichier_Bdd)
        For Index = 0 To ListSize(nom()) - 1
          AddElement(Donnee())
          Donnee() = GetDatabaseString(#Fichier_Bdd, Index)
          Donnee$ + Donnee() + Chr(10)
        Next
        AddGadgetItem(#ListIcon, -1, Donnee$ + Chr(10))
      Donnee$ = ""
      Wend
      FinishDatabaseQuery(#Fichier_Bdd)
       ColorerListe(#ListIcon)
    Else
      MessageRequester("Erreur", DatabaseError())
    EndIf  
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf
  
  FermerLaBaseDeDonnees()
EndProcedure
Ce serait une grande joie pour moi, d'accepter votre aide ou vos conseils.

Re: Comment choisir une table dans une base de données muli

Publié : dim. 04/oct./2015 10:01
par falsam
Apparemment, je n'ai pas du répondre à ta demande
http://www.purebasic.fr/french/viewtopi ... 61#p177061
Micoute a écrit :j'aimerais choisir un table dans une base multi tables,
Jusque là j'ai compris
Micoute a écrit : pour pouvoir la lister
Qu'est ce que tu veux lister ?
1 - La structure ?
2 - Les enregistrements ?

Re: Comment choisir une table dans une base de données muli

Publié : dim. 04/oct./2015 10:20
par Micoute
Bonjour falsam, ce qui m'intéresserais le plus, c'est en priorité les enregistrements, mais la structure, ce n'est pas encore prévu, mais pourquoi pas, si c'est en plus !

Ce que je souhaite faire, c'est cliquer sur un élément du combo et que ça me liste les enregistrement de la table choisie !

Re: Comment choisir une table dans une base de données muli

Publié : dim. 04/oct./2015 15:12
par Micoute
Finalement, j'ai trouvé la solution, il suffisait de partager la procédure OuvrirUneBaseDeDonnees() en 2 deux et créer la procédure Lister_Enregistrements_Table(Table.s)

Merci tout de même d'avoir donné de ton aide précieuse qui m'a permis de démarrer !

Re: Comment choisir une table dans une base de données muli

Publié : dim. 04/oct./2015 15:13
par falsam
Micoute a écrit :Bonjour falsam, ce qui m'intéresserais le plus, c'est en priorité les enregistrements, mais la structure, ce n'est pas encore prévu, mais pourquoi pas, si c'est en plus !
Un code qui récapitule ta demande.

Code : Tout sélectionner

Enumeration
  #DataBaseName
EndEnumeration

Enumeration Window
  #MainForm
EndEnumeration

Enumeration gadget
  #DatabaseSelect   ;Selecteur de base de données
  #DataBase         ;Base de données en cours de visualisation
  #ListTables       ;Liste des tables 
  #ListRows         ;Contenue d'une table
  #Splitter         ;Splitter 
EndEnumeration

Declare MainFormShow()
Declare DataBaseSelect()
Declare DataBaseListTable()
Declare TableListItems()

UseSQLiteDatabase()

MainFormShow()

;Fenetre principale de l'application
Procedure MainFormShow()
  If OpenWindow(#MainForm, 0, 0, 1024, 768, "Tiny SQlite Vision", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)      
    
    ;Selecteur de base de données 
    ButtonGadget(#DatabaseSelect, 410, 10, 22, 22, "?")
    
    ;Base de donnée en cours de consultation
    TextGadget(#PB_Any, 10, 10, 100, 20, "Base de données :")
    StringGadget(#Database, 105, 10, 300, 22, "?", #PB_String_ReadOnly)
    
    ;Affichage des tables et de la structure de chaque table
    TreeGadget(#ListTables, 0, 0, 0, 0)
    
    ;Affichage du contenu d'une table sélectionneé dans #ListTables
    ListIconGadget(#ListRows, 0, 0, 0, 0, "?", 1000, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop)
    
    ;Splitter séparant la liste des tables et le contenu d'une table
    SplitterGadget(#Splitter, 10, 40, 1000, 700, #ListTables, #ListRows, #PB_Splitter_Vertical)
    SetGadgetState(#Splitter, 300)
    
    ;Evénéments
    BindGadgetEvent(#DatabaseSelect, @DataBaseSelect(), #PB_EventType_LeftClick)
    BindGadgetEvent(#ListTables, @TableListItems(), #PB_EventType_LeftClick)
    
    Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
  EndIf
EndProcedure

;Selection d'une base de données
Procedure DataBaseSelect()
  Protected Database.s = OpenFileRequester("Selectionner une base de données SQLite", "*.sqlite", "", 0)
  
  If Database
    ClearGadgetItems(#ListTables)
    ClearGadgetItems(#ListRows)
    
    SetGadgetText(#Database, Database)
    
    ;Ouverture de la base de données
    OpenDatabase(#DataBase, Database, "","") 
    
    ;Affichage des tables
    DataBaseListTable()
  EndIf
EndProcedure

;Affichage de la liste des tables et de la structure de chaque table
Procedure DataBaseListTable()
  Protected ReqSql.s, Table.s, Buffer.s , Dim Tables.s(0), n
  
  ;Extraction de la liste des tables
  ReqSQL="Select * From sqlite_master order by type Desc, name Asc"
  
  If DatabaseQuery(#Database, ReqSQL)  
    While NextDatabaseRow(#Database)
      If GetDatabaseString(#Database,0)="table"
        Tables(n) = GetDatabaseString(#Database,1)
        n+1 : ReDim Tables(n)
      EndIf  
    Wend
    
    ;Affichage des tables
    For n = 0 To ArraySize(Tables()) - 1
      AddGadgetItem(#ListTables, -1, Tables(n))
      
      ;Affichage de la Structure de chacune des tables
      ReqSQL="PRAGMA table_info(" + Chr(34) + Tables(n) + Chr(34) + ")"
      If DatabaseQuery(#Database, ReqSQL)
        While NextDatabaseRow(#Database)
          Buffer = GetDatabaseString(#Database, 1) + " " 
          Buffer + GetDatabaseString(#Database, 2) + " " 
          If GetDatabaseString(#Database, 5) = "1"
            Buffer + "PRIMARY KEY"
          EndIf
          
          AddGadgetItem(#ListTables, -1, Buffer, 0, 1)
        Wend
      EndIf  
    Next
  EndIf
EndProcedure

;Affiche le contenu d'une table
Procedure TableListItems()
  Protected ReqSql.s, Table.s, Buffer.s, Col.s
  
  If GetGadgetState(#ListTables) <> -1
    If GetGadgetItemAttribute(#ListTables, GetGadgetState(#ListTables), #PB_Tree_SubLevel) = 0 
      ClearGadgetItems(#ListRows)
      
      ;Suppression des colonnes 
      While GetGadgetItemText(#ListRows, -1, 0)
        RemoveGadgetColumn(#ListRows, 0)
      Wend
      
      ;Mémorisation de la table à visualiser 
      Table = GetGadgetItemText(#ListTables, GetGadgetState(#ListTables))
      
      ;Requete de sélection des enregistrements
      ReqSql = "select * from " + Table
      If DatabaseQuery(#Database, ReqSQL)
        
        ;AJout des colonnes
        For i = 0 To DatabaseColumns(#Database) - 1
          Col = DatabaseColumnName(#DataBase, i)
          AddGadgetColumn(#ListRows, i, Col, 100)
        Next     
        
        ;Affichage du contenu de la table
        While NextDatabaseRow(#DataBase)
          For i = 0 To DatabaseColumns(#DataBase) - 1
            Buffer + GetDatabaseString(#DataBase, i) + Chr(10)
          Next
          AddGadgetItem(#ListRows, -1, Buffer)
          Buffer = ""
        Wend
      EndIf
    EndIf
  EndIf
EndProcedure
C'est un code qui demande à être améliorer pour afficher des tables contenant beaucoup d'enregistrements. Un thread ne ferait pas de mal je pense.
Micoute a écrit :Finalement, j'ai trouvé la solution ....
Tssss j'ai répondu 1 minutes après toi !

Re: [Résolu]Comment choisir une table dans une bdd muli tabl

Publié : dim. 04/oct./2015 16:31
par Micoute
Merci falsam, c'est encore plus beau que le ne l'avais imaginé, tu peut voir d'après mon code que j'avais posté.

Pour être récapitulée, la demande, elle l'est en beauté.

Tu as très bien fait de répondre après moi et je n'ai rien perdu à attendre et je te remercie pour ça aussi !