German SQL Datensatz ändern mit "Update xx Set"

Paulsche

Well-Known Member
Licensed User
Longtime User
Hallo,

ich bekomme folgendes einfach nicht gebacken:

Ich möchte den folgenden Code für das einfügen eines Datensatzes in ein
Update der Daten umbauen, also mit editierten Daten updaten, bekomme aber die Syntax nicht hin.:confused:

B4X:
      SQLtnk.ExecNonQuery("INSERT INTO Tankdaten VALUES('"&kfzauswahl&"','"&DateTime.dateparse(LBL01datTag.Text)&"','"&LBL01datTag.Text&"','"&LBL01datOrt.Text&"','"&tachostand_en&"','"&liter_en&"','"&literpreis_en&"','"&verbrauch&"','"&rechnung_en&"','"&LBL01dattankart.Text&"','"&LBL01datNotiz.Text&"')")

was muss ich mit Where abfragen ?
Die Cursor Position des Rows habe ich durch selektieren der Zelle aus der scrollviewtabelle ermittelt.
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo Paulsche,

mir ist aufgefallen, das z.B. die "kfzauswahl" keine Endung wie ".Text" hat.
Woher kommen also die Daten?
Wie lautet die Fehlermeldung?

Versuche deinen Code mit diesen Informationen zu erweitern.
 

Paulsche

Well-Known Member
Licensed User
Longtime User
Hi Jotha,

ich meine das so :

B4X:
   kfznr = 3
   If TankenAendern > 0 Then
      SQLtnk.ExecNonQuery("UPDATE Tankdaten SET kfzauswahl=kfznr, datum=LBL01datTag.Text, ort=LBL01datOrt.Text where ...")
   Else   
      SQLtnk.ExecNonQuery("INSERT INTO Tankdaten VALUES('"&kfzauswahl&"','"&DateTime.dateparse(LBL01datTag.Text)&"','"&LBL01datTag.Text&"','"&LBL01datOrt.Text&"','"&tachostand_en&"','"&liter_en&"','"&literpreis_en&"','"&verbrauch&"','"&rechnung_en&"','"&LBL01dattankart.Text&"','"&LBL01datNotiz.Text&"')")
   End If

Vielleicht kannst du mir zeigen wie die Syntax für "SQLtnk.ExecNonQuery("UPDATE Tankdaten SET"
genau lauten muss, ich blick das mit den Anführungszeichen und Hochkomma nicht, wo ich was damit eingrenzen muss, und was ich nach WHERE eingeben muss damit nur der aktuellen Datensatz auf dem dre Cursor steht
geändert wird.

Wäre super.
 

corwin42

Expert
Licensed User
Longtime User
Hallo Paulsche,

um einen Datensatz zu ändern, musst Du ihn über die Where-Bedingung eindeutig identifizieren. D.h. Du musst in der Where Bedingung alle ALTEN Werte angeben, über die der Datensatz eindeutig identifiziert werden kann.

Einfacher geht das, indem man zu der Tabelle eine Spalte ID oder ähnlich anhängt, in der man einen eindeutigen Schlüssel speichert (Könnte z.B. ein Timestamp beim Anlegen des Datensatzes sein).

Dann könnte man beim Ändern den Datensatz mit SELECT lesen, sich die ID merken und später mit UPDATE xxxx SET spalte = value WHERE ID=abc ändern. Das ist weitaus einfacher.

Weiterhin würde ich Dir empfehlen sogenannte Bindvariablen zu benutzen. D.h. z.B. die Funktion ExecQuery2 benutzen. Dann kann man überall da, wo man variable Werte in den Query eintragen möchte einfach ein ? schreiben. Das Argumentarray muss dann alle variablen Werte enthalten in der Reihenfolge, in der die ? ersetzt werden sollen. Das erspart einem die Stringverkettungen mit den vielen Hochkommata und ausserdem kann die SQL-Engine Deine Statements besser optimieren.
 

JOTHA

Well-Known Member
Licensed User
Longtime User
... fertiger Code ...

Hallo Paulsche,

das mit der WHERE-Klausel hätte ich auch nicht besser als corwin42 erklären können. Dir geht es wohl aber um einen konkreten Code.

Ich versuche das jetzt mal ganz einfach darzustellen.
1) Nehmen wir an, deine ID (darf nur einmal in der ganzen DB vorkommen) heißt "ID-001"
2) Du möchtest in deinen Feldern (Feld1 und Feld2) etwas ÄNDERN (= UPDATE)

dann sieht das ganz einfach so aus:
B4X:
'...
SQLtnk.ExecNonQuery("UPDATE Tankdaten SET Feld1 = '"&EditText1.Text&"', Feld2 = '"&EditText2.Text&"' WHERE IDNummer = 'ID-001' ")
'...
Die Daten, die geändert werden sollen, befinden sich in den Textfeldern

EditText1 und EditText2

und die IDNummer befindet sich in deinem "alten" Datensatz in der Spalte IDNummer (die muß dort also schon vorhanden sein). ;)

Übersetzt in deinem Code sieht das dann wohl so aus:
B4X:
'...
kfznr = 3
   If TankenAendern > 0 Then
      SQLtnk.ExecNonQuery("UPDATE Tankdaten SET kfzauswahl = '"&kfznr.Text&"', datum = '"&LBL01datTag.Text&"', ort = '"&LBL01datOrt.Text&"' WHERE IDNummer = 'ID-001' ")
   Else   
'...
Das funktioniert 100%-ig unter der Voraussetzung, dass die Daten aus Textfeldern stammen, die

kfznr und datum und ort heißen.

Jetz hast Du aber nicht nur einen einzigen Datensatz, der immer die IDNummer 'ID-001' hat. In diesem Fall muß bei der WHERE-Klausel natürlich immer wieder eine andere IDNummer eingelesen werden. Das geht so:

Du richtest Dir in deiner Maske irgendwo ein Textfeld oder ein Label (sichtbar oder unsichtbar) ein. Nehmen wir ein Textfeld mit dem Namen IDNummerTextfeld.

In dieses Textfeld läßt Du beim Laden des Datensatzes aus deiner SQL-Datenbank diesen Wert (IDNummer) reinschreiben. Dann änderst Du deine restlichen Daten und startest den Code:
B4X:
'...
kfznr = 3
   If TankenAendern > 0 Then
      SQLtnk.ExecNonQuery("UPDATE Tankdaten SET kfzauswahl = '"&kfznr.Text&"', datum = '"&LBL01datTag.Text&"', ort = '"&LBL01datOrt.Text&"' WHERE IDNummer = '"&IDNummerTextfeld.Text&"' ")
   Else   
'...

Ich hoffe Dir hilft das. :)
 

Paulsche

Well-Known Member
Licensed User
Longtime User
Hallo, danke euch beiden, klappt nun prima.
Dachte zuerst man könnte direkt über die Cursorvariable der DB den Datensatz ändern und bräuchte daher keine Abfrage, hab nun mit "Where" nach dem Tachostand selektiert, da dieser Wert immer einmalig ist.

:sign0098:
 

JOTHA

Well-Known Member
Licensed User
Longtime User
... Tachostand ... :sign0098:

Ja genau, der Wert ändert sich ja in deiner App bei jedem neuen Eintrag im Normalfall. Schön das es jetzt klappt.

;)
 
Top