0

Doppelte Datensätze löschen

Moin, ich habe ein Tabelle "Material", wo ich alle Doppelten Datensätze löshen möchte. Dabei darf der Datensatz nicht gelöscht werden wenn das Feld "Nummer" mit x,y oder z anfängt. Momentan sind 10000 Einträge in der Datenbank und ich bekomme es nicht so schön hin. Das ist mein Code momentan.

do as server
for i in select Material where Herstellernummer != null do
let h := i.Herstellernummer;
let t := false;
let l := last(select Material where Herstellernummer = h);
let e := first(select Material where Herstellernummer = h);
let a := l.Nummer;
let b := lower(item(split(a, ""), 0));
let ea := e.Nummer;
let eb := lower(item(split(b, ""), 0));
if contains(b, "x") or contains(b, "y") or contains(b, "z") then
if l.Nr != e.Nr then delete e end
else
if contains(eb, "x") or contains(eb, "y") or contains(eb, "z") then
if l.Nr != e.Nr then delete l end
else
if l.Nr != e.Nr then
if number(l.'LetzteÄnderung') > number(e.'LetzteÄnderung') then
delete e
else
if number(l.'LetzteÄnderung') < number(e.'LetzteÄnderung') then
delete l
end
end
end
end
end
end
end

5 Antworten

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Lorenz

    ---

    for i select Material do

    delete select Material where Herstellernummer=i.Herstellnummer and Nummer=i.Nummer and Nr!=i.Nr and not(contains(xyz,lower(substring(Nummer,0,1))))

    end

    ---

    Leo

    • Lamping & Reisig Gmbh & Co.KG
    • LuRLorenz
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Und welcher von den beiden Datensätzen wird dann gelöscht?

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    der letzte

    • Lamping & Reisig Gmbh & Co.KG
    • LuRLorenz
    • vor 4 Jahren
    • Gemeldet - anzeigen

    do as server
    for i in select Material where cnt(select Material where Herstellernummer = this.Herstellernummer) do
    let h := i.Herstellernummer;
    let h2 := item(split(h, ""), 0);
    if contains(h, "?") = false then
    if cnt(select Material where Herstellernummer = h) > 1 then
    let t := false;
    let l := last(select Material where Herstellernummer = h);
    let e := first(select Material where Herstellernummer = h);
    let a := l.Nummer;
    let b := lower(item(split(a, ""), 0));
    let ea := e.Nummer;
    let eb := lower(item(split(b, ""), 0));
    if contains(b, "x") or contains(b, "y") or contains(b, "z") then
    if l.Nr != e.Nr then delete e end
    else
    if contains(eb, "x") or contains(eb, "y") or contains(eb, "z") then
    if l.Nr != e.Nr then delete l end
    else
    if l.Nr != e.Nr then
    if number(l.'LetzteÄnderung') > number(e.'LetzteÄnderung') then
    delete e
    else
    if number(l.'LetzteÄnderung') < number(e.'LetzteÄnderung') then
    delete l
    end
    end
    end
    end
    end
    end
    end
    end
    end

     

    Okay die Daten werden importiert und dabei auch das Feld letzte Änderung. Und das Feld was älter ist soll gelöscht werden

    Hab nur Angst, dass er was falsches löscht. Sollte eigentlich klappen oder?

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Also, du bist in der Tabelle Hersteller und hast dort die Untertabelle Material und möchtest älter doppelte Einträge löschen, dabei die mit x, y oder z am Anfang der Nummer sollten bleiben. Dann wäre die Formel dazu:

    ---

    for i in Material order by now() - 'Zuletzt geändert am' do
    delete Material [Nummer=i.Nummer and Nr!=i.Nr and not(contains("xyz",lower(substring(Nummer,0,1))))
    end

    ---

    Mach doch eine Copie der Datenbank und probiere dort.

     

    Leo