Office: (Office 2016) Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle

Helfe beim Thema Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich baue eine Datenbank zur Inventarverwaltung. Dabei soll das Inventar in verschiedene Ebenen aufgebaut werden. Die Idee dazu habe... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Snooper, 1. August 2020.

  1. Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle


    Hallo zusammen,

    ich baue eine Datenbank zur Inventarverwaltung. Dabei soll das Inventar in verschiedene Ebenen aufgebaut werden. Die Idee dazu habe ich schon länger. Zuerst hatte ich für jede Ebene eine Tabelle, was zum Problem wurde als ich merkte, das ich in mehrere Tabellen die selben Typen von Daten eingebe (Hersteller Baujahr usw.). Die Lösung meine ich im Aufbau von TreeView gefunden zu haben.
    Da meine VBA Kenntnisse auf unermüdlichem Learning by Doing basieren und ich gehört habe das die Libary sich bei Mircosoft Updates auch gerne mal zerschießt, habe ich mir das mit einer Tabelle tbl_Inventar und einem Formular mit 6 Listenfelder nachgebaut. In der Tabelle sind neben Inv_ID (Schlüsselwert) noch die Spalten Inv_lfdNr, Inv_Bez und Inv_Par.
    Datensätze werden über Buttons unter den Listenfelder erstellt und geändert. Dabei wird beim Erstellen die lfdNr um einen erhöht. Wenn der Datensatz untergeordnet sein soll, wird die lfdNr des übergeordneten Datensatzes in Inv_Par geschrieben. Da das per VBA passiert sollte ein inkonsitenter Zustand verhindert werden können. Angedacht sind 2 weitere Tabellen für Details und Wartungsaufgaben die jeweil über die lfdNr verknüpft werden sollen, und als Unterformular angezeigt werden

    Hat der Aufbau bis hierhin für die Erfahrenderen unter euch Sinn?

    Nun zu meinem Problem:
    Wenn ich einen Datensatz lösche, wollte ich als erstes den Datensatz löschen und danach eine Löschabfrage durchlaufen lassen, die alle Datensätze findet (und löscht) die eine Inv_Par Nummer haben, die als lfdNr gar nicht mehr existiert - also quasi die Child DS des gelöschten. Das ganze wollte ich in einer Schleife so oft wiederholen, bis keine Datensätze mehr gefunden werden. Dadurch wäre es egal auf welcher Ebene ich das Löschen ausführe - ich könnte immer den selben Code benutzen.
    Das Löschen des Datensatzes klappt easy. Bei der Abfrage beiße ich mir die Zähne aus.
    Ich habe reichlich zu Left In xY On XY=asdg mit Vergleich auf Null gelesen. Doch das schient mir nur bei zwei Tabellen zu funktionieren.
    Wahrscheinlich ist auch die Lösung denkbar einfach. Wäre schön wenn mir jemand dieses riesige Brett vor meine Kopf wegnehmen könnte.
    Vllt hat auch noch jemand einen gänzlich anderen Ansatz - Hatte auch schon überlegt sie drin zu lassen. Werden ja nicht mehr gefunden, weil sie nicht mehr aufgerufen werden können... Würde es aber der Ordnung halber mitmachen. Außerdem will ich auch wissen wie das geht...

    Vielen Dank schonmal für jegliche Antworten.
    Datenbank ist noch ohne richtige Datensätze und kann ebenfalls hochgeladen werden. Meine Beschreibung ist glaube ich aber ersteinmal ausreichend

    :)
     
    Snooper, 1. August 2020
    #1
  2. Es ist viel hilfreicher, wenn wir die bisher vorhandene Datenbank einsehen könnten. (ähnlich wie: ein Bild sagt mehr als 1000 Worte) - Also: Zippen und hochladen.
    PS: was verstehst Du unter "verschiedene Ebenen"? ### Welches Inventar welcher Einrichtung soll inventarisiert werden? Das Inventar einer kleinen Firma oder einer Niederlassung eines Großunternehmens?
     
  3. Danke für die Fixe Antwort. Du hast wahrscheinlich recht - ist einfacher.

    Ich habe die Datensätze nochmal entsprechend benannt, damit es noch deutlicher wird

    Das Löschereignis habe ich nur für den Button unter dem Listenfeld 1 eingefügt. alle anderen sind ohne Funktion. Das Aktualisieren im Anschluss an das Löschen fehlt auch noch ;-).
    Bin noch ganz am Anfang - deswegen auch die Frage nach dem Aufbau.

    Edit: Es geht um Maschinen mit Baugruppen und einzelne Geräte. Das soll eher Oberflächlich passieren. Also nicht wie in großen Firmen wo jeder O-Ring eine eigene Nummer bekommt. Es soll später auch mal dazu dienen, die Eingetragenen Maschinen eindeutig zuzuordnen und sich erledigte Wartungsarbeiten und Reparaturen auf einen Klick anzeigen zu lassen. Also was die Tiefe der Ebenen angeht sollen es eher Überschriften sein, als ein Kleinteileverzeichnis
     
    Snooper, 3. August 2020
    #3
  4. Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle

    tbl_Inventarliste hat 3 Felder, deren Sinn sich mir nicht erschließt.
    Kannst Du mal näher erklären, was die Daten im Feld Inv_Par darstellen sollen? Auch die Angaben in Inv_Bez sind (ohne Erläuterung) unverständlich.
    Jetzt erst gelesen:
    Das sieht nach einer Stücklistenverwaltung aus. Such mal im Netz nach diesem Begriff, ich kenne mich mit Datenmodellen einer Stücklistenverwaltung leider nicht aus.
    Sorry, ich finde nur EINE Tabelle.(tbl_Inventarliste)
     
  5. Na klar,

    Das Erste ist der Autowert

    Das zweite ist die laufende Nummer. Beim Erstellen eines neuen Datensatzes wird hier der Max-Wert plus eins eingetragen. Es ist quasi ein händischer Autowert. Jedes Mal wenn man einen Datensatz erzeugt, es dann aber abbricht, hat die Datenbank eine ID vergeben. Die Lücken umgehe ich indem ich die laufende Nummer verwende. Ist für das jetzige Projekt tatsächlich eigentlich unwichtig, habe ich mir aber mal angeeignet...

    Das zweite ist die Bezeichnung. Das mit dem der Benutzer auch was anfangen kann.

    Das dritte ist die Parent Nummer. Das heißt hier steht der Datensatz, dem der neue Datensatz übergeordnet ist. Schaue es dir im Formular an. Jedes Listenfeld zeigt die Einträge an, die im vorherigen Listenfeld ausgeählt wurden. Wobei das erste Listenfeld alle ohne eine Parent ID anzeigt.

    Das Prinzip habe ich wie gesagt gefunden als ich mich zu TreeView schlau gemacht habe...
    https://dbwiki.net/wiki/Access_Bedie..._Anf%C3%A4nger

    Wenn ich nun ein DS lösche, fehlt ja der Bezug zwischen Parend und Child Datensatz. Ich möchte also alle Child Datensätze die keine Parent ID in der lfdNr mehr haben ebenfalls löschen...
     
    Snooper, 3. August 2020
    #5
  6. TreeView ist ein Thema für sich. Will man es nutzen gibt es neben der Lösung, welche Du in dem Link zur DBWiKi aufgezeigt hast eine professionelle Lösung.
    Die ist genial, weil sie ohne ein ActiveX und ohne DLL-Anbindung auskommt.
    Die Demo solltest Du auf jeden Fall ansehen.

    zum Löschproblem:
    Das Listenfeld List_E1 hat eine Datenherkunft mit 3 Spalten: Inv_lfdNr + Inv_Bez + Inv_Par.
    Erst beim Klicken auf einen Listenfeldeintrag darf der Schalter E1_cmd_delete eingeblendet werden.
    Klickt man nach Selektion eines Listenfeldeintrages auf den Schalter muss der Wert in der ersten Spalte des Listenfeldes ermittelt werden.

    Dieser Wert dient als Kriterium zum löschen, allerdings übergibst Du den Wert nicht so, das die Löschabfrage Erfolg hat.
    Korrekt wäre:
    Code:
    ########
    Die anderen Felder (Inv_Bez+Inv_Par) haben beim löschen keine Bedeutung.
    Nachdem diese Löschabfrage durchgeführt ist musst Du nur noch die Datensätze löschen, welche im Feld Inv_Par ebenfalls den Wert 2 ausweisen.
    Code:
    ###############

    Code:
     
  7. Da gibt es auch eine Demo von? Dann werde ich mir die auf jeden Fall einmal ansehen! Vielen Dank für den Link!

    Ich wüsste - unabhängig davon - trotzdem gerne ob mein anliegen machbar ist.

    Gibt es eine Formulierung für eine Abfrage die mir alle Datensätze anzeigt, die eine Nummer in Inv_Par haben, die in Inv_lfdNr nicht existiert?
     
    Snooper, 3. August 2020
    #7
  8. Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle

    Hallo,
    Nicht ganz, wenn Du dazwischen einen Datensatz löschst, hast Du auch bei Deinem Verfahren eine Lücke.
     
    gpswanderer, 3. August 2020
    #8
  9. Ist doch gar nicht mehr nötig, wenn die 1. Löschabfrage erledigt ist. Diese Abfrage kümmert sich nicht darum, ob im Feld Inv_Par etwas steht oder nicht...
    PS: Die Demo gefunden und heruntergeladen? Dann sorgfältig durcharbeiten und alles austesten. Dann kann entschieden werden, ob es für Dein Projekt die Komfort-Lösung darstellt.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
  10. Guten Abend nochmal,

    Ich habe mir deine Lösung angeschaut und ich muss sagen, das ich Sie nicht hätte schreiben können aber zumindest schonmal verstehe.

    Deine Lösung basiert darauf das die lfdNr gelöscht wird und die selbe nummer auch in der Spalte Inv_Par auftaucht. Stimmt? Diese DS werden dann auch gelöscht.

    Soweit so gut. Dann sind das Zwei Ebenen. Wenn ich in Ebene 1 (also ganz links) löschen drücke, löscht er die DS aus Ebene 1 und 2. Die DS die noch weiter darunter in 3-6 existieren, bleiben.

    Ist es möglich diese auch noch zu löschen?

    Wir haben zwei unterschiedliche Wege zum Ziel - nur das du der mit dem VBA-Wissen bist.

    Um deine Lösung in meinem Sinne zu vervollständigen müsstest du vor dem Löschen in Schritt 2 die Inv_lfrNr auslesen und mit allen Nummern nochmal von vorne beginnen.
    Beispiel am Screenshot:
    Wenn du DS 1 löscht. Muss du vor dem Löschen von DS 4,5,6 die IDs 4,5,6 speichern um dann wieder in Inv_Par danach zu suchen. Dann stellt man fest der DS 4 hat weiter untergeordnete, die auch mit gelöscht werden sollen. Wenn der Baum "ausgewachsen" ist, wird es natürlich noch mehr...

    Da würde ich es übersichtlicher finden, den ersten DS zu löschen und anschließend alle DS zu suchen die in Inv_Par eine Nummer stehen haben die in Inv_lfdNr nicht mehr steht. Diese auch löschen. Dann von vorne - das so lange bis die Abfrage nichts mehr löscht. Dann bin ich sicher das ich alle erwischt habe. Anschließend würde ich das selbe mit den späteren Tabellen für die Wartung und Details machen. Nur das sind wie eingangs erwähnt, zwei Tabellen, dazu gibt es reichlich Codebeispiele...

    Ich bin dir trotzdem für deine Hilfe dankbar! Vllt hast du ja noch einen Moment für mich! Die Demo werde ich auch in jedem Fall probieren...
     
    Snooper, 3. August 2020
    #10
  11. Tut mir leid, aber ich verstehe das alles nicht, was Du löschen möchtest.
     
  12. Guten morgen,

    kann ich verstehen. Es ist auch nicht ganz einfach zu beschreiben.

    Ich habe dir ein Excel Beispielbild gemacht. Ich hoffe es Hilft und verwirrt dich nicht noch mehr.

    In dem Bild sind die Spalten immer die selben. Das heißt eigentlich stehen alle Werte untereinander. Ich habe sie dir hier entsprechend eingerückt damit es visuell auch klarer wird, was ich mit Ebenen meine.

    An dem Ersten Zweig möchte ich deinen Code erklären (?! Das soll nicht unverschämt klingen! - Ich hoffe ich habe ihn richtig verstanden!)
    Du suchst nach der ausgeählten lfdNr in diesem Beispiel den Wert 1 und löscht den DS. Dann suchst du nach der selben Nummer in Inv_Par und löscht diese auch. Im Bild gelb markiert. Nun hatten diese DS eventuell ja auch noch Untergeordnete DS. Und die möchte ich auch noch löschen!
    Man müsste also über die Inv_Par die DS finden und dann die Inv_lfdNr auslesen, um eventuell weitere, untergeordnete DS zu finden und zu löschen...

    Bei der Methode die ich mir gedacht habe, lösche ich einen DS - hier mit der Nummer 2 (ebenfalls gelb). Das läuft auch schon so. Und nun würde ich über eine Abfrage alle Inv_lfdNr löschen deren Wert in Inv_Par einem Wert entspricht, den es in Inv_lfdNr nicht mehr gibt. Also in Ebene 2 wären das die DS 10, 12, 13 und 14 (grün) weil sie eine Nummer in Inv_Par haben die in Inv_lfdNr nicht mehr gibt, weil eingangs gelöscht. Das würde ich solange machen bis die Löschabfrage keine DS mehr findet - der Dritte durchgang würde als DS 11, 15,16, 17 finden (braun). So erspare ich mir das auslesen der DS nummer und die Suche nach allen zugehörigen DS...

    Vltt hat dich auch folgendes Verwirrt: In der DB die ich hochgeladen habe ist in der Abfrage zum Listenfeld 1 ein Fehler: Das Listenfeld sollte nur mit Werten gefüllt werden die in Inv_Par nichts stehen haben.
    Weiterhin habe ich nicht alle 6 Ebenen gefüllt. Ich dachte wenn die funktionalität gegeben ist, reichen zu verdeutlichung auch 3... Die Bediener könnten aber nachher DS mit 5 Übergeordneten DS erstellen. Dafür ja auch die 6 Listenfelder...

    Ich hoffe es ist verständlicher geworden, und viele Dank für die Gedult mit mir ;-)

    P.S: Muss nun auf Arbeit; Schaue heute Abend nochmal rein
     
    Snooper, 3. August 2020
    #12
  13. Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle

    Dein Anliegen ist wie folgt zu verstehen?

    Eine Maschine entfällt (und wäre zu löschen).
    In Verbindung damit wären auch alle enthaltenen Baugruppen, Bauteile, Einzelstücke, Standardteile usw. auch zu entfernen, also alles, was jeweils über die Parent-ID auf genau diese Maschine zurückzuführen ist.

    Für die Verarbeitung solcher Hierarchieaufgaben ist Rekursion notwendig, etwas, was Jet-(Access-)SQL nicht kann.

    Etwas in Schleife löschen, was es nicht (mehr) gibt, ist ein etwas unglücklicher Ansatz. Da könnte es Überraschungen geben.

    In solch einem Aufgabengebiet habe ich noch nicht gearbeitet, aber ich würde mir von der originalen Tabelle eine temporäre Tabelle ableiten, mit der ich dann einfach und umfassend arbeiten kann. Mit dieser Tabelle ist dann die Rekursion vorab erledigt.
    In der beigefügten Demo habe ich eine Hilfstabelle tmpT_H erstellt, die pro Datensatz den vollständigen Hierarchiebaum darstellt. Die Erstellung einer solchen Tabelle würde sich in eine Prozedur fassen lassen.
    So etwas könnte man schon nutzen, um ein Treeview zu erstellen, statt per FindFirst im Recordset suchen zu müssen.
    Für Datenoperationen über alles hätte man dann auch ein praktisches Hilfsmittel, wie auch für ein unmittelbares verständlicheres Visualisieren in Tabellenform.
     
  14. Hallo Ebst17,

    Um die temporäre Tabelle richtig zu verstehen: hast du in der ersten Spalte nach der Bezeichnung die Anzahl der Tiefe stehen, dann jeweils alle Par Id - falls es welche gibt, als letztes die eigene ID.
    Was meinst du mit ableiten? Hast du meine Tabelle abgeleitet und würdest damit arbeiten, oder würdest du eine solche Tabelle jedes mal erstellen -> "temporär" um die Löschabfrage durchzuführen?

    Ich denke während ich hier schreibe macht es wohl Sinn das du mit der Tabelle arbeitest die du erstellt hast...
    Einen neuen Datensatz einfügen - wie müsste die Prozedur aussehen?
    Ich kopiere die Werte des ausgewählten Datensatzes addiere in der "Ersten Spalte" +1 und hänge die eigene ID in der letzten freien Spalte dran?

    Ich danke euch für eure Hilfe und euren Input, ich werde mir das alles mal anschauen!
    Das mit der Löschabfrage - so wie ich es mir dachte - ist wie du sagtest nicht machbar!
     
    Snooper, 4. August 2020
    #14
  15. Ja. Da SQL spaltenorientiert arbeitet, wäre die Ermittlung der Position in der Reihe dort umständlich. Daher hinterlege ich diese Information gleich mit Erstellung der Tabelle, da habe ich sie durch den Prozess in der Hand.
    Ist hier im Fall nicht nötig, aber vielleicht für weitere Verwendungen dieser Tabelle. Auch Hilfstabellen dürfen mehrfach und unterschiedlich genutzt werden, wenn man sie dann schon einmal hat.

    Ja, daher auch eine Prozedur dazu, die das schnell und etwas variabel umsetzen kann. Immerhin ist das ein Berechnungsergebnis aus der originalen Tabelle und sollte vor einer Verwendung die nötige Datenaktualität mitbringen.

    Mit dem Schreiben der Prozedur habe ich angefangen, ich wollte nur abwarten, ob das Sinn (für andere) macht. Dauert noch etwas.
     
Thema:

Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle

Die Seite wird geladen...
  1. Löschabfrage: Löschen von DS ohne Zugehörigkeiten in selbiger Tabelle - Similar Threads - Löschabfrage Löschen Zugehörigkeiten

  2. Schriftart Aptos löschen

    in Sonstiges
    Schriftart Aptos löschen: Guten Morgen, ich habe bei Microsoft 365 Schwierigkeiten mit der Schriftart Aptos (in allen Varianten) und möchte diese Schriftart daher gerne löschen. Unter Win 11 gehe ich auf "Einstellungen"...
  3. Löschabfrage -> nur ein Duplikat entfernen

    in Microsoft Access Hilfe
    Löschabfrage -> nur ein Duplikat entfernen: Hallo zusammen, ich habe eine Löschabfrage erstellt, allerdings werden dabei alle Duplikate entfernt: DELETE IN_V5.IDAlex FROM IN_V5 WHERE IDAlex IN (SELECT IDAlex FROM IN_V5 GROUP BY...
  4. Löschabfrage

    in Microsoft Access Hilfe
    Löschabfrage: Hallo, ich habe sicherlich 150 verschiedene Beiträge zu Löschabfragen gefunden und gelesen. Hat mir aber nicht wirklich geholfen. Ich habe ein Löschabfrage aus 2 Tabellen erstellt und das...
  5. Erstellen und Ausführen einer Löschabfrage

    in Microsoft Access Tutorials
    Erstellen und Ausführen einer Löschabfrage: Erstellen und Ausführen einer Löschabfrage Access für Microsoft 365 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Mehr......
  6. Dubletten/Löschabfrage

    in Microsoft Access Hilfe
    Dubletten/Löschabfrage: Beitrag hat sich erledigt. Vielen Dank.
  7. Löschen von Duplikaten aus zwei Tabellen mihilfe Löschabfrag

    in Microsoft Access Hilfe
    Löschen von Duplikaten aus zwei Tabellen mihilfe Löschabfrag: Hallo zusammen, ich stehe vor der Herausforderungen aus zwei Tabellen (haupttabelle und Nebentabelle), die Datensätze herauszufiltern, welche in beiden enthalten sind und anschliessend in der...
  8. Löschabfrage über mehrere Tabellen

    in Microsoft Access Hilfe
    Löschabfrage über mehrere Tabellen: Hallo zusammen, ich brauche etwas Nachhilfe, da ich in Access recht wenig mache. Ich möchte eine Löschabfrage zwecks Leerung mehrer Tabellen definieren. Bei einer Tabelle klappt das auch. Wenn...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden