AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrfach Update STatement

Ein Thema von Ykcim · begonnen am 5. Jul 2019 · letzter Beitrag vom 9. Jul 2019
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#1

AW: Mehrfach Update STatement

  Alt 8. Jul 2019, 12:04
Zitat:
Naja, aber Du mußt sicherstellen, dass die WHERE-Klausel wirklich nur die Zeilen findet, die Du updaten willst, sonst hast Du halt das Problem, dass für manche der gefundenen Zeilen keine der When-Klauseln passt und dann halt NULL in die Spalte geschrieben wird.
Das stelle ich dadurch sicher, dass waaunr, waaupo und oaagnr als Kombination unique sind und als Primärschlüssel fungieren... Daher behaupte ich, dass mit meinem aktuellen Statement wirklich nur die Zeile upgedatet werden, die auch einen Wert haben. Das ELSE nutze ich nur, weil es sonst einen Fehler in der Syntax gibt...

Gruß Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Mehrfach Update STatement

  Alt 8. Jul 2019, 12:25
Case when funktioniert auch ohne Else und zwar ohne Syntaxfehler. Welchen Syntaxfehler erhältst Du denn?

Was mir schleierhaft ist:
SQL-Code:
update as400 set
  sequence = case
      when (concat(waaunr,'-',waaupo) ='408216-0and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0and oaagnr =10) then 2
      when (concat(waaunr,'-',waaupo) ='408218-0and oaagnr =10) then 3
      else 0
  end,
  frozen = case
      when (concat(waaunr,'-',waaupo) ='408216-0and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408217-0and oaagnr =10) then 1
      when (concat(waaunr,'-',waaupo) ='408218-0and oaagnr =10) then 0
      else 0
  end,
  plan_date = case
      when (concat(waaunr,'-',waaupo) ='408216-0and oaagnr =10) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408217-0and oaagnr =10) then '2019-07-05'
      when (concat(waaunr,'-',waaupo) ='408218-0and oaagnr =10) then '2019-07-06'
      else '000-00-00'
  end
where concat(waaunr,'-',waaupo,'-',oaagnr) in ('408216-0-10', '408217-0-10', '408218-0-10')
Im where setzt du 3 Werte per Concat zusammen, im When zwei und den dritten fügst Du per and hinzu.

Warum, wo ist da der sittliche Nährwert? Es sind doch letztlich die gleichen Wertkombinationen abzufragen.

So wäre es dann schon etwas konsequenter:
SQL-Code:
update as400 set
  sequence = case
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408216-0-10') then 1
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408217-0-10') then 2
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408218-0-10') then 3
      else 0
  end,
  frozen = case
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408216-0-10') then 1
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408217-0-10') then 1
      when (concat(waaunr,'-',waaupo,'-',oaagnr) = '408218-0-10') then 0
      else 0
  end,
  plan_date = case
      when (concat(waaunr,'-',waaupo,'-',oaagnr) ='408216-0-10') then '2019-07-05'
      when (concat(waaunr,'-',waaupo,'-',oaagnr) ='408217-0-10') then '2019-07-05'
      when (concat(waaunr,'-',waaupo,'-',oaagnr) ='408218-0-10') then '2019-07-06'
      else '000-00-00'
  end
where concat(waaunr,'-',waaupo,'-',oaagnr) in ('408216-0-10', '408217-0-10', '408218-0-10')
Oder auch so:
SQL-Code:
update as400 set
  sequence = case
      when waaunr = '408216and waaupo = 0 and oaagnr = 10 then 1
      when waaunr = '408217and waaupo = 0 and oaagnr = 10 then 2
      when waaunr = '408218and waaupo = 0 and oaagnr = 10 then 3
      else 0
  end,
  frozen = case
      when waaunr = '408216and waaupo = 0 and oaagnr = 10 then 1
      when waaunr = '408217and waaupo = 0 and oaagnr = 10 then 1
      when waaunr = '408218and waaupo = 0 and oaagnr = 10 then 0
      else 0
  end,
  plan_date = case
      when waaunr = '408216and waaupo = 0 and oaagnr = 10 then '2019-07-05'
      when waaunr = '408217and waaupo = 0 and oaagnr = 10 then '2019-07-05'
      when waaunr = '408217and waaupo = 0 and oaagnr = 10 then '2019-07-06'
      else '0000-00-00'
  end
where waaunr in ('408216', '408217', '408218') and waaupo = 0 and oaagnr = 10
Die von Dir bisher gewählte Variante hätte ich früher höchstwahrscheinlich nicht durch den Test und die Qualitätssicherung bekommen, da bei ihr potenziell Datensätze geändert werden könnten, die nicht geändert werden dürfen. Und genau diese Fehlermöglichkeit war ja überhaupt erst der Grund, weshalb Du diesen Thread eröffnet hast.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#3

AW: Mehrfach Update STatement

  Alt 8. Jul 2019, 12:40
Also die erste Lösung würde funktionieren, aber die Möglichkeit der 3 Werte mit concat zusammen zu fassen hatte ich erst später. Aber das könnte ich ändern.
Deine zweite Lösung funktioniert nicht, da die Kombination AuftragsNr (waaunr) dem Zusatz (waaupo) und der ArbeitsgangNr (oaagnr) bei jedem Auftrag eine andere sein kann. Je nachdem bei welchem AG man gerade ist und es ist möglich, dass Aufträge mit einer unterschiedlichen ArbeitsgangNr auf der selben Maschine laufen und dann beim Speichern in der selben Tabelle stehen...

Die Variante die ich aktuell nutze schließt es meines Erachtens aus, dass Datensätze geändert werden, die nicht geändert werden sollen.

Zitat:
Case when funktioniert auch ohne Else und zwar ohne Syntaxfehler. Welchen Syntaxfehler erhältst Du denn?
Ich werde das Thema ohne ELS noch einemal testen. Ich denke, dass die Tatsache, dass ungewollt andere Datensätze geändert wurden, für die kein Wert in der Where-Klausel vorhanden waren, zu dem Fehler führten. In der letzten Where-Klausel hatte ich ja waaunr und waaupo abgefragt. Die Kombination ist ja für alle Arbeitsgänge des Auftrags dieselbe. Nur wenn man die ArbeitsgangNr (oaagnr) auch noch abfragt, ist eine Eindeutigkeit garantiert... Daher habe ich oaagnr mit in das concat eingebunden...

Gruß
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Mehrfach Update STatement

  Alt 8. Jul 2019, 23:09
Die von Dir bisher gewählte Variante hätte ich früher höchstwahrscheinlich nicht durch den Test und die Qualitätssicherung bekommen, da bei ihr potenziell Datensätze geändert werden könnten, die nicht geändert werden dürfen. Und genau diese Fehlermöglichkeit war ja überhaupt erst der Grund, weshalb Du diesen Thread eröffnet hast.

Wobei ich vom Verständnis her mit
Code:
 else 0
ein Problem habe. Ich würde ein
SQL-Code:
else Sequence
....
else frozen
....
else plan_date
bevorzugen, falls das syntaktisch möglich ist, oder noch besser, im else-Zweig gar nichts tun.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
718 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mehrfach Update STatement

  Alt 9. Jul 2019, 03:35
[QUOTE=p80286;1436333]

... falls das syntaktisch möglich ist, oder noch besser, im else-Zweig gar nichts tun.

Gruß
K-H
"gar nichts tun" ist halt nicht. Wenn keine der when-Klauseln zutrifft ist das Resultat des Case-Statements NULL.
Peter Below
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#6

AW: Mehrfach Update STatement

  Alt 9. Jul 2019, 07:42
[QUOTE=peterbelow;1436335]

... falls das syntaktisch möglich ist, oder noch besser, im else-Zweig gar nichts tun.

Gruß
K-H
"gar nichts tun" ist halt nicht. Wenn keine der when-Klauseln zutrifft ist das Resultat des Case-Statements NULL.
und damit sind wir dann wieder bei der Ausgangsfehlermeldung

@p80286

Verständnisproblem bei else 0 ?

Naja, sagen wir mal so: Für meine Begriffe ist das schlichtweg falsch. Eigentlich hab' ich dafür nur Unverständnis übrig
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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-2025 by Thomas Breitkreuz