TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Anfängerfragen zum Programmieren mit PureBasic.
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Ruun »

Tach!

Bin neu hier und versuche mich in PB einzuarbeiten. Ja auch generell in die Programmierung. So soll mein Test-Programm eine kleine CD-Verwaltung sein. Da lerne ich auch gleich mit Datenbanken umzugehen, jetzt erstmal mit SQLite. Ein paar Erfahrungen mit PHP und MySQL habe ich.

Auch wenn es viel ist, poste ich mal meinen Code hier und verweise mal auf die kleine DB.
http://www.dunkelland.de/pb/musiclist.sqlite

Code: Alles auswählen

;{- Enumerations / DataSections
;{ Windows
Global Window_Main
;}
;{ Status bars
Global StatusBar_Window_Main
;}
;{ Gadgets
Global Frame3D_5
Global Tree_6
Global ListView_7
;}
;}

UseSQLiteDatabase()
;DatabaseFile$ = "E:\Daten\PureBasic\Projekte\Musiklist\musiclist.sqlite"
DatabaseFile$ = GetCurrentDirectory()+"\Musiklist\musiclist.sqlite"
;Debug DatabaseFile$
;Debug GetCurrentDirectory()

Procedure OpenWindow_Window_Main()
  Window_Main = OpenWindow(#PB_Any, 450, 200, 612, 429, "Musikverwaltung", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  If Window_Main
    StatusBar_Window_Main = CreateStatusBar(#PB_Any, WindowID(Window_Main))
    If StatusBar_Window_Main
      AddStatusBarField(200)
      AddStatusBarField(200)
    EndIf
    Frame3D_5 = Frame3DGadget(#PB_Any, 210, 15, 390, 380, "")
    Tree_6 = TreeGadget(#PB_Any, 15, 20, 180, 375, #PB_Tree_AlwaysShowSelection)
    ListView_7 = ListViewGadget(#PB_Any, 240, 65, 155, 115)
  EndIf
EndProcedure


OpenWindow_Window_Main()

If OpenDatabase(0, DatabaseFile$, "", "")


		StatusBarText(StatusBar_Window_Main, 0, "DB geladen")

				
				If DatabaseQuery(0, "SELECT * FROM alben")

    				While NextDatabaseRow(0)  ; alle Einträge durchlaufen
 
 								;Debug GetDatabaseString(0, 0)       ; Inhalt vom ersten Feld anzeigen
 
 								AddGadgetItem (Tree_6, -1, GetDatabaseString(0, 6), 0, 0)
 								AddGadgetItem (ListView_7, -1, GetDatabaseString(0, 1))	

						Wend	
				
						FinishDatabaseQuery(0)
  
  			Else
    				MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
				EndIf				

				CloseDatabase(0)

Else
		StatusBarText(StatusBar_Window_Main, 0, "DB nicht geladen")
EndIf



;{- Event loop
Repeat
  Select WaitWindowEvent()
    ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Frame3D_5
        Case Tree_6
        Case ListView_7
      EndSelect
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case Window_Main
          CloseWindow(Window_Main)
          Window_Main = 0
          Break
      EndSelect
  EndSelect
ForEver
;
;}
Mein Problem ist, daß ich es nicht hinbekomme, das TreeGadget richtig mit den Einträgen aus der DB zu füllen. Ich möchte gerne die Kategorien als Knoten haben und entsprechend als Sublevel die gelisteten Bands. Das mit den Knoten habe ich, das andere noch nicht. Wahrscheinlich ist das auch keine Sache von PB sondern von der DB, also entsprechende SQL-Query's?!

Wird mich freuen, wenn mal jemand sich der Sache annehmen würde und mir den einen oder anderen Tipp geben könnte.


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Ruun »

Ok, ist noch zu früh für euch... ;-)

Ich hab dann mal selber noch ein bissel probiert und löse es mit einer zweiten Tabelle, welche die Kategorien enthält. Mittels JOIN kann ich das dann so auslesen wie will ich!

Code: Alles auswählen

				If DatabaseQuery(0, "Select band, category FROM alben LEFT JOIN category USING (category) GROUP BY band ORDER BY category")

    				While NextDatabaseRow(0)  ; alle Einträge durchlaufen
 
 								;Debug GetDatabaseString(0, 0)       ; Inhalt vom ersten Feld anzeigen
 
 								AddGadgetItem (Tree_6, -1, GetDatabaseString(0, 1), 0, 0)
 								AddGadgetItem (Tree_6, -1, GetDatabaseString(0, 0), 0, 1)
 								AddGadgetItem (ListView_7, -1, GetDatabaseString(0, 0))	

						Wend	
				
						FinishDatabaseQuery(0)
  
  			Else
    				MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
				EndIf		
Wer es sich genauer anschauen möchte, kann sich bei mir melden.


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Ruun »

Tja, da hab ich mich zu früh gefreut. So funktioniert das dann doch nicht. Das Problem ist, das mir zwar die Bands grupiert werden, aber eben nicht die Kategorien. Ich hab schon einiges versucht, wie z.B. noch eine Abfrage in der Schleife oder diverse andere Select-Anweisungen, bekomme es aber leider nicht hin.
Könnte doch mal einer in den Code schauen und mich berichtigen. Die Datenbank ist auch aktualisiert auf'n Server.

Code: Alles auswählen

;{- Enumerations / DataSections
;{ Windows
Global Window_Main
;}
;{ Status bars
Global StatusBar_Window_Main
;}
;{ Gadgets
Global Window_Main_Frame3D_1	; Frame für Datenausgabe
Global Window_Main_Tree_1		; TreeView auf Startseite
Global Window_Main_ListView_1	; ListView auf Startseite
;}
;}

UseSQLiteDatabase()		; Wir nutzen SQLite als Datenbank
DatabaseFile$ = GetCurrentDirectory() + "musiclist.sqlite"		; Name und Path der Datenban

Procedure OpenWindow_Window_Main()
  Window_Main = OpenWindow(#PB_Any, 450, 200, 612, 429, "Musikverwaltung", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  If Window_Main
    StatusBar_Window_Main = CreateStatusBar(#PB_Any, WindowID(Window_Main))
    If StatusBar_Window_Main
      AddStatusBarField(200)
      AddStatusBarField(200)
    EndIf
    Window_Main_Frame3D_1 = Frame3DGadget(#PB_Any, 210, 15, 390, 380, "")
    Window_Main_Tree_1 = TreeGadget(#PB_Any, 15, 20, 180, 375, #PB_Tree_AlwaysShowSelection)
    Window_Main_ListView_1 = ListViewGadget(#PB_Any, 240, 65, 155, 115)
  EndIf
EndProcedure


OpenWindow_Window_Main()


If OpenDatabase(0, DatabaseFile$, "", "")

	StatusBarText(StatusBar_Window_Main, 0, "Datenbank geladen")
	
	If DatabaseQuery(0, "Select band, category FROM alben LEFT JOIN category USING (category) GROUP BY band ORDER BY category")

		While NextDatabaseRow(0)  ; alle Einträge durchlaufen
 
			;Debug GetDatabaseString(0, 0)       ; Inhalt vom ersten Feld anzeigen
 
			AddGadgetItem (Window_Main_Tree_1, -1, GetDatabaseString(0, 1), 0, 0)			; Kategorie
			AddGadgetItem (Window_Main_Tree_1, -1, GetDatabaseString(0, 0), 0, 1)			; Band
			StatusBarText(StatusBar_Window_Main, 1, "Anzahl Alben: ")
			
		Wend
				
		FinishDatabaseQuery(0)
		
	Else

		MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: " + DatabaseError())

	EndIf				

	CloseDatabase(0)

Else

	StatusBarText(StatusBar_Window_Main, 0, "Fehler beim Laden der Datenbank!")
	MessageRequester("Fehler", "Fehler beim Laden der Datenbank!")

EndIf



;{- Event loop
Repeat
  Select WaitWindowEvent()
    ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Window_Main_Frame3D_1
        Case Window_Main_Tree_1
        Case Window_Main_ListView_1
      EndSelect
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case Window_Main
          CloseWindow(Window_Main)
          Window_Main = 0
          Break
      EndSelect
  EndSelect
ForEver
;
;}
Ich möchte also, daß zuerst die Kategorien als obere Ebene gelistet werden. Als erstes Sublevel dann die Bands und vielleicht als zweites Sublevel die passenden Alben der Band.


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Kiffi »

ich würde es so machen:

Code: Alles auswählen

  Define SQL.s
  
  SQL = " select alben.category, alben.band, alben.album from "
  SQL + " alben inner join category "
  SQL + " on alben.category = category.category "
  SQL + " order by alben.category, alben.band, alben.album "
  
  
  Define Kategorie.s, AltKategorie.s
  Define Band.s, AltBand.s
  Define Album.s, AltAlbum.s
  
  If DatabaseQuery(0, SQL)
    
    While NextDatabaseRow(0)  ; alle Einträge durchlaufen
      
      Kategorie = GetDatabaseString(0, 0)
      Band      = GetDatabaseString(0, 1)
      Album     = GetDatabaseString(0, 2)
      
      If AltKategorie <> Kategorie
        AltKategorie = Kategorie
        AddGadgetItem (Window_Main_Tree_1, -1, Kategorie, 0, 0)         ; Kategorie  
      EndIf
       
      If AltBand <> Band
        AltBand = Band
        AddGadgetItem (Window_Main_Tree_1, -1, Band, 0, 1)         ; Band  
      EndIf

      If AltAlbum <> Album
        AltAlbum = Album
        AddGadgetItem (Window_Main_Tree_1, -1, Album, 0, 2)         ; Album
      EndIf
      
      StatusBarText(StatusBar_Window_Main, 1, "Anzahl Alben: ")
      
    Wend
    
    FinishDatabaseQuery(0)
    
  Else
    
    MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: " + DatabaseError())
    
  EndIf  
Grüße ... Kiffi

P.S.: In Alben.Category sollte die ID von Category stehen; nicht Category.Category.
a²+b²=mc²
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Ruun »

Wow - funzt tadellos! Danke dir dafür. Nebenbei hab ich auch noch gleich was neues zu PB dazugelernt und nicht nur SQL-Abfragen.

:allright:


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Kiffi »

der Vollständigkeit halber noch folgender Nachtrag:

AltBand und AltAlbum sollten an geeigneter Stelle auch
wieder zurückgesetzt werden, damit ein entsprechender
Eintrag auch vorgenommen wird, wenn beispielsweise
eine Band gleichen Namens bei wechselnder Kategorie
vorhanden ist.

Code: Alles auswählen

If AltKategorie <> Kategorie
	AltKategorie = Kategorie
	AddGadgetItem (Window_Main_Tree_1, -1, Kategorie, 0, 0)         ; Kategorie  
	AltBand = ""
	AltAlbum = ""
EndIf

If AltBand <> Band
	AltBand = Band
	AddGadgetItem (Window_Main_Tree_1, -1, Band, 0, 1)         ; Band  
	AltAlbum = ""
EndIf

If AltAlbum <> Album
	AltAlbum = Album
	AddGadgetItem (Window_Main_Tree_1, -1, Album, 0, 2)         ; Album
EndIf
Des weiteren würde ich konsequenterweise auch die Alben (wie die
Kategorien) in einer externen Tabelle auslagern, so dass Du eine Tabelle
Bands, eine Tabelle Alben und eine Tabelle Kategorien hast.

Grüße ... Kiffi
a²+b²=mc²
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

Anzahl Datensätze (Zeilen) aus DB-Tabelle (SQLite)

Beitrag von Ruun »

Kiffi hat geschrieben:der Vollständigkeit halber noch folgender Nachtrag:

AltBand und AltAlbum sollten an geeigneter Stelle auch
wieder zurückgesetzt werden, damit ein entsprechender
Eintrag auch vorgenommen wird, wenn beispielsweise
eine Band gleichen Namens bei wechselnder Kategorie
vorhanden ist.
Das soll ja nicht vorkommen, da die Kategorien ja die Anfangsbuchstaben der Bands sind. Dennoch binde ich das mit ein.
Des weiteren würde ich konsequenterweise auch die Alben (wie die
Kategorien) in einer externen Tabelle auslagern, so dass Du eine Tabelle
Bands, eine Tabelle Alben und eine Tabelle Kategorien hast.
Ok, das sind Überlegungen die später hinzukommen. Es werden mit Sicherheit generell noch mehr Tabellen hinzukommen. Mir geht es hier in erster Linie erst einmal darum, mich mit PB vertraut zu machen und die verschiedenen Befehle zu testen. Genrell um zu schauen was es alles schon gibt und ob ich damit auch klar komme. Oft fehlt mir das Logische am Programmieren, wie zum Bsp. bei dem hier:
Ich möchte ja noch gerne die Anzahl der Alben aus der Tabelle alben ausgeben. Mit PHP und MySQL ist das ja nicht das Problem und SELECT count(*) from alben wird ja hier auch unterstützt. Nur schaffe ich es einfach nicht das Ergebniss in irgendeine Variable zu übergeben.
Die für mich logischste Variante wäre folgende:

Code: Alles auswählen

DatabaseQuery(0, "select count(*) as anzahl from alben")		
anzahl$ = GetDatabaseString(0, 0)
MessageRequester("Info", "Anzahl: " + anzahl$)
Leider wird mir da aber garnichts ausgegeben. Vielleicht binde ich es auch einfach nur in der falschen Stelle in meinem Code ein. Oder muß ich dafür noch einmal komplett die Datenbank öffnen? Oder gar durch eine Schleife laufen lassen?
Was ich geschafft habe, wäre es, über eine Auflistung aus dem Tree-Gadget, denn mit CountGadgetItems kann man das schön und schnell erledigen. Sowas vermisse ich eben für die Datenbank, denn da hab ich nur 'Anzahl der Spalten', aber eben nicht der Zeilen gefunden.
Hast du dafür vielleicht eine verständliche Lösung?


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von mk-soft »

Code: Alles auswählen

DatabaseQuery(0, "select count(*) from alben")      
anzahl$ = GetDatabaseString(0, 0)
MessageRequester("Info", "Anzahl: " + anzahl$)
oder

Code: Alles auswählen

DatabaseQuery(0, "select count(*) from alben")      
count = GetDatabaseLong(0, 0)
MessageRequester("Info", "Anzahl: " + str(count))
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Ruun
Beiträge: 8
Registriert: 11.01.2010 05:54

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Ruun »

Leider nicht!
mk-soft hat geschrieben:

Code: Alles auswählen

DatabaseQuery(0, "select count(*) from alben")      
anzahl$ = GetDatabaseString(0, 0)
MessageRequester("Info", "Anzahl: " + anzahl$)
Dies ist auch ähnlich wie meine und so hatte ich das auch schon probiert. Leider gibt wird hier garnichts ausgegeben.
oder

Code: Alles auswählen

DatabaseQuery(0, "select count(*) from alben")      
count = GetDatabaseLong(0, 0)
MessageRequester("Info", "Anzahl: " + str(count))
Hier nur 0.

Ich hab auch probiert, es an verschiedenen Stellen einzubinden, ohne Erfolg. Andere Idee?

:cry:


Ruun
### PB 4.40 (Demo) ### WinXP Pro ###
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget - Probleme mit Übergabe von Daten aus DB (SQLite)

Beitrag von Kiffi »

Ruun hat geschrieben:Andere Idee?
die Datenbank muss (wie Du weiter oben schon richtig vermutet
hast) hierfür geöffnet sein. Ich vermute stark, dass dem nicht so
ist. Kleiner Tipp für Merkwürdigkeiten die in Zukunft im Zusammen-
hang mit Datenbanken auftreten können: Die Rückgabe aus
DatabaseQuery() oder DatabaseUpdate() auswerten.

Code: Alles auswählen

If DatabaseQuery(...
  ; Hier Deine weiteren Schritte
Else
  MessageRequester("Hinweis", DatabaseError())
Endif
Grüße ... Kiffi
a²+b²=mc²
Antworten