Kunden löschen

KMoeser

Aktives Mitglied
Teammitglied
Im Standard gibt´s ja das "Artikel löschen".
1711099060974.png

Hat jemand "aus der Schublade" für "Kunden löschen" eine Lösung greifbar?

Auf Basis eines Kennzeichen im Kundenstamm soll dabei das Programm die entsprechenden Kunden löschen.

Dabei ist schon klar, dass nicht immer gelöscht werden kann.
Sind zB Umsätze vorhanden, soll das entsprechend nur auf dem Protokoll vermerkt werden (wie wenn Artikel zB wegen Bestand nicht gelöscht wurden)
 
Nur als SQL-Skript auf Datenbankebene (wenn es um die Kontokorrentdatensätze geht), mit Validierung auf Verwendung, jedoch ohne Protokoll.
 
Hi diakh

habt Ihr das auch schon mit Artikeln gemacht ?
Die Schnelländerung bricht immer ab, sobald ein Artikel in Belegen oder Inventuren etc. enthalten ist.
Die nachfolgenden Artikel versucht das Programm gar nicht mehr zu löschen. (zumindest war das in den älteren Version 9.0.x- Versionen so)

Mein Ansatz wäre erst bei den Artikeln ein Kennzeichen setzen "löschbar" - und dann die Schnelländerung "Artikel löschen" mit Filterung auf dieses Kennzeichen ausführen. Dazu bräuchte ich aber die exakten Kriterien für die Löschbarkeit.

habt ihr ein Skript, in dem diese Kriterien auftauchen ?
 
Habe ich noch nicht gemacht, wäre aber relativ einfach umsetzbar.
Die Prüfung erfolgt über den Trigger "TRD_Artikel" der Tabelle "KHKArtikel". Dort sind also auch die Kriterien hinterlegt.
Du kannst also die löschbaren Artikel einfach über die Selektion mit Abfrage der einzelnen Kriterien per Unterabfragen ermitteln und darüber das Kennzeichen setzen.
 
Mit Artikeln hatte das beim Kunden geklappt.
Dabei muss ich aber sagen, es ist eine Migration auf die Sage100 - also noch fast leer - und den Artikel hatten wir vorher einen Erlöscode "Löschbar" zugeordnet.
Dann lief das ganz gut durch.

Script für Kunden wäre recht interessant.
Habt ihr da nur den Kontookorrent gelöscht, oder auch die Adresse gleich mit?
 
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.
 
Zurück
Oben