Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden (https://www.delphipraxis.net/198653-db-2werte-vergleichen-um-zwischen-insert-und-update-zu-unterscheiden.html)

Amenovis 21. Nov 2018 20:19

DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Ich hab mir etwas überlegt um zu sehen ob ein Tag bereits eingetragen wurde

ich hab eine Formular dort hab ich eine TagesFeld via EditX.Text in der DB hab ich Tag

nun will ich vergleichen ob der Tag schon existiert, um Werte via update einzufügen oder ob der Tag noch nicht existiert und der erste Befehl Insert lauten muss... nur bevor ich das nun stundenlang teste, die Frage, ob es so wie ich es mir denke, vom Grundgedanken geht

Delphi-Quellcode:
RQuery2.SQL.Text:='SELECT LAST(Day) as var2 FROM tabelle';
  RQuery2.Open;
  EditDay.Text:=RQuery2.FieldByName('var2').asString;
  RQuery2.Close;
  if editX.Text=EditDay.Text
  then
[B]update[/B]
  else
[B]Insert[/B]
ich weiss es geht sicher anders komplizierter auch... aber ist meine Version auch möglich?

LG

DP-Maintenance 21. Nov 2018 20:37

Dieses Thema wurde am "21. Nov 2018, 21:37 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "Datenbanken" verschoben.

timog 21. Nov 2018 21:34

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Klar, kann man so machen. Du solltest trotzdem so viel/smart testen, wie es nur geht. :-D Je nach DB gibt es vielleicht auch ein Insert or Update SQL Statement, das weiterhelfen kann.

Amenovis 21. Nov 2018 21:53

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Ok normal spiel ich mit allem immer stundenlang bis es so funktioniert.. diesmal musste ich noch eine Anlage nebenbei reparieren da dachte ich mir schreib es schnell auf als die Idee im Kopf war und frag gleich und teste später :)

bevor der Gedanke wegen irgendwas anderem verfliegt

Danke Namensvetter für die Info dann spiel ich damit mal rum auf arbeit oder später zu hause :)

EDIT:OK hab mal eben getestet ohne update usw er sollte mir dann eigentlich nur den tag ins editfeld schmeissen

also nur den part aber das will er nicht mit sum() ging es vielleicht kennt sqllite kein last()

Delphi-Quellcode:
RQuery2.SQL.Text:='SELECT LAST(Day) as var2 FROM tabelle';
  RQuery2.Open;
  EditDay.Text:=RQuery2.FieldByName('var2').asString;
  RQuery2.Close;

mkinzler 22. Nov 2018 04:57

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Welchs DBMS?

hoika 22. Nov 2018 06:11

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Hallo,
wenn das DBMS nichts direktes anbeitet, würde ich

Select Count(*) From Tabelle
Where Day=:Day

nehmen,
um zu ermitteln, ob der Datensatz in der Tabelle schon existiert.

Ergebnis 0 -> Insert, sonst Update

Jasocul 22. Nov 2018 06:14

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Ich würde es so lösen:
Delphi-Quellcode:
  RQuery2.SQL.Text:='SELECT count(*) as var2 FROM tabelle where Day = :PruefTag';
  RQuery2.ParamByName('PruefTag').AsString := editX.Text;
  RQuery2.Open;

  if RQuery2.FieldByName('var2').AsInteger > 0
  then
[B]update[/B]
  else
[B]Insert[/B]
hoika war schneller. Ich poste trotzdem, da es mit Source-Beispiel ist.

Trafel21 22. Nov 2018 07:06

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Wäre es nicht vorteilhafter ein Trigger in der Datenbank dafür zu schreiben?

jobo 22. Nov 2018 07:49

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Zitat:

Zitat von timog (Beitrag 1418704)
Klar, kann man so machen. ..

Kommt drauf an. Was auch immer last() macht, es legt nahe dass:
die Tage chronologisch gefüllt werden, wenn nicht und Lücken bestehen dürfen, ist der Einsatz von last() Müll.
Die Prüfung mit "where day = ", wie bereits gezeigt, eignet sich da schon besser.
Und wenn der TE mal die Fragen beantworten würde, könnte man vielleicht noch "Upsert" anbieten und würde damit die Entscheidung Insert oder Update dem System überlassen.

joachimd 22. Nov 2018 11:55

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Zitat:

Zitat von jobo (Beitrag 1418741)
Und wenn der TE mal die Fragen beantworten würde, könnte man vielleicht noch "Upsert" anbieten und würde damit die Entscheidung Insert oder Update dem System überlassen.

