Script für Kunden wäre recht interessant.
Habt ihr da nur den Kontookorrent gelöscht, oder auch die Adresse gleich mit?
Alles schon gemacht. Meist nur Kontokorrente und ggf. die zugehörigen Adressen dann auf inaktiv gesetzt (nach Löschen alter Geschäftsjahre, damit die alten Kundenkonten neu vergeben werden konnten). Aber auch schon inklusive Adressen.
Die Datensätze der abweichenden Lieferanschriften, die über das Kundenkonto angelegt wurden, werden automatisch beim Löschen der Kontokorrente mitgelöscht.
Als Ansatz hier mal eine Abfrage zur Ermittlung der Kundenkonten die gelöscht werden könnten, aus der dann die DELETE-Abfrage erstellt werden kann:
Code:
SELECT dbo.KHKKontokorrent.Kto, dbo.KHKKontokorrent.Mandant, dbo.KHKKontokorrent.Matchcode, dbo.KHKKontokorrent.Adresse
FROM dbo.KHKKontokorrent INNER JOIN
dbo.KHKAdressen ON dbo.KHKKontokorrent.Adresse = dbo.KHKAdressen.Adresse AND dbo.KHKKontokorrent.Mandant = dbo.KHKAdressen.Mandant
WHERE (dbo.KHKKontokorrent.KtoArt = 'D') AND (dbo.KHKKontokorrent.Mandant = 1) AND (dbo.KHKKontokorrent.KtoTyp = 0) AND
(dbo.KHKKontokorrent.Kto NOT IN
(SELECT A0Empfaenger
FROM dbo.KHKVKBelege
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (A0Empfaenger = dbo.KHKKontokorrent.Kto)))
AND (dbo.KHKKontokorrent.Kto NOT IN
(SELECT Rechnungsempfaenger
FROM dbo.KHKVKBelege AS KHKVKBelege_1
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (Rechnungsempfaenger = dbo.KHKKontokorrent.Kto)))
AND (dbo.KHKKontokorrent.Kto NOT IN
(SELECT Kto
FROM dbo.KHKWdhVertrag
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (Kto = dbo.KHKKontokorrent.Kto)))
AND (dbo.KHKKontokorrent.Kto NOT IN
(SELECT Rechnungsempfaenger
FROM dbo.KHKKontokorrent AS KHKKontokorrent_RE
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (Rechnungsempfaenger = dbo.KHKKontokorrent.Kto)
AND ISNULL(KHKKontokorrent_RE.Rechnungsempfaenger, '') <> KHKKontokorrent_RE.Kto))
AND (dbo.KHKKontokorrent.Kto NOT IN
(SELECT Kto
FROM dbo.KHKVWProtokollDetail
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (Kto = dbo.KHKKontokorrent.Kto)))
AND (dbo.KHKKontokorrent.Kto NOT IN
(SELECT Kto
FROM dbo.KHKKontenumsatz
WHERE (Mandant = dbo.KHKKontokorrent.Mandant) AND (Kto = dbo.KHKKontokorrent.Kto) AND (KtoTyp = 1)))
Falls die zugehörigen Adressdatensätze auf inaktiv gesetzt werden sollen, könnte man dies auf Basis der Abfrage vorher machen.
Falls die zugehörigen Adressdatensätze gelöscht werden sollen, würde ich diese vor dem Löschen z.B. über ein benutzerdefiniertes Feld kennzeichnen und beim Löschen der Adressdatensätze würde ich zusätzlich abfragen, ob die Adresse noch in Adressverweisen oder in Offenen Posten (KHKOpHauptsatz) referenziert ist und in diesem Fall die Adresse nicht löschen.
Der Löschvorgang müsste zweimal durchlaufen werden, da ich in dem Skript prüfe, ob das Konto als abweichender Rechnungsempfänger hinterlegt ist. Wenn das Konto mit dem abweichenden Rechnungsempfänger im ersten Durchlauf gelöscht wird, kann der abweichende Rechnungsempfänger im zweiten Durchlauf gelöscht werden, falls es keine weiteren Referenzen gibt.