German In SQLite eine fortlaufende Nummer generieren und dort speichern.

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo liebe Forumgemeinde,

ich möchte in eine leere Spalte in einer SQLite in jeder Zeile eine fortlaufende Nummer generieren und dort speichern.

Weiß jemand, warum das so NICHT geht?
B4X:
'-- die IDNR generieren und in die Tabelle eintragen --
    Cursor = SQL1.ExecQuery("SELECT Feld_006 FROM Abrechnung")
        For i = 0 To Cursor.RowCount -1
            Cursor.Position = i
           
            Dim Abrechnung_IDNR As String
            Abrechnung_IDNR = i +1        '-- zählt automatisch die Position des Cursors +1 --
           
        '-- Ergebnis speichern --
            SQL1.ExecNonQuery("UPDATE Abrechnung SET Feld_006 = '"&Abrechnung_IDNR&"' ") 'WHERE Feld_006 = '"&Cursor.Position&"' +1 ")
                    Log("-- 3196 -- Abrechnung-IDNR: "&Abrechnung_IDNR&"")
        Next
        Cursor.Close

In der Log-Datei wird die Zählung angezeigt, aber in der SQLite wird nur die "letzte" IDNR in alle Zeilen gleich gespeichert.

Weiß jemand Rat?
 

specci48

Well-Known Member
Licensed User
Longtime User
Weiß jemand, warum das so NICHT geht?
Du verwendest die Update Syntax OHNE eine Where Klausel, somit werden ALLE Zeilen der benannten Spalte mit dem identischen Wert belegt.
Um jeweils eine einzelne Zeile bzw. einen einzelnen Datensatz separat mit einem eigenen Spaltenwert zu befüllen muss man die Zeile/den Datensatz mit der Where-Klausel genau eingrenzen.
Hast du denn schon eine eindeutige Id je Datensatz, bzw. kannst du jeden Datensatz anhand bestimmter Spaltenwerte eindeutig bestimmen? Oder möchtest du mit dem Code eine solche ID erst nachträglich einfügen?
 
Last edited:

specci48

Well-Known Member
Licensed User
Longtime User
Wenn du bisher über die Where-Klause keinen Datensatz eindeutig identifizieren kannst, so sehe ich nur folgende Lösungsmöglichkeit:
- neue Tabelle erstellen
- alle Zeilen der ersten Tabelle nach und nach auslesen
- alle (Spalten)Daten je Zeile über einen Insert in die neue Tabelle überführen; dabei dann wie gewünscht die Zeilennummer setzen
- abschließend alte Tabelle löschen und Namen der neuen Tabelle in den bisherigen Namen umbenennen
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

danke für deine ausführliche Antwort!

Ich habe den Punkt mit der WHERE-Klausel schon bedacht ... wie Du in meinem Code siehst, war schon
'WHERE Feld_006 = '"&Cursor.Position&"' +1 ")
auskommentiert ... da habe ich schon einiges herumexperimentiert, weil ich dachte, man kann das in einer Zeile abhandeln.

Aber leider scheint es nur so zu gehen mit den 2 Tabellen ... ich versuche das mal.
DANKE!
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo specci48,

ich habe im englischsprachigen Forum das Thema gepostet und einen Tip von klaus erhalten, allerdings hat es auch nicht gleich geklappt.
Aber mit ein weinig "Umschreiben" des Codes war es dann perfekt.

Für alle die es interessiert, poste ich hier die Lösung:
B4X:
Cursor = SQL1.ExecQuery("SELECT rowID FROM Abrechnung")
        For i = 0 To Cursor.RowCount -1
            Cursor.Position = i
            Dim Abrechnung_IDNR As String
            Abrechnung_IDNR = i +1
            SQL1.ExecNonQuery("UPDATE Abrechnung SET Feld_006 = '"&Abrechnung_IDNR&"' WHERE rowID = '"&Cursor.Position&"' +1 ")
        Next
Cursor.Close

Danke an dieser Stelle auch noch mal für deine Mühe! :)
 
Top