aximand
Goto Top

Bei einem Insert einen anderen identischen Datensatz ändern

Guten Abend zusammen,

ich bin jetzt seit 2 Tagen und in Summe bestimmt 10 Stunden am recherchieren, lesen, rumfruckeln und komm nicht so richtig weiter.
Vielleicht sind meine Suchangaben zu verkorkst, so dass ich keinen Treffer finde.
Ich versuche mein Begehr hier mit Bildmaterial zu beschreiben.

In dieser Tabelle gibt es "identische" Datensätze (Artikelnummer / EAN identisch - die haben auch Bestand) aber die BEZ1 kann z.B. durch Anwender geändert werden:

unbenannt

Der letzte Datensatz mit der letzten Datums-/Uhrzeitangabe ist der derzeit aktive Datensatz, die anderen spielen keine Rolle mehr.

Ändert jetzt ein Anwender die BEZ1, so würde der Datensatz wieder mit dem aktuellen Zeitstempel rein geschrieben werden.
Artikelnummer, EAN .... alles identisch, nur die BEZ1 wäre dann z.B. wegen eines Buchstabendrehers geändert.
Beim INSERT des neuen Datensatzes wird Aktiv=1 gesetzt.

Jetzt das, was ich nicht hinbekomme:

Wenn jetzt also der neue Datensatz über ein INSERT hinzugefügt wird, dann soll in dieser Tabelle nachgeschaut werden ob es schon Datensätze gibt, bei denen
die Artikelnummer, EAN (beliebig skalierbar) vorhanden sind,
deren Zeitstempel kleiner/älter ist als der aktuelle INSERT-Zeitstempel und Aktiv=1 ist

Es müsste also der gelb markierte Datensatz beim INSERT erkannt werden und mit dem Insert des neuen Datensatzes das Aktiv von 1 auf 0 umgestellt werden.

Und da kommen meine kleinen grauen Zellen leider nicht weiter. Der einzige Anhaltspunkt ist, dass ich das über einen INSERT-Trigger in der Tabelle lösen wollen würde. Aber der Code ist mir nicht klar und ich dachte an sowas, was leider nicht funktioniert:

IF Exists (Select A.TETENR from ArtikelProd A , ArtikelProd B  where A.DTM < B.DTM and A.Aktiv=1)
begin
Update ARTIKELPROD
Set 
ARTIKELPROD.AKTIV = '0'  
end

Content-Key: 641006

Url: https://administrator.de/contentid/641006

Printed on: April 24, 2024 at 19:04 o'clock

Member: em-pie
Solution em-pie Jan 16, 2021 at 16:17:28 (UTC)
Goto Top
Moin,

Mit einem Statement wird das nichts.

Mach dich (mit einen Transact) zunächst das Update auf den später obsolet werdenden Datensatz.

Danach dein Insert Statement.

Wenn dein Insert fehlschlägst, dann das Update wieder rückgängig machen.


Hilfe findest du z.B. hier...
https://stackoverflow.com/questions/2238881/sql-query-thatll-rollback-if ...

Gruß
em-pie
Member: Aximand
Aximand Jan 16, 2021 updated at 17:57:09 (UTC)
Goto Top
Danke für den Hinweis der mich dann mit der Nase drauf hingestoßen hat.

Ich hab mit einem INSERT-Trigger das Problem lösen können:

Update ARTIKELPROD
set ARTIKELPROD.Aktiv = 0
 from Inserted I 
where ArtikelProd.TETENR = I.TETENR and ArtikelProd.dtm <> i.dtm

Da in der Tabelle ArtProd das DTM-Feld jedes Datensatzes <> zum DTM-Feld der INSERT.Tabelle ist werden die vorhandenen Datensätze überschrieben.

Das scheint so zu funktionieren face-smile
Member: GrueneSosseMitSpeck
GrueneSosseMitSpeck Jan 17, 2021 at 13:52:46 (UTC)
Goto Top
und bei der Abfrage ein MAX(DTM) dann muß man nicht mit "Aktiv=1" noch ein Flag setzten, kenn aber das Backend dahinter nicht.