- Offizieller Beitrag
Hi,
ich möchte Routinen erstellen um (gemäß DSGVO) Datensätze, die die Aufbewahrungsfrist überschritten haben zu löschen/anonymisieren.
Die längsten Fristen gelten für Rechnungen (10 Jahre), d.h. alle zugehörigen Kundendaten müssen ebenso lange aufbewahrt werden. Ist die letzte Kundenaktivität (Verkaufsrechnung) länger als 10 Jahre her, müssen alle Kundendaten gelöscht oder anonymisiert werden.
Soweit, so sinnlos aufwändig.
Mein Lösungsansatz war folgender:
- alle Kundennummern mit Status "nicht mehr aktiv" abfragen
- in der Belegtabelle die jüngste Verkaufsrechnung ( MAX(Belegnr) ) für jede dieser Kundennummern ermitteln
- feststellen, ob Differenz größer als 119 Monate (min. 120 Monate, also 10 Jahre)
- JA - Adressnummer ausgeben
- NEIN - 0 ausgeben
- mit den Adressnummern dann die erforderlichen UPDATE-Statements durchführen
Für eine vorhandene Rechnungsnummer klappt die Ermittlung gut:
Spoiler anzeigen
/* DATETOJAHRMO liefert nummerischen Ausdruck für den Monat */
/* SQL1
DATETOJAHRMO für Belegdatum */
select DATETOJAHRMO( Belegdat ) NUM_MON
from Beleg
where
BELEGTYP = 'V' and
BELEGART = 'RE' and
BELEGNR = 990026
;
/* SQL2
DATETOJAHRMO für HEUTE
Ich brauche keine Datenquelle, da das Statement aber eine Tabelle erfordert, wird eine kleine Tabelle angegeben */
select distinct DATETOJAHRMO(GetDate('NOW')) TODAY_MON
from Personal
;
/* SQL3
Ermittle, ob Differenz "Heute - Belegdatum" größer 119 Monate ist (also min. 120 Mon, = 10 Jahre) */
select
case
when (b.TODAY_MON - a.NUM_MON > 119) then c.ADRESSNR
else 0
end OLDER_10Y
from "&&SQL1" a, "&&SQL2" b, Beleg c
where
c.BELEGTYP = 'V' and
c.BELEGART = 'RE' and
c.BELEGNR = 990026
;
Alles anzeigen
Mein Problem ist aber, für die Liste der inaktiven Kunden die jeweils jüngste Rechnungsnummer abzufragen, da ich dafür MAX() benutze und diese Funktion ja nur einen Wert zurückliefert. Hier brauchte ich eine Möglichkeit in einer Schleife oder ähnlich zu arbeiten. Ich bin nicht so superfit mit SQL und kenne nicht alle Tricks, vielleicht kann mir jemand einen Tipp geben.
Der Vollständigkeit halber, die Ermittlung der inaktiven Kunden und die MAX-Beleg Ermittlung:
Spoiler anzeigen
/* Kundennummern für inaktive Kunden abfragen */
select KUNDENNR
from Kunden
where
KUNDENNR < 50000 and
ADRESSGRP = "8"
order by KUNDENNR
;
/* jüngste Rechnungsnummer für einen Bsp.-Kunden */
select max(BELEGNR) BELEGNR
from Beleg
where
BELEGTYP = 'V' and
BELEGART = 'RE' and
BELEGNR = 990026
;
Alles anzeigen