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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
Dernière modification par Micoute le dim. 04/oct./2015 16:25, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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 !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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 !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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 !
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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 !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre