Seite 1 von 2

[erledigt] SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 27.05.2008 22:54
von scholly
moin, moin...

Ich möchte die Struktur einer SQlite-DB visualisieren.
Normalerweise würde man das ja mit einem TreeGadget lösen, in dem jeder Table zu einem Node wird und die einzelnen Columns zu Subitems.
Das wird mir aber komplett aufgeklappt "zu hoch" um als Übersicht zu dienen.
Nun suche ich eine Möglichkeit, die Tables/Nodes nebeneinander darzustellen und die Columns/Subitems dann darunter.

Hat jemand eine Idee, wie man das hinbekommen könnte ohne für jeden Table/Node ein eigenes TreeGadget nebeneinander aufzumachen?

Oder kennt jemand ein (SQLite-)Tool, das das so darstellen kann?

mDv...

[edit 080528: 17:40] Insofern erledigt, daß ich eine zufriedenstellende Druck-Ausgabe habe.

Re: SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 27.05.2008 23:20
von Kiffi
Hallo scholly,

(geschickt gepushed ;-))
scholly hat geschrieben:Hat jemand eine Idee, wie man das hinbekommen könnte ohne für jeden
Table/Node ein eigenes TreeGadget nebeneinander aufzumachen?
kann ich mir leider nix drunter vorstellen. Kannst Du mal eine Skizze
erstellen, wie das aussehen soll?

Grüße ... Kiffi

Re: SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 28.05.2008 00:01
von scholly
Kiffi hat geschrieben:Hallo scholly,
(geschickt gepushed ;-))
Hatte AFAIR NTQ mal irgendwo so beschrieben :lol:
kiffi hat geschrieben: Kannst Du mal eine Skizze erstellen, wie das aussehen soll?
Puuh... ich versuchs mal als ASCII-Pic:

Code: Alles auswählen

table1      table2      table3       table4
  +col1        +col1       +col1        +col1
  +col2        +col2       +col2        +col2
  +col3        +col3       +col3        +col3
  +col4                    +col4        +col4
  +col5                                 +col5
  +col6
  +col7 
Wobei Table = Node und col = Subitem wäre.
Verständlicher?

Re: SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 28.05.2008 00:17
von Kiffi
scholly hat geschrieben:Puuh... ich versuchs mal als ASCII-Pic:
reicht voll und ganz. Jetzt weiß ich in etwa, was Du meinst.

Allerdings erschließt sich mir der praktische Nutzen einer solchen Darstellung
nicht. Wenn mehrere Tabellen in einer Datenbank vorhanden sind, muss der
Anwender (im Gegensatz zur klassischen Treedarstellung) unnötigerweise
scrollen, wenn er sich einen Überblick verschaffen will.

Wie dem auch sei: Mir fällt auf Anhieb kein Gadget (oder auch Control)
ein, welches für diesen Zweck geeignet ist. Das musst Du wohl in den
sauren Apfel beißen und Dir das aus mehreren Textgadgets +
ScrollAreaGadget selberbauen.

... oder aber Du verwendet ein Webgadget(), in das Du ein aus der
Datenbankstruktur generiertes HTML einlädst (dürfte wohl am einfachsten
und flexibelsten sein).

Grüße ... Kiffi

Re: SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 28.05.2008 00:32
von scholly
Kiffi hat geschrieben:Allerdings erschließt sich mir der praktische Nutzen einer solchen Darstellung nicht.
Letztendlich soll eigentlich was Ausdruckbares dabei herauskommen, das ich zur (Weiter-)Entwicklung meiner Video-Verwaltung nutzen will.
Kiffi hat geschrieben:aus mehreren Textgadgets + ScrollAreaGadget selberbauen
Ma gucken, was ich mit ScrollArea- und ImageGadgets hinbekomme...
Kiffi hat geschrieben:... oder aber Du verwendet ein Webgadget(), in das Du ein aus der Datenbankstruktur generiertes HTML einlädst (dürfte wohl am einfachsten
und flexibelsten sein).
Da werd ich mich auch mal dran versuchen, für HTML gibts doch auch sowas wie'n TreeGadget, oder?

