ES Grid speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

ES Grid speichern

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ES Grid speichern

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: ES Grid speichern

Beitrag 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")
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: ES Grid speichern

Beitrag 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 ?
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ES Grid speichern

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: ES Grid speichern

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: ES Grid speichern

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: ES Grid speichern

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: ES Grid speichern

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ES Grid speichern

Beitrag 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
a²+b²=mc²
Antworten