AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie Update mit max() pro Gruppe
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Update mit max() pro Gruppe

Ein Thema von BlueStarHH · begonnen am 28. Okt 2017 · letzter Beitrag vom 29. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
850 Beiträge
 
Delphi 11 Alexandria
 
#1

Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 22:14
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallo,

ich habe eine Tabelle RechnungPos mit RechnungsNr und PositionsNr. Die PositionsNr gibt die Reihenfolge von Artikeln auf einer Rechnung an. *Einige* Rechnungen enthalten die Postion 999, die per SQL in die nächste freie PositionsNr < 999 geändert werden soll. So soll das aussehen:

Code:
RechnungNr PositionsNr
1           1
1           2
1           999  wird zu 3
2           1
2           2
2           3
2           999  wird zu 4
3           999  wird zu 1
4           1
4           2
Mein Ansatz:
update RechnungPos set PositionsNr max(PositionsNr)+1 where PositionsNr 999
Problem dabei ist max(PositionsNr) wird die 999 zurückgeben und wie kann man das pro RechnungNr setzen/abfragen?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 22:25
mach einen zusätzlichen Subselect mit where positionsnr<>999 Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
850 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 22:27
mach einen zusätzlichen Subselect mit where positionsnr<>999 Gruß
K-H
Danke, aber irgendwie stehe ich gerade auf dem Schlauch. Poste mal bitte den kompletten SQL-Ausdruck.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 22:57
Könnte so funktionieren wenn man es wie von p80286 vorgeschlagen mit einem Subselect macht.

SQL-Code:
UPDATE RechnungPos
SET PositionsNr = MAX(SELECT PositionNr FROM RechnungPos WHERE PositionNr <> 999) + 1
WHERE PositionsNr = 999
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 23:17
Das setzt aber alle PositionsNr, die 999 sind, auf die höchste freie PositionsNr <> 999. Damit käme die 999 nicht mehr vor, aber die (Max <> 999) + 1, genauso oft, wie bisher die 999.
Man müsste die Tabelle satzweise durchgehen und für jeden Satz, dessen PositionsNr = 999 ist, per Update aktuallisieren. Dabei ist Max auf die PositionsNr aber nicht die nächste freie, sondern die höchste vergebene. Lücken kann man damit nicht finden.

'ne Lösung hab' ich nicht, aber eventuell hilft dashier weiter? http://www.delphipraxis.net/85745-da...ds-finden.html
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 23:19
Das setzt aber alle PositionsNr, die 999 sind, auf die höchste freie PositionsNr <> 999. Damit käme die 999 nicht mehr vor, aber die (Max <> 999) + 1, genauso oft, wie bisher die 999.
Man müsste die Tabelle satzweise durchgehen und für jeden Satz, dessen PositionsNr = 999 ist, per Update aktuallisieren. Dabei ist Max auf die PositionsNr aber nicht die nächste freie, sondern die höchste vergebene. Lücken kann man damit nicht finden.
Das ist richtig. Aber das war ja scheinbar auch die Frage. Zumindest wurde das nicht auf bspw. nur die erste 999er ID eingegrenzt. Mir kommt das zwar auch etwas komisch vor, aber es ist zumindest eine Lösung für die aktuell definierte Frage.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Wie Update mit max() pro Gruppe

  Alt 28. Okt 2017, 23:27
Ausgehend von der Beispieltabelle, soll je RechnungsNr die kleinste freie PosititionsNr für die 999 vergeben werden.

Ungefähr sowas:

Suche für jede RechnungsNr
jede PositionsNr = 999
und gebe ihr die kleinste freie PositionsNr zu diese RechnungsNr
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
850 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wie Update mit max() pro Gruppe

  Alt 29. Okt 2017, 09:00
Sorry, es war gestern wohl schon zu spät für mich und ich habe einen Teil der Anforderungen verschluckt:

Es soll die nächste "freie" PositionsNr je RechnungNr anstelle der 999 eingetragen werden. Man sieht es an der Beispieltabelle, die ich in der Frage gepostet habe.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Wie Update mit max() pro Gruppe

  Alt 29. Okt 2017, 10:22
UPDATE RechnungPos
SET PositionsNr = (SELECT max(PositionNr)+1 FROM RechnungPos p WHERE PositionNr <> 999 and p.rechnungsnummer=rechnungspos.rechnungsnummer)
WHERE PositionsNr = 999
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Wie Update mit max() pro Gruppe

  Alt 29. Okt 2017, 10:52
Das geht aber schief, wenn es mehr als eine PositionsNr = 999 zu einer RechnungsNr gibt, die bekommen dann alle die Max(PositionNr)+1. Man erhält dann Dubletten, die ggfls. nicht mehr so leicht zu erkennen sind, wie die 999.

Mir fällt momentan keine Lösungsmöglichkeit mit einem einzigen Updatestatement ein. Da muss man wohl mit 'nem Cursor über alle Sätze mit PositionsNr = 999 ran und die einzeln ändern.

Ohne einen eindeutigen Schlüssel für jeden Datensatz, kann man (glaub' ich) die Entstehung von Dubletten nicht vermeiden, sofern die Kombination aus RechnungsNr und PositionsNr = 999 nicht eindeutig ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:29 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