Forum: Datenbanken
by mkinzler,
25. Nov 2018
PK muss sein, sonst wird immer ein insert ausgeführt.
Zeig mal den aktuellen Code.
Forum: Datenbanken
by mkinzler,
25. Nov 2018
autoinc ist in diesem Fall kontraproduktiv. Das Feld sollte PK sein.
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Ist ID (oder in Deinem Fall besser Tag) auch Primärschlüssel bzw. hat einen unique contraint?
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Das sollte das UPSERT-Statement machen. Es wird ein Insert durchgeführt, wenn dieser fehlschlägt, da die ID schon vorhanden ist werden die vorhandenen Werte ersetzt.
Dieses eine Statement ersetzt alle Deinen Statements.
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Mir ist auch nicht klar, was Du eigentlich machen willst.
Dein ursprünglicher Code prüft, ob schon ein Eintrag einer bestimmten ID existiert. Wenn nicht wird ein Eintrag ohne Angabe einer ID erzeugt. Dies kann muss aber nicht die vorgegebene ID sein.
Was steckt hinter der ID?
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Query1.SQL.Text:='Insert into OPmonth (id,WorkH,EIndex,WIndex) '+
'values (:id, :WorkH,:EIndex,WIndex) ON CONFLICT(id) DO UPDATE set WorkH=:WorkH,EIndex=:EIndex,WIndex=:WIndex';
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Ich habe nur die Reihenfolge der Zeilen getauscht.
Warum liest Du die vorhandenen Werte ert ein ohne Sie zu benötigen? Warum nicht die genannte Lösung per Upsert?
Forum: Datenbanken
by mkinzler,
25. Nov 2018
Query1.SQL.Text:='update OPmonth set WorkH=:WorkH,EIndex=:EIndex,WIndex=:WIndex where id=:id';
Query1.Params.CreateParam(ftString,'WorkH',ptInputOutput);
Query1.Params.CreateParam(ftString,'EIndex',ptInputOutput);
Query1.Params.CreateParam(ftString,'WIndex',ptInputOutput);
Query1.ParamByName('WorkH').Text:=Edit29.Text;
Query1.ParamByName('EIndex').Text:=Edit64.Text;
...