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, :shock:
kann ich per Code verhindern, daß das Programm beendet wird bevor alle Daten gespeichert sind ? :freak:

@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 ? :freak:
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. :lol:

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