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
avant le
il n'y a rien qui s'affiche.
j'ai même mis le
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
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
par
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.
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.

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