Hat er doch: sqllite
https://www3.sqlite.org/lang_UPSERT.html

rokli 22. Nov 2018 14:41

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Hallo!

Du kannst auch den mächtigen MERGE verwenden ... dann hast Du INSERT und UPDATE mit einer SQL Anweisung erschlagen, sofern Deine Daten eindeutig sind.

(Edit: Sofern die DB das kann; bei MS SQL und IBM DB2 funktioniert es.)

Gruß

Amenovis 24. Nov 2018 15:57

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
wow echt super viele Ansätze DANKE mhh Merge und Upset da geh ich mal lesen, das klingt auch sehr Interessant :-D

lg

Timo

Amenovis 25. Nov 2018 18:19

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Sorry für Doppelposting aber hat vielleicht jemand eine Idee was ich jetzt wieder Falsch mache ?

Delphi-Quellcode:
RQuery2.SQL.Text:='SELECT count(*) as var2 FROM OPmonth where ID=:ID';
  RQuery2.ParamByName('ID').AsString := edit25.Text;
  RQuery2.Open;
  if RQuery2.FieldByName('var2').AsInteger > 0
  then begin
  id:=Edit15.Text;
  query1.Params.CreateParam(ftString,'id',ptinputoutput);
  query1.ParamByName('id').Text:=id;
  query1.SQL.Text:='select WorkH,EIndex,WIndex from OPmonth where id=:id';
  Query1.Open;
  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;
  Query1.ParamByName('WIndex').Text:=Edit65.Text;
  Query1.SQL.Text:='update OPmonth set WorkH=:WorkH,EIndex=:EIndex,WIndex=:WIndex where id=:id';
  Query1.ExecSQL;
  end
  else
  query1.SQL.Text:='select WorkH,EIndex,WIndex from OPmonth where id=:id';
  Query1.Open;
  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;
  Query1.ParamByName('WIndex').Text:=Edit65.Text;
  Query1.SQL.Text:='Insert into OPmonth (WorkH,EIndex,WIndex)'+
   'values (:WorkH,:EIndex,WIndex)';
  Query1.ExecSQL;
  end;

Schokohase 25. Nov 2018 19:17

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Erst den SQL Text setzen und dann die Parameter bearbeiten.

Amenovis 25. Nov 2018 19:22

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Bitte was meinst du ?

mkinzler 25. Nov 2018 19:25

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Zitat:

Zitat von Amenovis (Beitrag 1419180)
Bitte was meinst du ?

Delphi-Quellcode:
  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;
  Query1.ParamByName('WIndex').Text:=Edit65.Text;
  Query1.ExecSQL;

Amenovis 25. Nov 2018 19:30

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
sql logic or missing database mhh

mkinzler 25. Nov 2018 19:33

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
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?

