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-ID: 641006

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

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

em-pie
Lösung em-pie 16.01.2021 um 17:17:28 Uhr
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
Aximand
Aximand 16.01.2021 aktualisiert um 18:57:09 Uhr
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
GrueneSosseMitSpeck
GrueneSosseMitSpeck 17.01.2021 um 14:52:46 Uhr
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.