![]() |
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:
ich weiss es geht sicher anders komplizierter auch... aber ist meine Version auch möglich?
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] LG |
Dieses Thema wurde am "21. Nov 2018, 21:37 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "Datenbanken" verschoben.
|
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.
|
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; |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Welchs DBMS?
|
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 |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Ich würde es so lösen:
Delphi-Quellcode:
hoika war schneller. Ich poste trotzdem, da es mit Source-Beispiel ist.
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] |
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?
|
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Zitat:
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. |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Zitat:
![]() |
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ß |
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 |
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; |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Erst den SQL Text setzen und dann die Parameter bearbeiten.
|
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Bitte was meinst du ?
|
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Zitat:
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; |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
sql logic or missing database mhh
|
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? |
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; |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Delphi-Quellcode:
und jetzt?
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; Gruß K-H |
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'; |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
p80286 ...slq logic error or missing database mhh ich versuch mal MKinzler
|
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 :?::?::?::?::?:
|
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? |
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 |
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. |
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
|
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?
|
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
|
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
autoinc ist in diesem Fall kontraproduktiv. Das Feld sollte PK sein.
|
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
|
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. |
AW: DB 2Werte vergleichen um zwischen Insert und Update zu unterscheiden
Zitat:
(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 |
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:
Tabelle OPmonth
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; 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 ? |
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" ![]() Ich würde davon die Finger lassen und über das Standard Count(*) gehen. Clever ist es schon, nur leider kein Standard. |
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 12:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz