Großen Datensatz speichern

Hallo, ich habe eine App, in der ich Adressdaten und Vieles mehr bearbeite. Ich muss die Änderungen natürlich auch in den Tabellen speichern. In einer Listbox ist BEGRIFF1 angezeigt, dort kann ich mich per Click oder Pfeiltasten hoch und runter bewegen und jedesmal wird rechts daneben der Rest der zum Datensatz gehörenden Daten angezeigt (sagen wir mal ca. 30 Felder).

Wenn ich nun rechts Daten ändere möchte ich die Änderung erst in die DB-Tabelle(n) schreiben, wenn ich einen neuen Datensatz aufrufe. Der Event Textchange wird gefeuert, sobald ich eine Änderung in einem Feld vornehme. Das geschieht allerdings auch, wenn ich mich in der Listbox bewege, obwohl das Feld lediglich Daten eines neuen Datensatzes anzeigt (aber ein Textchange ist das natürlich auch). Das wären dann eben 30 Textchangeaufrufe und Speicherungen. Das ist doch viel zu umständlich und dauert zu lange…

Wie bewerkstelligt man das denn am besten? Muss ich mir beim Aufruf eines neuen Datensatz tatsächlich immer alle Feldinhalte merken und beim Aufruf eines neuen Datensatzes jedes Feld mit den gemerkten nformationen vergleichne, um bei einer Änderung dann einen “Save this Record”-Dialog aufzurufen?

Das muss doch eleganter funktionieren, oder? Kann mir einer helfen?

Du wirst ein paar Flags haben müssen.
z.B. eine Loading as Boolean flag, was Du beim Laden der Felder anfangs auf true setzt und am Ende auf False. im Textchanged Event hast du dann ein “if Loading then return” drin um den Aufruf zu ignorieren.

Oder nutze eine Status Auflistung / Enumeration
und danach entscheidest Du in den Events was zu tun ist.

Du könntest auch Ansicht und Bearbeiten trennen das
man durch die Liste scrollen kann ohne das es eine Bearbeitung stört.

Hello,
you can save any line of the list box
you can also only pass the column value single
However, the row value of the list box is often not the data record number
here you should keep the record number in the list box
or can be determined with Listbox.CellTagAt (row)
E.g.
updatesql (Listbox.CellTagAt (row), column)

here is a small example

Var s As String
Var max As Integer
Try
  people.CellTagAt
  If db.Connect Then
    If x > 0  Then  // Satznummer
      Var rs As RowSet
      s = x.ToString
      rs = db.SelectSQL("SELECT * FROM kunde WHERE ID=?",x)
      If rs <> Nil Then
        db.BeginTransaction // ??
        rs.EditRow
        rem nur bild einsetzen ???
        //rs.Column("Bilddaten").BlobValue = mb
        // mit übergabe von column kann auch nur eine Spalte gespeichert werden
        // If column = 1 Then rs.Column("firstname").StringValue = people.CellValueAt(p1,1)
        // If column = 2 Then rs.Column("lastName").StringValue = people.CellValueAt(p1,2) 
        // usw.
        // hier immer ganze Zeile der Listbox
        If Checkmitbild.value = True Then
          // Bild pos = 0
          rs.Column("firstname").StringValue = people.CellValueAt(p1,1)
          rs.Column("lastName").StringValue = people.CellValueAt(p1,2)
          rs.Column("Ort").StringValue =  people.CellValueAt(p1,3)
          rs.Column("strasse").StringValue =  people.CellValueAt(p1,4)
          rs.Column("bildpfad").StringValue = people.CellValueAt(p1,5)
          //rs.Column("Bilddaten").BlobValue = mb - Extra schreibenurbild
        Else
          rs.Column("firstname").StringValue = people.CellValueAt(p1,0)
          rs.Column("lastName").StringValue = people.CellValueAt(p1,1)
          rs.Column("Ort").StringValue =  people.CellValueAt(p1,2)
          rs.Column("strasse").StringValue =  people.CellValueAt(p1,3)
          rs.Column("bildpfad").StringValue = people.CellValueAt(p1,4)
        End If
        rs.SaveRow
        rs.Close
        db.CommitTransaction // ?? wird immer mit save aufgerufen
        label7.Text = "Daten-Satz "+s+" Update ok"
      Else
        Messagebox"Fehler Rowset=nil"
      End If
    End If
  End If
  
Catch error As DatabaseException
  MessageBox("DB Connection Error: " + error.Message)
End Try

Testprogramm SQLite intern / extern Desktop

https://www.dropbox.com/s/tb5mu6ojqwqsgkt/my-Toolbar-SQLitetest-Paint.xojo_binary_project?dl=1

Leute, guys,

danke / thanks a lot. Werde ich mir genau anschauen und mich wieder melden

Forum for Xojo Programming Language and IDE. Copyright © 2021 Xojo, Inc.