Abba jezz is ersma Bubu anjesacht :lol:

:allright: Danke....

Re: SQLite-Tables als TreeGadget-Nodes nebeneinander?

Verfasst: 28.05.2008 00:58
von Kiffi
scholly hat geschrieben:für HTML gibts doch auch sowas wie'n TreeGadget, oder?
ja, kann man bauen. Aber ich denke, Du willst keinen (klassischen) Tree?

Ich dachte eigentlich eher an sowas:

Code: Alles auswählen

<html>
	<body>
		<table>
			<tr>
				<td>Tabelle1</td><td>Tabelle2</td><td>Tabelle3</td>
			</tr>
			<tr>
				<td>&nbsp;+Field1_1</td><td>&nbsp;+Field2_1</td><td>&nbsp;+Field3_1</td>
			</tr>
			<tr>
				<td>&nbsp;+Field1_2</td><td>&nbsp;+Field2_2</td><td>&nbsp;+Field3_2</td>
			</tr>
			<tr>
				<td>&nbsp;+Field1_3</td><td>&nbsp;+Field2_3</td><td>&nbsp;+Field3_3</td>
			</tr>
		</table>
	</body>
</html>
scholly hat geschrieben:Abba jezz is ersma Bubu anjesacht
juuute idee! Bild

Grüße ... Kiffi

// Edit:

hier mal ein Code, der zeigt, wie man das in etwa machen kann. Du musst
lediglich im Aufruf von ReadSqliteDatabaseStructure() den Pfad der zu
untersuchenden Datenbank anpassen.

Code: Alles auswählen

EnableExplicit

Structure s_SDS
  TableName.s
  Fields.s
EndStructure

Procedure ReadSqliteDatabaseStructure(Database.s, SDS.s_SDS())
  
  Protected SQL.s
  Protected sDB.l, P1.l, P2.l, Counter.l
  
  sDB = OpenDatabase(#PB_Any, Database, "", "", #PB_Database_SQLite)
  
  If sDB
    
    DatabaseQuery(sDB, "Select name, sql From sqlite_master Where type = 'table' Order By name")
    
    While NextDatabaseRow(sDB)

      AddElement(SDS())
      
      SDS()\TableName = GetDatabaseString(sDB, 0)
      
      SQL = GetDatabaseString(sDB, 1)
      P1 = FindString(SQL, "(",  1)
      If P1
        P1 + 1
        P2 = FindString(SQL, ")", P1)
        If P2 : SDS()\Fields = Mid(SQL, P1, P2-P1) : EndIf
      EndIf
      
    Wend
    
    CloseDatabase(sDB)
    
  Else
    
    ; Datenbank konnte nicht geöffnet werden
    
  EndIf
  
EndProcedure

UseSQLiteDatabase()

NewList SDS.s_SDS() ; SDS = *S*QLite*D*atabase*S*tructure ;-)

ReadSqliteDatabaseStructure("D:\Data\temp.db", SDS())  

Define HTML.s

HTML + "<html><body><table>"

HTML + "<tr>"
ForEach SDS()
  HTML + "<td><b>" + SDS()\TableName + "</b></td>"
Next
HTML + "</tr>"

HTML + "<tr>"
ForEach SDS()
  HTML + "<td style='padding-left:20px;vertical-align:top'>" + ReplaceString(SDS()\Fields, ",", "<br />") + "</td>"
Next
HTML + "</tr>"

HTML + "</table></body></html>"

Enumeration
  #frmMain
  #frmMain_WG
EndEnumeration

Define WindowFlags.l

WindowFlags | #PB_Window_ScreenCentered
WindowFlags | #PB_Window_SystemMenu
WindowFlags | #PB_Window_Invisible

OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 800, 600, "", WindowFlags)
CreateGadgetList(WindowID(#frmMain))

WebGadget(#frmMain_WG, 0, 0, 800, 600, "")
While GetGadgetAttribute(#frmMain_WG, #PB_Web_Busy) : WindowEvent() : Delay(1) : Wend

SetGadgetItemText(#frmMain_WG, #PB_Web_HtmlCode, HTML)
While GetGadgetAttribute(#frmMain_WG, #PB_Web_Busy) : WindowEvent() : Delay(1) : Wend

HideWindow(#frmMain, #False)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Verfasst: 28.05.2008 13:59
von scholly
Hab grade mal kurz Zeit zum Testen gehabt.

Das WebGadget bleibt leer :o , aber wenn ich HTML.s debugge und abspeicher, sieht die Tabelle gut aus. :allright:

Abgesehen davon, daß ich jetzt den Inhalt von HTML.s abspeichern und per RunProgram() öffnen und sogar drucken könnte,
wurmt es mich natürlich, daß in dem WG nix angezeigt wird.
Irgendeine Idee für eine Anti-Wurm-Mittel ?

[OT]
Was schickt ihr uns eigentlich für ein Wetter hoch?
Schwül bis zum Dauer-T-Shirt-Wechsel und vereinzelte Tropfen.
Kriegt ihr in Köln kein erfrischendes Gewitter zustande? :lol: :lol: :lol:
[/OT]

Verfasst: 28.05.2008 14:11
von Kiffi
scholly hat geschrieben:Irgendeine Idee für eine Anti-Wurm-Mittel ?
puh, nicht wirklich. Du kannst mir das generierte HTML mal an
tuebben [at] gmail [dot] com schicken. Vielleicht ist da ein Knoten drin?

Grüße ... Kiffi

Verfasst: 28.05.2008 14:31
von scholly
debugger hat geschrieben:<html><body><table border=1><tr><td><b>maintable</b></td><td><b>table_cds</b></td><td><b>table_dvds</b></td><td><b>table_tree</b></td></tr><tr><td style='padding-left:20px;vertical-align:top'>ID INTEGER PRIMARY KEY<br /> Titel<br /> Genre<br /> Jahr<br /> MediumTyp<br /> MediumName<br /> Owner<br /> Quelle<br /> Dauer<br /> Qualität<br /> Infos<br /> Artist<br /> Path<br /> Filename<br /> FileSize<br /> VideoCodec<br /> VideoBitrate<br /> Auflösung<br /> fps<br /> AudioCodec<br /> AudioBitrate<br /> AudioKanäle<br /> SamplingRate</td><td style='padding-left:20px;vertical-align:top'>cd_name </td><td style='padding-left:20px;vertical-align:top'>dvd_name </td><td style='padding-left:20px;vertical-align:top'>id INTEGER PRIMARY KEY<br /> item_name TEXT<br /> item_icon TEXT<br /> item_pos NUMERIC<br /> item_parent NUMERIC<br /> item_level</td></tr></table></body></html>
Wenn ich den abgespeicherten Code nicht per RunProgram anzeigen lasse, sondeRn in das WG lade, wird er problemlos angezeigt.
Und wenn ich das Quote da oben in ein file cut'n'paste und das ins WG lade, gehts auch.

Das Problem kann IMHO also eigentlich nur in diesen Zeilen liegen:

Code: Alles auswählen

; While GetGadgetAttribute(#frmMain_WG, #PB_Web_Busy) : WindowEvent() : Delay(10) : Wend
; 
; SetGadgetItemText(#frmMain_WG, #PB_Web_HtmlCode, HTML)
; While GetGadgetAttribute(#frmMain_WG, #PB_Web_Busy) : WindowEvent() : Delay(10) : Wend
:freak:

Verfasst: 28.05.2008 14:49
von Kiffi
scholly hat geschrieben::freak:
stimmt! Wirklich seltsam, das...
Du hast die aktuelle PB4.2 Final? Oder noch eine Beta?
[grübel, grübel]

Grüße ... Kiffi

<OT>
P.S.: Umlaute in den Feldnamen? Tu pöser Purche! :-)
</OT>