Page 1 sur 2

remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : lun. 18/nov./2013 16:38
par yumeria
bonjour.
après une longue période j'ai décider de me remettre a purebasic.
mais j'ai un peu oublier ce que j'ai appris et je bloque sur mon code.
j'essaie de rajouter des éléments dans une combobox automatiquement a partir de ma base de donnée sqlite mais cela ne marche pas.
la combobox reste vide.
cela est-il possible?
je vous transmet le code source:

Code : Tout sélectionner

#editeur=0
#combobox=1
UseSQLiteDatabase()
Filename$="C:\Users\yumeria\Documents\grosfi"
OpenDatabase(0,Filename$,"","")


OpenWindow(0,0,0,500,500,"test")
ComboBoxGadget(#combobox,0,0,250,21)
DatabaseQuery(0, "SELECT nomfilm FROM main.film")
       While NextDatabaseRow(0) 
         ClearGadgetItems(#combobox)
         AddGadgetItem(#combobox,-1,GetDatabaseString(0,1)) 
        Wend
  FinishDatabaseQuery(0)

EditorGadget(#editeur,40,40,400,400)


Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Gadget
  Select EventGadget()
    Case #combobox
      Position.l = GetGadgetState ( #combobox )
      
      If Position = 0
       DatabaseQuery(0, "SELECT * FROM main.film WHERE nomfilm='tarzan'")
       While NextDatabaseRow(0)
         ClearGadgetItems(#editeur)
     AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
  Wend
  FinishDatabaseQuery(0)
  
  ElseIf Position = 1
    DatabaseQuery(0, "Select * FROM main.film WHERE nomfilm='tom raider'")
    While NextDatabaseRow(0) 
      ClearGadgetItems(#editeur)
      AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
    Wend
    
  ElseIf Position = 2
    DatabaseQuery(0, "Select * FROM main.film WHERE nomfilm='et toi'")
    While NextDatabaseRow(0) 
      ClearGadgetItems(#editeur)
      AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
    Wend
    
  FinishDatabaseQuery(0)
EndIf
EndSelect
EndIf
  
Until Event=#PB_Event_CloseWindow
End



Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : lun. 18/nov./2013 18:04
par Ar-S
Salut, je suis pas devant mon pc pour tester mais je vois dans ta boucle

Code : Tout sélectionner

ClearGadgetItems(#editeur) 
	AddGadgetItem(#editeur,-1,GetDatabaseString(0,2)) 
Tu effaces tu mets un élément, tu effaces tu mets un élément etc ^^
Normal que ton gadget soit vide non ?

Place ton ClearGadgetItems(#editeur) avant ta boucle

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : lun. 18/nov./2013 18:50
par yumeria
merci pour la réponse.
j'ai fait comme demander mais même en placant

Code : Tout sélectionner

ClearGadgetItems(#combobox)
avant le

Code : Tout sélectionner

while
il n'y a rien qui s'affiche.
j'ai même mis le

Code : Tout sélectionner

ClearGadgetItems(#combobox)
en commentaire
mais c'est toujours pareil.

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : lun. 18/nov./2013 19:06
par Backup
arg !!

il fait ça a toute ses boucles !

Code : Tout sélectionner

While NextDatabaseRow(0)
      ClearGadgetItems(#editeur)
      AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
Wend
:mrgreen:

regarde la doc et lis ce que fait ClearGadgetItems() ...

apres , ben commence par mettre en remarque (en faisant preceder ta ligne par ";" ) TOUTE les lignes contenant ClearGadgetItems()
voir efface les carrement ces lignes ...


si vraiment ça ne marche toujour pas
remplace toute les lignes contenant

Code : Tout sélectionner

AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
par

Code : Tout sélectionner

AddGadgetItem(#editeur,-1,"toto")
et vois si tu vois , quelques chose

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : lun. 18/nov./2013 21:03
par Ar-S
Essaye de structurer ton code en utilisant une procédure, ça t'évitera les répétitions inutiles et surtout de plomber visuellement ton code. Je n'utilise pas SQLite et n'ai pas ta base donc je ne peux t'aider de ce coté, mais si tes appels sont bons, ce code devrait marcher.

Code : Tout sélectionner

Enumeration 0
    #editeur
    #combobox
EndEnumeration


; INITIALISATION ---
UseSQLiteDatabase()
Filename$="C:\Users\yumeria\Documents\grosfi"
OpenDatabase(0,Filename$,"","")



; --- Une procédure pour répéter la recherche des films

Procedure BaseToCombo(NomDuFilm.s)
        SQL_Select.s =  "Select * FROM main.film WHERE nomfilm='"+NomDuFilm.s+"'"
        DatabaseQuery(0, SQL_Select.s)
        ClearGadgetItems(#editeur)
		While NextDatabaseRow(0) 
			AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
		Wend
        FinishDatabaseQuery(0)
EndProcedure

; --- ----------------------------




; ------------ PROGRAMME ----------




OpenWindow(0,0,0,500,500,"test")
ComboBoxGadget(#combobox,0,0,250,21)
EditorGadget(#editeur,40,40,400,400)

DatabaseQuery(0, "SELECT nomfilm FROM main.film")
            ClearGadgetItems(#combobox)
				While NextDatabaseRow(0) 
				Debug GetDatabaseString(0,1)
					AddGadgetItem(#combobox,-1,GetDatabaseString(0,1)) 
				Wend
FinishDatabaseQuery(0)

; -------------BOUCLE  DU PROGRAMME ---------------


Repeat
	Event=WaitWindowEvent()
	EG = EventGadget()
	
	Select EG
	    Case #combobox
    		Position.l = GetGadgetState ( #combobox )
    		
    		Select position
    		
    		    Case 0
        		    BaseToCombo("tarzan") ; appel de la procédure
	            Case 1
	                BaseToCombo("tom raider") ; appel de la procédure
	            Case 2
	                BaseToCombo("et toi")  ; appel de la procédure
	                
             EndSelect
             
     EndSelect
Until Event=#PB_Event_CloseWindow
End



Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 5:37
par yumeria
j'ai essayer toutes vos solutions.
j'ai aussi remplacer mon code par celui-ci de Ar-S mais
malheureusement ça ne marche toujours pas. :cry:
il n'y a rien dans la combobox...
voici mon code sql pour ma BDD

Code : Tout sélectionner



/**************/
/*            */
/* grosfi.SQL */
/*            */
/**************/

/* Disable Foreign Keys */
pragma foreign_keys = off;
/* Begin Transaction */
begin transaction;

/* Database [grosfi] */
pragma auto_vacuum=0;
pragma encoding='UTF-8';
pragma page_size=1024;

/* Drop table [main].[film] */
drop table if exists [main].[film];

/* Table structure [main].[film] */
CREATE TABLE [main].[film] (
  [idfilm] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
  [nomfilm] TEXT, 
  [descriptionfilm] TEXT);

/* Data [main].[film] */
insert into [main].[film] values(1, 'tarzan', 'tarzan 
tarzan est jeune

tarzan est vieux
c''est pourquoi tarzan n''est plus trés jeune...

vous l''avezcompris...
moi pas.......
..........
aaaaaaaaaaaa
quoi?

...');
insert into [main].[film] values(2, 'tom raider', 'et tom raider...
quel
qu''un

connais 
moi non,oui,un peu?');
insert into [main].[film] values(3, 'et toi', 'aaaaaaaaaa

aaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaa');


/* Commit Transaction */
commit transaction;

/* Enable Foreign Keys */
pragma foreign_keys = on;


j'ai mis un peu n'importe quoi dans cette BDD mais c'est juste pour le test. :wink:

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 8:41
par flaith
Dans ton 'AddGadgetItem(#combobox,-1,GetDatabaseString(0,1)) '
tu demande la colonne 1, mais tu fais un select sur une colonne, as-tu essayé de mettre AddGadgetItem(#combobox,-1,GetDatabaseString(0,0)) ?

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 10:08
par yumeria
toujours pareil après modification.

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 10:16
par Ar-S
tu parles de combobox ou d'editor ? Car jusqu'ici tu essaye d'afficher dans ton editor..

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 10:21
par yumeria
non,je parle de la combobox.
j'essaie d'afficher les noms de films recupéré dans la BDD
directement dans la combobox.
afin de chaque element de la combobox aie un nom de film.

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 10:55
par beruska
Personnellement j'utilise une macro pour pouvoir rétablir la combo chaque fois qu'il y a changement.

Code : Tout sélectionner

Macro RemplirCombo
  
ClearGadgetItems(#combobox)
DatabaseQuery(0, "SELECT nomfilm FROM main.film ORDER BY nomfilm")

       While NextDatabaseRow(0)
         AddGadgetItem(#combobox,-1,GetDatabaseString(0,0));  dans la query il n'y a qu'une colonne, donc mettre 0
       Wend
       FinishDatabaseQuery(0)
       
EndMacro
Bon courage!

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 11:00
par Ar-S
Pour tracer tes erreurs, tu devrais faire des tests pour chaque actions
Structure ton code ainsi

Code : Tout sélectionner

Remplace
OpenDatabase(#BaseDeDonnees, NomBaseDeDonnes$, Utilisateur$, MotdePasse$ [, Plugin]) 
par 
Resultat = OpenDatabase(#BaseDeDonnees, NomBaseDeDonnes$, Utilisateur$, MotdePasse$ [, Plugin])
Debug Resultat
Ainsi tu vois si Resultat est = 0 (la connexion à échouée) ou pas.
Idem pour les autres boucles.
Prends vraiment cette habitude sinon tu vas chercher tes erreurs des plombes.

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 11:22
par Mesa
En utilisant que les exemples de la doc, j'ai pu faire ça.

Code : Tout sélectionner

;Création de la BD dans le chemin courant

UseSQLiteDatabase()

Filename$ = "grosfi.sql";OpenFileRequester("Choisissez le nom d'un fichier", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)

If CreateFile(0, Filename$)
  Debug "Fichier de base de donnees cree"
  CloseFile(0)
EndIf

If OpenDatabase(0, Filename$, "", "",#PB_Database_SQLite )
  Debug "Connecté à grosfi.sqlite"
  
  If DatabaseUpdate(0, "CREATE TABLE film (idfilm INT, nomfilm VARCHAR(255), descriptionfilm VARCHAR(255))")
    Debug "Table cree"
  EndIf
  If DatabaseUpdate(0, "INSERT INTO film (idfilm, nomfilm, descriptionfilm) VALUES (1, 'Tarzan', 'aaahhihahihaa')")
    Debug "Tarzan ok"
  EndIf
  If DatabaseUpdate(0, "INSERT INTO film (idfilm, nomfilm, descriptionfilm) VALUES (2, 'Tomb Raider', 'mmmmhh')")
    Debug "Tomb Raider ok"
  EndIf
  If DatabaseUpdate(0, "INSERT INTO film (idfilm, nomfilm, descriptionfilm) VALUES (3, 'Superman', 'mouai')")
    Debug "Superman ok"
  EndIf
  
EndIf
If DatabaseQuery(0, "SELECT * FROM film WHERE idfilm > 0")
  
  While NextDatabaseRow(0)
    Debug GetDatabaseString(0, 1)
    Debug GetDatabaseString(0, 2)
  Wend
  
  FinishDatabaseQuery(0)
EndIf

CloseDatabase(0)
;    Else
;       Debug "Can't open database !"
;    EndIf
; Else
;    Debug "Can't create the database file !"
; EndIf
;=================================================================



;UseSQLiteDatabase()
#editeur=0 
#combobox=1
OpenWindow(0,0,0,500,500,"test") 
ComboBoxGadget(#combobox,0,0,250,21) 

If OpenDatabase(0, "grosfi.sql", "", "",#PB_Database_SQLite )
  Debug "Connecté à grosfi.sqlite"
  If DatabaseQuery(0, "SELECT * FROM film WHERE idfilm > 0")
    
    While NextDatabaseRow(0)
      Debug GetDatabaseString(0, 1)
      AddGadgetItem(#combobox,-1,GetDatabaseString(0,1))
    Wend
    
    FinishDatabaseQuery(0)
  EndIf
  CloseDatabase(0)
EndIf

EditorGadget(#editeur,40,40,400,400) 


Repeat 
  Event=WaitWindowEvent() 
  If Event=#PB_Event_Gadget 
    Select EventGadget() 
      Case #combobox 
        Position.l = GetGadgetState ( #combobox ) 
        ;Debug Position
        nomfilm$="'"+GetGadgetItemText(#combobox,  Position)+"'"
        ;         Debug "========="
        ;         Debug nomfilm$
        ;         Debug "========="
        If OpenDatabase(0, "grosfi.sql", "", "",#PB_Database_SQLite )
          Debug "Connecté à grosfi.sqlite"
          If DatabaseQuery(0, "SELECT * FROM film WHERE nomfilm="+nomfilm$)
            While NextDatabaseRow(0)
              ClearGadgetItems(#editeur)
              SetGadgetText(#editeur, GetDatabaseString(0,2))    
              ;AddGadgetItem(#editeur,-1,GetDatabaseString(0,2))
            Wend   
            FinishDatabaseQuery(0)
          EndIf
          CloseDatabase(0)
        EndIf
    EndSelect 
  EndIf 
  
Until Event=#PB_Event_CloseWindow 
End 
(Je n'ai pas vérifié pour les accents, il faudra peut-être compiler en unicode)

Reste plus qu'à optimiser le code.
Ce code marche sur mon Xp 32b

Mesa.

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mar. 19/nov./2013 11:25
par falsam
Il n'y a pas besoin d'identifiant utilisateurs pour se connecter à une base de données SQlite.

Je viens de faire un exemple qui permet de :
-Créer une base de données en mémoire.
-Créer ta table films (IdAuto + Titre + résumé)
-Créer 10 titres fictifs
-Remplir la combobox de ces 10 titres.
-Afficher le résumé du film sélectionné dans la combobox.

Et ça fonctionne :)

Code : Tout sélectionner

Enumeration Database
  #Database
EndEnumeration

Enumeration Window
  #Mainform
EndEnumeration

Enumeration gadget
  #Films
  #Resume
EndEnumeration

Define.l Event, GEvent
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Global ReqSql.s, Titre.s, Resume.s

;Fenetre de l'application
Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "Test", WindowStyle)
  TextGadget(#PB_Any, 10, 10, 50, 20, "Films")
  ComboBoxGadget(#Films, 60, 10, 300, 22)
  EditorGadget(#Resume, 10, 40, 350, 300)
EndProcedure

;Lecture du résumé correspondant au titre sélectionné
Procedure ReadResume(IdFilm.i)
  ReqSql = "SELECT resume FROM films WHERE idfilm = " + Chr(34)+Str(idfilm)+Chr(34)
  If DatabaseQuery(#Database, ReqSql)
    NextDatabaseRow(#Database)
    SetGadgetText(#Resume, GetDatabaseString(#Database, 0)) 
    FinishDatabaseQuery(#Database)
  Else
    Debug DatabaseError()
  EndIf
EndProcedure

;C'est ici que ça commence
Procedure Start()
  UseSQLiteDatabase()
  Open_MainForm()
  
  ;Ouverture d'une base de données vierge en mémoire
  If OpenDatabase(#Database, ":memory:", "", "")
    Debug "Yeah Connecté"
    
    ;Creation de la base de la table films    
    ReqSql = "CREATE TABLE films (" 
  
    ReqSql + "Idfilm INTEGER PRIMARY KEY," ;Identifiant enregistrement
    ReqSql + "titre TEXT," ;Titre du film
    ReqSql + "resume TEXT" ;Résumé du film  
    ReqSql + ")" ;Fin de la requete
  
    ;Exécution de la requete
    DatabaseUpdate(#Database, ReqSql)
    
    ;Ajout de 10 titres 
    For N = 1 To 10
      
      Titre = "Film "+Str(N)
      Resume = "Resumé du film " + Str(N)
      
      ReqSql = "INSERT INTO films (titre, resume) values ("
      ReqSql + Chr(34) + Titre + Chr(34)+Chr(44)
      ReqSql + Chr(34) + Resume + Chr(34)+")"
      
      DatabaseUpdate(#Database, ReqSql)
    Next
    
    ;Remplissage de la combobox #Films
    N=0
    DatabaseQuery(#Database, "SELECT * FROM films")   
    While NextDatabaseRow(#Database)
      AddGadgetItem(#Films, -1, GetDatabaseString(#Database, 1))
      
      ;Petite astuce : On associe chaque item de la combobox à l'identifiant automatique de l'enregistrement associé.
      SetGadgetItemData(#Films, N, GetDatabaseLong(#Database, 0))
      N+1
    Wend
    FinishDatabaseQuery(#Database)
    
    ;Affichage du premier titre
    SetGadgetState(#Films, 0)
    Readresume(GetGadgetItemData(#Films, 0))
    
  Else
    Debug DatabaseError()    
  EndIf
  
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Films
          Readresume(GetGadgetItemData(#Films, GetGadgetState(#Films)))
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

Re: remplir ComboBoxgadget automatiquement avec BDD sqlite

Publié : mer. 20/nov./2013 12:44
par yumeria
merci pour l'exemple falsam.
ça me permet d'avoir des idées et d'avancer.
lorsque j'essaye ton exemple ça fonctionne parfaitement pour la BBD en memoire.
mais lorsque j'essaie de l'adapter a ma BDD réel,le nom du film s'affiche bien dans la combobox...
mais malheureusement aussi dans la textbox.au lieu d'afficher le resumé.
j'ai du encore faire une fausse manip :twisted:

Code : Tout sélectionner



Enumeration ;Database
  #Database
EndEnumeration

Enumeration ;Window
  #Mainform
EndEnumeration

Enumeration ;gadget
  #Films
  #Resume
EndEnumeration

Define.l Event, GEvent
Global Filename.s="C:\Users\yumeria\Documents\grosfi"
Global  WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Global ReqSql.s, Titre.s, Resume.s,Filename.s

;Fenetre de l'application
Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "Test", WindowStyle)
  TextGadget(#PB_Any, 10, 10, 50, 20, "Films")
  ComboBoxGadget(#Films, 60, 10, 300, 22)
  EditorGadget(#Resume, 10, 40, 350, 300)
EndProcedure

;Lecture du résumé correspondant au titre sélectionné
Procedure ReadResume(IdFilm.i)
  ReqSql = "SELECT nomfilm FROM main.film WHERE idfilm = " + Chr(34)+Str(idfilm)+Chr(34)
  If DatabaseQuery(#Database, ReqSql)
    NextDatabaseRow(#Database)
    SetGadgetText(#Resume, GetDatabaseString(#Database, 0)) 
    FinishDatabaseQuery(#Database)
  Else
    Debug DatabaseError()
  EndIf
EndProcedure

;C'est ici que ça commence
Procedure Start()
  UseSQLiteDatabase()
  Open_MainForm()
  
  
  ;Ouverture d'une base de données vierge en mémoire
  If OpenDatabase(#Database, Filename.s, "", "")
    Debug "Yeah Connecté"
    
    
    
    ;Remplissage de la combobox #Films
    N=0
    DatabaseQuery(#Database, "SELECT * FROM main.film")   
    While NextDatabaseRow(#Database)
      AddGadgetItem(#Films, -1, GetDatabaseString(#Database, 1))
      
      ;Petite astuce : On associe chaque item de la combobox à l'identifiant automatique de l'enregistrement associé.
      SetGadgetItemData(#Films, N, GetDatabaseLong(#Database, 0))
      N+1
    Wend
    FinishDatabaseQuery(#Database)
    
    ;Affichage du premier titre
    SetGadgetState(#Films, 0)
    Readresume(GetGadgetItemData(#Films, 0))
    
  Else
    Debug DatabaseError()    
  EndIf
  
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Films
          Readresume(GetGadgetItemData(#Films, GetGadgetState(#Films)))
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

nom de ma BDD: grosfi
table de ma BDD: main.film
les colonnes de ma BDD (dans l'ordre): idfilm,nomfilm,descriptionfilm