Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern (https://www.delphipraxis.net/182331-sql-server-mehrere-datensaetze-gleichzeitig-vergleichen-und-aendern.html)

romber 17. Okt 2014 10:43

Datenbank: SQL Server • Version: 2012 • Zugriff über: ADO

SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Hallo!

Ich habe folgendes Problem: in einer Tabelle auf dem SQL Server werden mehrere Hundert Verträge abgelegt. Bei jeder Vertragsänderung wird ein neuer Datensätz erstellt, um Anderungen später nachvollziehen zu können. Dabei ist mir ein Fehler unterlaufen: ein bestimmtes Feld (Datum) sollte bei jeder Änderung immer gleich bleiben, wird jedoch immer mit dem aktuellen Datum überschrieben. Das muss ich jetzt korrigieren.

Ich muss jetzt bei jedem ersten Vertragsdatensatz ein Feld auslesen und diesen Feld bei jedem letzten Vertragsdatensatz mit dem ausgelesenen Wert aktualisieren.

Wie kann ich das auf einen Schlag machen, ohne jeden Vertrag nacheinander zu ändern?

Danke!

mkinzler 17. Okt 2014 10:47

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Wie hat man das letzter Vertragsdatensatz zu verstehen? Sind das Einträge mit einem gleichen Ordungskriterium (z.B. FK)? Per Versionsnnummer oder neuestes Datum?

Sir Rufo 17. Okt 2014 10:53

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Wenn dieses Feld immer gleich bleiben soll/muss, dann musst du doch den Wert in allen nachfolgenden Sätzen ändern und nicht nur im letzten, oder?

Zeig doch mal das DDL zu der Tabelle (es reichen dabei die relevanten Felder wie ID, Datum und das Feld woran man die Historie erkennen kann)

romber 17. Okt 2014 10:54

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Zitat:

Zitat von mkinzler (Beitrag 1276373)
Wie hat man das letzter Vertragsdatensatz zu verstehen? Sind das Einträge mit einem gleichen Ordungskriterium (z.B. FK)? Per Versionsnnummer oder neuestes Datum?

Mit dem ersten Vertragsdatensatz ist der allerersten Datensatz eines Vertrags gemeint. Bei jeder Änderung des Vertrags (über ein selbst programmieres Tool), z.B. Verlängerung oder Kennwort-Änderung, wird nicht der ursprüngliche Datensatz aktualisiert, sondern einen neuen erstellt mit den aktuellsten Informationen. Das ist dann der letzte Vertragsdatensatz.

romber 17. Okt 2014 10:56

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Zitat:

Zitat von Sir Rufo (Beitrag 1276374)
Wenn dieses Feld immer gleich bleiben soll/muss, dann musst du doch den Wert in allen nachfolgenden Sätzen ändern und nicht nur im letzten, oder?

Könnte man machen, muss aber nicht unbedingt sein. Die Änderung im letzten Datensatzt reicht, denn es wird bei einer Änderung wird immer nur der aktuellste Vertragsdatensatz abgefragt.

mkinzler 17. Okt 2014 10:56

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Das war der Teil, der mir klar war, aber meine Frage bezog sich darauf, wie man zusammenhängende erkennt und wie man den letzten erkennen kann.

Sir Rufo 17. Okt 2014 10:57

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Zitat:

Zitat von romber (Beitrag 1276375)
Bei jeder Änderung des Vertrags (über ein selbst programmieres Tool), ... wird nicht der ursprüngliche Datensatz aktualisiert, sondern einen neuen erstellt mit den aktuellsten Informationen.

Was für ein Tool hast du dir denn gebaut? Das mache ich auf dem MS-SQL mit INSTEAD OF Triggern

romber 17. Okt 2014 11:01

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Zitat:

Zitat von Sir Rufo (Beitrag 1276374)
Zeig doch mal das DDL zu der Tabelle (es reichen dabei die relevanten Felder wie ID, Datum und das Feld woran man die Historie erkennen kann)

v_id - wird automatisch erhöht
v_nr - Vertragsnummer, bleibt bei jeder Änderung gleich
v_from - Vertragsdatum, wird fälschlicherweise bei jeder Änderung aktualisiert, muss jedoch immer gleich bleiben.

Zitat:

Zitat von Sir Rufo (Beitrag 1276379)
Was für ein Tool hast du dir denn gebaut?

Ein kleines Tool für die Vertragsverwaltung, nichts besonderes.

Sir Rufo 17. Okt 2014 11:09

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Zitat:

Zitat von romber (Beitrag 1276381)
Zitat:

Zitat von Sir Rufo (Beitrag 1276374)
Zeig doch mal das DDL zu der Tabelle (es reichen dabei die relevanten Felder wie ID, Datum und das Feld woran man die Historie erkennen kann)

v_id - wird automatisch erhöht
v_nr - Vertragsnummer, bleibt bei jeder Änderung gleich
v_from - Vertragsdatum, wird fälschlicherweise bei jeder Änderung aktualisiert, muss jedoch immer gleich bleiben.

So solltest du jeweils den ersten Wert bekommen, den du dann in alle anderen Datensätze reinpassten musst
SQL-Code:
SELECT v_id, v_nr, v_from
FROM vertrag
WHERE (v_nr, v_id) IN ( SELECT v_nr, MIN( v_id ) FROM vertrag GROUP BY v_nr )
Zitat:

Zitat von romber (Beitrag 1276381)
Zitat:

Zitat von Sir Rufo (Beitrag 1276379)
Was für ein Tool hast du dir denn gebaut?

Ein kleines Tool für die Vertragsverwaltung, nichts besonderes.

Ähm ja, aber wozu war das nötig, eigentlich macht man sich dafür eine View, die nur die aktuellen Einträge zeigt und schreibst deine Änderungen (UPDATE, DELETE, INSERT) in diese View. Die INSTEAD OF Trigger kümmern sich dann um diese historische Protokollierung. Ein Tool wird dafür nicht benötigt.

mkinzler 17. Okt 2014 11:12

AW: SQL Server: Mehrere Datensätze gleichzeitig vergleichen und ändern
 
Kenne mich mit MSSQL nicht so aus, aber so ähnlich sollte es funktionieren
SQL-Code:
update <tabelle> t set t.v_from = (select top 1 v_from from <Tabelle> where v.nr = t.v_nr order by v_id);
Ich setzte alle nicht nur den letzten Satz neu


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.
Seite 1 von 2  1 2      

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