Amenovis 25. Nov 2018 19:37

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
ja ich auch das ergebnis blieb das gleiche :(

Delphi-Quellcode:
  RQuery2.SQL.Text:='SELECT count(*) as var2 FROM OPmonth where ID=:ID';
  RQuery2.ParamByName('ID').AsString := edit25.Text;
  RQuery2.Open;
  if RQuery2.FieldByName('var2').AsInteger > 0
  then begin
  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;
  Query1.ParamByName('WIndex').Text:=Edit65.Text;
  Query1.ExecSQL;
  end
  else
  Query1.SQL.Text:='Insert into OPmonth (WorkH,EIndex,WIndex)'+
  'values (:WorkH,:EIndex,WIndex)';
  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;
  Query1.ParamByName('WIndex').Text:=Edit65.Text;
  Query1.ExecSQL;
  end;

p80286 25. Nov 2018 19:42

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Delphi-Quellcode:
RQuery2.SQL.Text:='SELECT count(*) as var2 FROM OPmonth where ID=:ID';
   RQuery2.ParamByName('ID').AsString := edit25.Text;
   RQuery2.Open;
   if RQuery2.FieldByName('var2').AsInteger > 0
   then begin
     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;
     Query1.ParamByName('WIndex').Text:=Edit65.Text;
     Query1.ExecSQL;
   end
   else
   BEGIN {--------------------------------------------------------------------}
     Query1.SQL.Text:='Insert into OPmonth (WorkH,EIndex,WIndex)'+
                      'values (:WorkH,:EIndex,WIndex)';
     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;
     Query1.ParamByName('WIndex').Text:=Edit65.Text;
     Query1.ExecSQL;
   end;
und jetzt?

Gruß
K-H

mkinzler 25. Nov 2018 19:42

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Delphi-Quellcode:
 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';

Amenovis 25. Nov 2018 19:48

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
p80286 ...slq logic error or missing database mhh ich versuch mal MKinzler

Amenovis 25. Nov 2018 19:52

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Ok Die Version gibt keinen Error aber Eintragen in die DB macht er auch nicht :?::?::?::?::?:

mkinzler 25. Nov 2018 19:55

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
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?

Amenovis 25. Nov 2018 20:03

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
zuerst dachte ich tag dann dachte ich ob das feld id oder tag heisst macht keinen unterschied

wenn ich etwas in eine db eintrage setze ich die id als eindeutige zuweisung daher wollte ich sehen ob der eintrag schon drin ist

sprich ist die id als beispiel 1 steht schon etwas in der db also muss er die zeile nur updaten steht noch gar nichts in der db oder die id ist eine andere soll er insert nutzen

Oder anders erklärt edit feld ist leer also ist die db leer... schreib ich in das editfeld 1 soll er insert nutzen (db ist ja noch leer)wenn noch kein anderer 1 geschrieben hat. ist etwas in der db und die id ist 1 soll er die spalten updaten... schreib ich 2 ins edit soll er inserten wenn noch keine 2 da ist oder wenn eine 2 da ist updaten mhh

mkinzler 25. Nov 2018 20:17

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
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.

Amenovis 25. Nov 2018 20:19

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
ja so versteh ich das auch mhh ich trenn mal den code vom rest mit einem test button vielleicht sitzt der fehler höher nur komischer weise macht er dort alles

mkinzler 25. Nov 2018 20:22

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Ist ID (oder in Deinem Fall besser Tag) auch Primärschlüssel bzw. hat einen unique contraint?

Amenovis 25. Nov 2018 20:26

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
hab die Tabelle zweimal einmal mit unique und auto inc und einmal als reines Integer Feld .. hab es mit beiden getestet und es macht keinen unterschied er trägt es einfach nicht ein

mkinzler 25. Nov 2018 20:27

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
autoinc ist in diesem Fall kontraproduktiv. Das Feld sollte PK sein.

Amenovis 25. Nov 2018 20:33

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
habe extra nochmal eine tabelle erstellt die beinhaltet nur die 4 spalten kein unique kein auto inc und er macht es nicht

mkinzler 25. Nov 2018 20:35

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
PK muss sein, sonst wird immer ein insert ausgeführt.

Zeig mal den aktuellen Code.

p80286 25. Nov 2018 22:28

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Zitat:

Zitat von mkinzler (Beitrag 1419210)
Zeig mal den aktuellen Code.

Wie die Tabelle(n) defeniert ist/sind und den Delphi-Code.
(eine Bitte: bei dem Feld "Tag" handelt es sich doch wohl um ein Datum? Dann wäre es ganz gut das Feld auch Datum/Date zu benennen. "Tag" ist etwas mißverständlich.)

Gruß
K-H

Amenovis 25. Nov 2018 22:38

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Habe Tag genommen da das Date System mir auch schlaflose Nächte schenkte Verbindung zwischen Delphi SQLite Format.. ist für mich identisch id tag
Delphi-Quellcode:
 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';
Query1.ParamByName('id').Text:=id;
Query1.ParamByName('WorkH').Text:=Edit29.Text;
Query1.ParamByName('EIndex').Text:=Edit64.Text;
Query1.ParamByName('WIndex').Text:=Edit65.Text;
Query1.ExecSQL;
  end;
Tabelle OPmonth

id ----> Integer PK
WorkH -> Integer
EIndex-> Integer
WIndex-> Integer

Frage dazu was ist wenn ID 0 ist weil die Db Fresh ist und gar keine Werte enthält ?

hoika 26. Nov 2018 06:27

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
Hallo,
lies Dir mal genau durch, wann dieses Dingens benutzt erden darf.
Ziemlich weit unten steht was von "When a UNIQUE or PRIMARY KEY constraint violation occurs"

https://sqlite.org/lang_conflict.html

Ich würde davon die Finger lassen und über das Standard Count(*) gehen.

Clever ist es schon, nur leider kein Standard.

Amenovis 26. Nov 2018 16:33

AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
 
mit count kam auch nur sql logic or missing db als error... so langsam denk ich. ich hab wieder eine komponente zerschossen

hatte das schon mal mit einer listview hab die dann gelöscht eine neue rein gemacht und schwups ging es mhh

ich teste das auch mal mit meinem mini spiel try and error program

lg


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz