Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Code für Zeile löschen

Begonnen von nils-demain, Dezember 19, 2011, 10:09:59

⏪ vorheriges - nächstes ⏩

nils-demain

Hallo,

ich bräuchte Hilfe und zwar hätte ich gerne ein Code, der mir eine Zeile löscht sobald in der Spalte ("Obergrenze") gleiche Werte aufeinander folgen. Der erste Werte soll aber nicht gelöscht werden.
Insgesamt hab ich 4 Spalten (Normrechtwert,Normhochwert, Obergrenze und Untergrenze)
z.B.:

"Obergrenze"
0
3
6
17 <-- Zeile nicht löschen
17 <-- Zeile löschen
17 <-- Zeile löschne
60
0
4
6<-- Zeile nicht löschen
6 <-- Zeile löschen
56
89
0
3
27






Ich freu mich schon auf Vorschläge :)

DF6GL

Hallo,


betrifft "gleiche Werte" das nur die Spalte "Obergrenze" oder auch die restlichen Spalten?



Was ist dabei  der "erste Datensatz"?


Vermutlich hilft hier der Assistent zur Duplikatssuche.


Eine mögliche Lösung für das automatische "Löschen":


Erstell eine neue Tabelle und leg über alle betroffenen Spalten (die ein Duplikat bestimmen) einen zusammengesetzten eindeutigen Index.  Mittels Anfügeabfrage werden die Daten übertragen.  Mehrfach vorkommende Datensätze (mit gleichen Werten in den betrachteten Spalten ) werden dabei nicht übernommen.

nils-demian

Hei,

es können in allen 4 Spalten Werte mehrfach und aufeinander folgend auftreten. Zum Beispiel kann die 18 vielleicht 100mal in der Spalte "Obergrenze" vorkommen, die 18 soll aber nur gelöscht werden, wenn zwei oder mehr 18er aufeinander folgen. Über Duplikate geht da glaub ich nix.
Hier noch mal ein Beispiel mit den Spalten "Oberkgrenze" und "Untergrenze":

Obergrenze Untegrenze
2                 6  
6                 18
18               22 <-- nicht löschen
18               22  <-- Zeile löschen, weil 18 auf 18 folgt
78               90
0                 9
18               44 <-- 18 taucht erneut auf
44               77
44               77 <-- 44 löschen. weil 44 auf 44 folgt


Gruß
Nils

nils-demian

Zitat von: nils-demian am Dezember 19, 2011, 11:20:54
Hei,

es können in allen 4 Spalten Werte mehrfach und aufeinander folgend auftreten. Zum Beispiel kann die 18 vielleicht 100mal in der Spalte "Obergrenze" vorkommen, die 18 soll aber nur gelöscht werden, wenn zwei oder mehr 18er aufeinander folgen. Über Duplikate geht da glaub ich nix.
Hier noch mal ein Beispiel mit den Spalten "Obergrenze" und "Untergrenze":

Obergrenze Untegrenze
2                 6  
6                 18
18               22 <-- nicht löschen
18               22  <-- Zeile löschen, weil 18 auf 18 folgt
78               90
0                 9
18               44 <-- 18 taucht erneut auf, aber nicht löschen, weil keine 18 vorweg
44               77
44               77 <-- Zeile löschen. weil 44 auf 44 folgt


Gruß
Nils

Jonny

Hallo Nils,
man könnte eine kleine VBA-Routine entwickeln.
Mein Probelm dabei ist aber:
- wie willst du sicherstellen das die Reihenfolge der DS hundertprozentig richtig ist.

Gruß

Johann

nils-demian

Hallo Johann,

wenn eine ObjektID - Spalte (1,2.3.....)hilfreich ist kann ich die noch hinzufügen.
Aktuell stimmt die Reihenfolge.
Der Datensatz soll mit dem löschen der überflüssigen Zeilen eigentlich nur noch "entbereinigt" werden.

puuh..  :D

nils-demain


Hei,

ich habe noch mal das Datenblatt hinzugefügt:





Gruß

Nils

DF6GL

Hallo,


entweder Du siehst das Ganze falsch oder ich verstehe nicht das Ziel des Unterfangens.

Eine "Reihenfolge" nach Deinem Sinn gibt es nicht in einer DB...  Wenn in mehreren DS jeweils alle Felder (Spalten) den selben Wert enthalten, sind diese DS gleichwertig und demzufolge Duplikate, egal wo sie in der Anzeige-Liste stehen.  Mit Hilfe einer Abfrage sind dann die Datensätze in irgendeine gewünschte Reihenfolge sortierbar.


Wenn die "Endbereinigung" darauf abzielt, keine Mehrfach-Datensätze mehr in der Tabelle zu haben , dann habe ich Dir die Lösung bereits erzählt.


nils-demain


Hallo,

dein Vorschlag hat doch zum Ergebnis, dass jeder Wert nur noch einmal in der Spalte "Oberkante" enthalten ist - was ich ja nicht will.
"Reihenfolge" bedeutet für mich das bei Zeile 1 beginnend über 2...bis zur letzten Zeile alles abgearbeitet wird (wie bei EXCEL) und auf dem Weg quasi von oben nach unten die doppelten entfernt werden. Eigentlich ganz einfach, aber leider geht das was ich mir vorgestellt habe anscheinend nicht - dafür ist mir aber auch das Wesen einer DB zu fremd...


Gruß

Nils

Stapi

Hallo Nils

Ich versuche gerade dein Vorhaben zu verstehen.
Die daten werden aus einer Meßstation in eine tabelle eingelesen, nun ist es dein Ziel die Daten zu bearbeiten. somit dopelte aufeinander folgende Datensätze in der Spalte "Obergrenze" zu löschen.
Das wirst du nun per VBA umsetzen können, per Schleife jeden Datensatz mit dem obrigen zu vergleichen und bei gleichen Wert ihn zu löschen.

Gruß stefan
Grüße aus dem schönen NRW
Stefan

ebs17

Primär sollte man sich von dem folgenden Satz leiten lassen: Müll, den man nicht erzeugt, muss man nicht beseitigen.
Wenn ich also in einer Tabelle keine Duplikate will, lasse ich sie nicht zu. Das erreicht man zum einen und absolut funktionssicher, wenn man auf die betreffenden Felder einen eindeutigen Index legt.
Um Schlüsselfehler und deren Meldungen zu vermeiden, würde man zusätzlich vor bzw. bei dem Einfügen prüfen, ob betreffende Schlüssel schon in der Tabelle vorhanden sind, z.B. im Rahmen einer Anfügeabfrage mit einer Inkonsistenzprüfung.

Zur aktuellen Situation: Bei der gezeigten Datenlage genügt ein einfaches DISTINCT, um Duplikate auszublenden:
SELECT DISTINCT Obergrenze, Untegrenze
FROM AlteTabelle


Falls das einmalig nachhaltig in der Tabelle erfolgen soll, kann man die obige Abfrage zu einer Tabellenerstellungsabfrage erweitern:
SELECT DISTINCT Obergrenze, Untegrenze INTO NeueTabelle
FROM AlteTabelle

Nach dem Löschen der Ausgangstabelle und dem Umbennen der neuerstellten Tabelle würde man dann ein Autowertfeld als Primary Key (eine ID braucht man stets und ständig) und den schon genannten eindeutigen Index zur Vermeidung künftiger Duplikate ergänzen.

MfGA
ebs

nils-demain

Hallo ebs17,

die Daten werden in dieser Form aus einer anderen Datenbank exportiert.
Ich muss die Daten quasi jede mal so nehmen, wie sie sind.

Den Code hab ich ausgeführt (Abfrage erstellt - SQL Ansicht - Code eingefügt - Tabelle erstellen) leider bekomm ich da ne Fehlermeldung (Die Abfrage muss auf mindestens einer Tabelle oder Abfrage basieren)

(s. Abbildung)



Muss ich für AlteTabelle meinen Tabellennamen (BISExportSD) noch einfügen?


Ich bin froh über die Ausdauer der User hier im Forum, hab irgendwie das Gefühl euch so richtig auf die Nerven zu gehen  ;D

Nils

MzKlMu

Hallo,
vor From fehlt ein Leerzeichen. Ist mir jetzt mal auf die Schnelle aufgefallen.
Gruß Klaus

ebs17

Selbstverständlich musst Du Deine eigenen Bezeichnungen verwenden und auch die Feldliste vervollständigen - ich nahm nur zwei Felder. Wenn es da aber noch eine Menge weiterer Felder gibt dann mit ungleichen Werten, würde die Simpel-Lösung mit DISTINCT scheitern und es wäre eine etwas umfangreichere Abfrage notwendig.

ZitatIch muss die Daten quasi jede mal so nehmen, wie sie sind.
Wenn Du diese Aussage ernst nimmst, dürftest Du auch keine Duplikate löschen.

Ernsthaft: Der exportierenden DB ist es egal, was Du mit abgegebenen Daten machst, und in meiner DB, wo ich Daten verarbeiten muss, zurre ich mir die Daten so zurecht, dass sie sinnvoll, einfach und schnell zu bearbeiten sind - und das heißt dann bei umfangreicheren nachfolgenden Maßnahmen nicht Import von unnormalisierten Tabellen, sondern Import von Daten in mein geplantes Datenmodell. Vorher ließe ich mir noch die Frage beantworten, warum der Export nicht genau so ist, wie ich ihn in der Verarbeitung brauche.

MfGA
ebs