StringGadgets mit Daten aus Datenbank füllen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

StringGadgets mit Daten aus Datenbank füllen

Beitrag von Micro »

Hallo Leute,

hab schon die Suchefunktion benutzt, aber leider nichts gefunden.

Ich möchte Zeilenweise in Stringgadgets zeilenweise Daten aus einer Datenbank per GetDatabaseString() befüllen.
Bei einer Zeile ist das ja kein Problem, aber bei mehreren Zeilen bekomme ich das nicht hin.

Hier ein Code-Beispiel:

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window0
EndEnumeration

;- Gadget Constants
;
Enumeration
	#Text_01
	#Text_02
	#Text_03
	#Text_04
	#Text_05
	#Text_06
	#Text_07
  #String_60
  #String_61
  #String_62
  #String_63
  #String_64
  #String_65
  #String_66
  #String_67
  #String_68
  #String_69
  #Button_01
EndEnumeration


  If OpenWindow(#Window0, 280, 145, 480, 150, "Strings in Scheife füllen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  	TextGadget(#Text_01, 050, 15, 75, 20, "ArtNr.")
  	TextGadget(#Text_02, 135, 15, 75, 20, "Anzahl")
  	TextGadget(#Text_03, 220, 15, 75, 20, "Bezeichnung")
  	TextGadget(#Text_04, 305, 15, 75, 20, "Netto")
  	TextGadget(#Text_05, 390, 15, 75, 20, "Brutto")
  	TextGadget(#Text_06, 10, 47, 35, 20, "Zeile 1")
  	TextGadget(#Text_07, 10, 77, 35, 20, "Zeile 2")
  	
  	StringGadget(#String_60, 050, 45, 75, 20, "")
    StringGadget(#String_61, 135, 45, 75, 20, "")
    StringGadget(#String_62, 220, 45, 75, 20, "")
    StringGadget(#String_63, 305, 45, 75, 20, "")
    StringGadget(#String_64, 390, 45, 75, 20, "")
    StringGadget(#String_65, 050, 75, 75, 20, "")
    StringGadget(#String_66, 135, 75, 75, 20, "")
    StringGadget(#String_67, 220, 75, 75, 20, "")
    StringGadget(#String_68, 305, 75, 75, 20, "")
    StringGadget(#String_69, 390, 75, 75, 20, "")
    ButtonGadget(#Button_01, 375, 115, 90, 25, "Füllen")
  EndIf

 Repeat
    EventID = WaitWindowEvent()
    
  Select EventID
  
    Case #PB_Event_Gadget   ; Hier das Buttonmenü
      Select EventGadget()
      		
      	Case #Button_01
      		Debug "Hier die Daten befüllen aus der ACCESS-Datenbank"
      		
      EndSelect
      
      	Case #PB_Event_CloseWindow ;-- Fenster schließen
					If EventWindow() = #Window0
						End
					EndIf
					
      EndSelect        
      
  Until Quit = 1
  
End   ; All the opened 
      		

Wer hat da eine Idee für mich, wie ich das hinbekomme?


Gruß aus dem Münsterland

Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Kiffi »

Willst Du das wirklich mit StringGadgets machen? Ein ListIconGadget würde sich besser eignen, oder?

Grüße ... Kiffi
a²+b²=mc²
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Micro »

Hi Kiffi,
Kiffi hat geschrieben:Willst Du das wirklich mit StringGadgets machen? Ein ListIconGadget würde sich besser eignen, oder?
die StringGadgets habe ich genommen, da ich unter Umständen einen Eintrag bearbeiten, hinzufügen oder löschen will.
Mit den ListIconGadget ist das direkte beschreiben der Items leider nicht möglich.

Mit den ListIconGadget wäre das Füllen und das Löschen natürlich einfacher....

Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Kiffi »

Micro hat geschrieben:Mit den ListIconGadget ist das direkte beschreiben der Items leider nicht möglich.
es gibt einiges an Code, um ListIconGadets editierbar zu machen.
Auf Anhieb habe ich beispielsweise das hier gefunden:
http://www.purebasic.fr/english/viewtop ... 59#p423759

Dann gibt es noch die Möglichkeit der Nutzung eines Grids (z.B. http://www.purebasic.fr/english/viewtop ... 28#p408428).

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von alter Mann »

...man könnte auch pro Spalte ein EditorGadget nehmen...
Win11 64Bit / PB 6.0
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Kiffi »

wäre mir fast durch die Lappen gegangen:

noch eine Möglichkeit ist die Nutzung der neuen Dialog()-Funktionen von PB

Hier mal ein schnelles Beispiel:

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode
  #XmlEncoding = #PB_UTF8
CompilerElse 
  #XmlEncoding = #PB_Ascii
CompilerEndIf

#Dialog = 0
#Xml = 0

XML$ = "<window id='#PB_Any' name='test' text='Gridbox' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
       "    <gridbox columns='6'>" +
       "          <text text='' />" +
       "          <text text='ArtNr.' />" +
       "          <text text='Anzahl' />" +
       "          <text text='Bezeichnung' />" +
       "          <text text='Netto' />" +
       "          <text text='Brutto' />" 


For Counter = 1 To 10
  
  XML$ + " <text text='Zeile" + Str(Counter) + ":' />" +
         " <string width='100' text='' />" +
         " <string width='100' text='' />" +
         " <string width='100' text='' />" +
         " <string width='100' text='' />" +
         " <string width='100' text='' />" 
  
Next


XML$  + "    </gridbox>" +
        "  </window>"

If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
  
  If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow 
    
  Else  
    Debug "Dialog error: " + DialogError(#Dialog)
  EndIf
Else
  Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Grüße ... Kiffi
a²+b²=mc²
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Micro »

Das Problem was ich habe ist nicht das Erzeugen der StringGadgets, sondern das Befüllen der vorhandenen Gadgets mit Daten aus der Access-Database.

Ich habe es schon mit einer For-Next-Schleife innerhalb der Datenbankabfrage probiert. Mir ist dann aber aufgegangen, das es nicht funktionieren kann.

Die StringGadgets fangen bei mir mit '#String060' an und hören bei '#String320' auf, jeweils immer 5 nebeneinander. Der Rückgabewert den '#String060' ist dabei die 348.

Gruß Frank
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Kiffi »

Micro hat geschrieben:Das Problem was ich habe ist nicht das Erzeugen der StringGadgets, sondern das Befüllen der vorhandenen Gadgets mit Daten aus der Access-Database.
Ich habe es schon mit einer For-Next-Schleife innerhalb der Datenbankabfrage probiert. Mir ist dann aber aufgegangen, das es nicht funktionieren kann.
Die StringGadgets fangen bei mir mit '#String060' an und hören bei '#String320' auf, jeweils immer 5 nebeneinander. Der Rückgabewert den '#String060' ist dabei die 348.
für die Gadgets musst Du ja nicht unbedingt Konstanten verwenden. Du kannst Sie auch mit #PB_Any erzeugen und dann den Rückgabewert (die ID des Gadgets) in beispielsweise eine LinkedList speichern.

Nichtsdestotrotz hier nochmal ein Dialog-Beispiel:

Code: Alles auswählen

EnableExplicit

CompilerIf #PB_Compiler_Unicode
  #XmlEncoding = #PB_UTF8
CompilerElse 
  #XmlEncoding = #PB_Ascii
CompilerEndIf

Define DB
Define Counter
Define XML$

UseSQLiteDatabase()

; TestTabelle erzeugen und befüllen

DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

DatabaseUpdate(DB, "Create Table TestTable (ArtNr, Anzahl, Bezeichnung, Netto, Brutto)")

For Counter = 1 To 10
  DatabaseUpdate(DB, "Insert Into TestTable (ArtNr, Anzahl, Bezeichnung, Netto, Brutto) Values " + 
                     "('ArtNr" + Str(Counter) + "', 'Anzahl" + Str(Counter) + "', 'Bezeichnung" + Str(Counter) + "', 'Netto" + Str(Counter) + "', 'Brutto" + Str(Counter) + "')")
Next

#Dialog = 0
#Xml = 0

XML$ = "<window id='#PB_Any' name='test' text='Gridbox' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
       "    <gridbox columns='6'>" +
       "          <text text='' />" +
       "          <text text='ArtNr.' />" +
       "          <text text='Anzahl' />" +
       "          <text text='Bezeichnung' />" +
       "          <text text='Netto' />" +
       "          <text text='Brutto' />" 


Counter = 1

If DatabaseQuery(DB, "Select * From TestTable")
  
  While NextDatabaseRow(DB)
    
    XML$ + " <text text='Zeile" + Str(Counter) + ":' />" +
           " <string width='100' text='" + GetDatabaseString(DB, 0) + "' />" +
           " <string width='100' text='" + GetDatabaseString(DB, 1) + "' />" +
           " <string width='100' text='" + GetDatabaseString(DB, 2) + "' />" +
           " <string width='100' text='" + GetDatabaseString(DB, 3) + "' />" +
           " <string width='100' text='" + GetDatabaseString(DB, 4) + "' />" 
    
    Counter + 1
    
  Wend
  
  FinishDatabaseQuery(DB)
  
EndIf


XML$  + "    </gridbox>" +
        "  </window>"

If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
  If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
  Else  
    Debug "Dialog error: " + DialogError(#Dialog)
  EndIf
Else
  Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringGadgets mit Daten aus Datenbank füllen

Beitrag von Kiffi »

mir ist aufgefallen, dass das direkte Einfüllen der Daten in das XML
unter Umständen Probleme bereiten könnte (beispielsweise
bei " und ' - Zeichen; je nachdem wie man den XML-String baut).

Deshalb hier noch mal ein Beispiel mit SetGadgetText():

Code: Alles auswählen

EnableExplicit

CompilerIf #PB_Compiler_Unicode
  #XmlEncoding = #PB_UTF8
CompilerElse 
  #XmlEncoding = #PB_Ascii
CompilerEndIf

Define DB
Define Counter
Define XML$
Define AnzahlZeilen

UseSQLiteDatabase()

; TestTabelle erzeugen und befüllen

DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

DatabaseUpdate(DB, "Create Table TestTable (ArtNr, Anzahl, Bezeichnung, Netto, Brutto)")

For Counter = 1 To 10
  DatabaseUpdate(DB, "Insert Into TestTable (ArtNr, Anzahl, Bezeichnung, Netto, Brutto) Values " + 
                     "('ArtNr" + Str(Counter) + "', 'Anzahl" + Str(Counter) + "', 'Bezeichnung" + Str(Counter) + "', 'Netto" + Str(Counter) + "', 'Brutto" + Str(Counter) + "')")
Next

#Dialog = 0
#Xml = 0

XML$ = "<window id='#PB_Any' name='test' text='Gridbox' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
       "    <gridbox columns='6'>" +
       "          <text text='' />" +
       "          <text text='ArtNr.' />" +
       "          <text text='Anzahl' />" +
       "          <text text='Bezeichnung' />" +
       "          <text text='Netto' />" +
       "          <text text='Brutto' />" 


Counter = 1

DatabaseQuery(DB, "Select Count(*) From TestTable")
NextDatabaseRow(DB)
AnzahlZeilen = GetDatabaseLong(DB, 0)
FinishDatabaseQuery(DB)

For Counter	= 1 To AnzahlZeilen
	
	XML$ + " <text text='Zeile" + Str(Counter) + ":' />" +
	       " <string width='100' name='Zeile" + Str(Counter) + "Spalte1' text='' />" +
	       " <string width='100' name='Zeile" + Str(Counter) + "Spalte2' text='' />" +
	       " <string width='100' name='Zeile" + Str(Counter) + "Spalte3' text='' />" +
	       " <string width='100' name='Zeile" + Str(Counter) + "Spalte4' text='' />" +
	       " <string width='100' name='Zeile" + Str(Counter) + "Spalte5' text='' />" 
	
Next

XML$  + "    </gridbox>" +
        "  </window>"

If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
	If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
		
		Counter = 1
		
		If DatabaseQuery(DB, "Select * From TestTable")
			While NextDatabaseRow(DB)
				SetGadgetText(DialogGadget(#Dialog, "Zeile" + Str(Counter) + "Spalte1"), GetDatabaseString(DB, 0))
				SetGadgetText(DialogGadget(#Dialog, "Zeile" + Str(Counter) + "Spalte2"), GetDatabaseString(DB, 1))
				SetGadgetText(DialogGadget(#Dialog, "Zeile" + Str(Counter) + "Spalte3"), GetDatabaseString(DB, 2))
				SetGadgetText(DialogGadget(#Dialog, "Zeile" + Str(Counter) + "Spalte4"), GetDatabaseString(DB, 3))
				SetGadgetText(DialogGadget(#Dialog, "Zeile" + Str(Counter) + "Spalte5"), GetDatabaseString(DB, 4))
				Counter + 1
			Wend
			FinishDatabaseQuery(DB)
		EndIf
		
		Repeat
		Until WaitWindowEvent() = #PB_Event_CloseWindow 
		
  Else  
    Debug "Dialog error: " + DialogError(#Dialog)
  EndIf
Else
  Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Grüße ... Kiffi
a²+b²=mc²
Antworten