Seite 1 von 2
ES Grid speichern
Verfasst: 14.03.2013 21:10
von Pure_Beginner
Hallo zusammen,
Ich habe mit ES ein Grid erstellt das aus 12 Tabellen besteht( jede Tabelle ein Monat).
jede Tabelle hat bis zu 31 Spalten und 18 Zeilen in jeder Zelle einer Tabelle "K A N N" sich ein Eintrag befinden.
Ich babe nun versucht die Tabelle in eine SQLite DB zu speichern, das funktioniert auch... Aber leider werde ich alt und grau bis das erledigt ist.
Kennt jemand einen schnelleren weg ?
Hier ein Ausschnitt meines codes.
Code: Alles auswählen
Procedure Speichern()
Protected db_name.s = "C:\Users\meiner\Downloads\" + Str(Jahr) +".db", test.s
Protected SQL.s, k.i, Zeilen.i, Spalten.i, i.i, m.i, L.s, o.i, n.i
Dim Monat.s(12)
Restore Monatsnamen
For n= 1 To 12
Read.s Monat(n) ;array für monatsnamen
Next
If FileSize(db_Name.s) <= 0
If CreateFile(1, db_Name.s)
CloseFile(1)
If OpenDatabase(#KalenderDB, db_Name.s, "", "", #PB_Database_SQLite)
For m = 1 To 12
StatusBarProgress(#ProgressBar, 0, m)
o = m
SQL.s = "CREATE TABLE[ " + m + " " + Monat(m) + "](Spalte INTEGER , Zeile INTEGER, Eintrag TEXT)"
Debug sql.s
DatabaseUpdate(#KalenderDB, SQL)
Spalten = egrid_NumberOfColumns(m)
For i = 1 To Spalten
Zeilen = egrid_NumberOfRows(m)
For k = 1 To Zeilen
test = egrid_GetCellText(m, i+1, k-1)
L.s ="INSERT INTO[ "+ m + " " + Monat(m) +"]VALUES('" + k + "','" + i + "','" + test + "')"
DatabaseUpdate(#KalenderDB, L)
Next
Next
Next
Else
MessageRequester("Fehler", DatabaseError(), #PB_MessageRequester_Ok)
End
EndIf
Else
MessageRequester("Fehler", db_Name + " konnte nicht erstellt werden.",#PB_MessageRequester_Ok)
End
EndIf
Grüße
Christian
Re: ES Grid speichern
Verfasst: 14.03.2013 22:02
von bobobo
SQLITE unterstützt Transactionen
Anfangs ein "Begin" per Databaseupdate
und am Ende ein "Commit" ebenso
macht froh
Außerdem kann man den Zugriff auf ne SQLITE-DB mit folgender Pragmaangabe beschleunigen
Code: Alles auswählen
DatabaseUpdate(#sqlitedb,"PRAGMA journal_mode =MEMORY")
(folgt in meinen entsprechenden (aber unmassgeblichen) Codes nahezu immer hinter dem Öffnen einer SqliteDB)
Das führt dazu , dass das Journal im Speicher gehalten wird. Ansonsten wird die neben die SqliteDB
auf die Platte gelegt und Platte ist meistenteils langsamer als Memory.
Bei nicht gerade irregroßen SQLITE-DBs wird es dadurch tatsächlich nochmal n Rutsch flötter.
Muss man aber immer versuchen im Vorfeld abzuchecken, ob der Speicher gerade nicht für
was wichtigeres da sein muss.
Re: ES Grid speichern
Verfasst: 16.03.2013 09:16
von Danilo
bobobo hat geschrieben:Anfangs ein "Begin" per Databaseupdate
und am Ende ein "Commit" ebenso
macht froh
Mit Semikolon am Ende, oder?
Code: Alles auswählen
; DarkDragon
;
; http://www.sqlite.org/lang_transaction.html
; grabiller
;
; http://www.purebasic.fr/english/viewtopic.php?f=7&t=51911
;
DatabaseUpdate( dbid, "BEGIN;" )
DatabaseUpdate( dbid, "INSERT INTO ../.." )
DatabaseUpdate( dbid, "INSERT INTO ../.." )
; ../..
DatabaseUpdate( dbid, "COMMIT;" )
; http://forums.purebasic.com/german/viewtopic.php?f=16&t=26511
;
; bobobo:
;
; Außerdem kann man den Zugriff auf ne SQLITE-DB mit folgender Pragmaangabe beschleunigen
DatabaseUpdate(#sqlitedb,"PRAGMA journal_mode =MEMORY")
Re: ES Grid speichern
Verfasst: 16.03.2013 16:35
von Pure_Beginner
Hallo Leute,
Danke für eure Antworten.
Kam leider erst heute dazu es auszuprobieren.
Bin beeindruckt von der Geschwindigkeit des Befehles,
kann ich per Code verhindern, daß das Programm beendet wird bevor alle Daten gespeichert sind ?
@Danilo
mit Beginn und Ende, das hab ich leider nicht verstanden, kannst du evtl. etwas genauer darauf eingehen ?
Re: ES Grid speichern
Verfasst: 16.03.2013 16:41
von RSBasic
Pure_Beginner hat geschrieben:kann ich per Code verhindern, daß das Programm beendet wird bevor alle Daten gespeichert sind ?
Entweder #PB_Event_CloseWindow abfragen oder/und:
Code: Alles auswählen
EnableExplicit
Define EventID
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EnableMenuItem_(GetSystemMenu_(WindowID(0),#False), #SC_CLOSE, #MF_DISABLED)
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
End
EndIf
ForEver
EndIf
Re: ES Grid speichern
Verfasst: 16.03.2013 16:47
von Pure_Beginner
@RSBasic
Danke für die schnelle Antwort,
aber wie kann ich erkennen, wann die Daten geschrieben sind und ich das Beenden freigeben kann ?
Grüße
Christian
Re: ES Grid speichern
Verfasst: 16.03.2013 23:49
von Danilo
Pure_Beginner hat geschrieben:aber wie kann ich erkennen, wann die Daten geschrieben sind und ich das Beenden freigeben kann ?
CloseDatabase() sollte das machen.
Pure_Beginner hat geschrieben:mit Beginn und Ende, das hab ich leider nicht verstanden, kannst du evtl. etwas genauer darauf eingehen ?
Du machst ein "BEGIN;" vor Deine Schleife, in der Du Daten hinzufügst. Ein "COMMIT;" nach der Schleife.
Code: Alles auswählen
If OpenDatabase( #KalenderDB, db_Name.s, "", "", #PB_Database_SQLite )
DatabaseUpdate( #KalenderDB, "PRAGMA journal_mode =MEMORY" )
DatabaseUpdate( #KalenderDB, "BEGIN;" )
; HIER DEIN CODE (tabellen erstellen, zeugs hinzufügen)
DatabaseUpdate( #KalenderDB, "COMMIT;" )
CloseDatabase( #KalenderDB )
Else
MessageRequester( "Fehler", DatabaseError(), #PB_MessageRequester_Ok )
End
EndIf
Re: ES Grid speichern
Verfasst: 16.03.2013 23:58
von Pure_Beginner
@Danilo
danke für die Erklärung, hab ich umgesetzt, funkioniert super.
Muss nur noch die Befehle "BEGIN" und "COMMIT" nachschlagen, damit ich auch verstehe was ich da mache.
Nochmals Danke für die Mühe.
Grüße
Christian
Re: ES Grid speichern
Verfasst: 17.03.2013 14:04
von Pure_Beginner
Hallo Leute,
Hab meine Sqlite db soweit das sie speichert was ich möchte, jedoch mit Einschränkung.
Nur wenn ich die Tabelle neu schreine klappt alles.
die Syntax der sqlbefehles Update ist mir nicht klar trotz Google und Bücher.
Könnte mal noch jemand mit drauf schauen und mich in die richtige Richtung drehen?
Hier mein Code
Code: Alles auswählen
Procedure Speichern()
Protected db_name.s = "C:\Users\meiner\Downloads\" + Str(Jahr) +".db", test.s
Protected SQL.s, k.i, Zeilen.i, Spalten.i, i.i, m.i, L.s, o.i, n.i
Dim Monat.s(12)
Restore Monatsnamen
For n= 1 To 12
Read.s Monat(n) ;array für monatsnamen
Next
If FileSize(db_Name.s) <= 0
If CreateFile(1, db_Name.s)
CloseFile(1)
If OpenDatabase(#KalenderDB, db_Name.s, "", "", #PB_Database_SQLite)
DatabaseUpdate( #KalenderDB, "PRAGMA journal_mode =MEMORY" )
DatabaseUpdate( #KalenderDB, "BEGIN;" )
For m = 1 To 12
StatusBarProgress(#ProgressBar, 0, m)
SQL.s ="CREATE TABLE[ " + m + " " + Monat(m) + "](Spalte INTEGER , Zeile INTEGER, Eintrag TEXT)"
DatabaseUpdate(#KalenderDB, SQL)
Spalten = egrid_NumberOfColumns(m)
Spalten = Spalten-2
For i = 1 To Spalten
Zeilen = egrid_NumberOfRows(m)
For k = 1 To Zeilen
test = egrid_GetCellText(m, i+1, k-1)
L.s ="INSERT INTO[ "+ m + " " + Monat(m) +"]VALUES('" + k + "','" + i + "','" + test + "')"
DatabaseUpdate(#KalenderDB, L)
Next
Next
Next
DatabaseUpdate( #KalenderDB, "COMMIT;" )
CloseDatabase( #KalenderDB )
Else
MessageRequester("Fehler", DatabaseError(), #PB_MessageRequester_Ok)
End
EndIf
Else
MessageRequester("Fehler", db_Name + " konnte nicht erstellt werden.",#PB_MessageRequester_Ok)
End
EndIf
Else ;Datenbank existiert bereits und wird geöffnet.
If OpenDatabase(#KalenderDB, db_Name.s, "", "",#PB_Database_SQLite)
DatabaseUpdate( #KalenderDB, "PRAGMA journal_mode =MEMORY" )
DatabaseUpdate( #KalenderDB, "BEGIN;" )
For m = 1 To 12
Spalten = egrid_NumberOfColumns(m)
Spalten = Spalten-2
For i = 1 To Spalten
Zeilen = egrid_NumberOfRows(m)
For k = 1 To Zeilen
test = egrid_GetCellText(m, i+1, k-1)
L.s ="UPDATE " + #KalenderDB + Spalten + Zeilen + test
DatabaseUpdate(#KalenderDB, L)
Next
Next
Next
DatabaseUpdate( #KalenderDB, "COMMIT;" )
CloseDatabase( #KalenderDB )
EndIf
EndIf
EndProcedure
Im wesendlichen geht es um folgendes.
Code: Alles auswählen
For m = 1 To 12
Spalten = egrid_NumberOfColumns(m)
Spalten = Spalten-2
For i = 1 To Spalten
Zeilen = egrid_NumberOfRows(m)
For k = 1 To Zeilen
test = egrid_GetCellText(m, i+1, k-1)
L.s ="UPDATE " + #KalenderDB + Spalten + Zeilen + test
DatabaseUpdate(#KalenderDB, L)
Next
Next
Next
Bin auch für andere Vorschläge dankbar( Fehlerfang....)
schönen Sonntag
Christian
Re: ES Grid speichern
Verfasst: 17.03.2013 14:21
von Kiffi
da Du ohnehin immer alle Daten (alle Tage, alle Monate) Deines Grids
in die Datenbank schreiben willst, würde ich auf den Update-Zweig
verzichten.
Also: Datenbank öffnen, Tabelle löschen, Tabelle anlegen, Daten mit
Insert einfügen.
Ist wohl die beste Lösung in Deinem Fall...
Grüße ... Kiffi