PDA

Vollständige Version anzeigen : aus listenfeld mehrere einträge gleichzeitig löschen


jackryan
05.07.2006, 10:57
hallo zusammen

kleines prob hätte ich

ich habe mir auf einem formular ein listfeld gefüllt und habe in den eigenschaften "mehrfachauswahl->erweitert" aktiviert.

ich möchte mehrere einträge markieren und dann zusammen löschen.

wenn ich es so mache,

Dim varZeile As Variant
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("TypenWartung")

For Each varZeile In Me!Liste1.ItemsSelected
rs.Delete
Next varZeile
rs.Close
Set rs = Nothing
Form_Fahrzeugwartungbearbeiten.Refresh

mault access und sagt laufzeitfehler 3167 und datensatz ist gelöscht.
stimmt aber nicht es wurde kein ds gelöscht.

markiere ich nur einen, wird der anstandslos gelöscht.
ausserdem hätte ich es auch gerne, das der gelöschte ds direkt aus dem listfeld verschwindet. mein refresh funzt da auch nicht so richtig^^


danke schonmal für die hilfe

J_Eilers
05.07.2006, 11:21
Hi,

ich würds so machen:

Dim strSQL As String
Dim var As Variant

For Each var In Me!Liste1.ItemsSelected
strSQL = "DELETE * FROM TypenWartung WHERE IDFeld = " & Me!Liste1.ItemData(var)
DBEngine(0)(0).Execute strSQL, dbFailOnError
Next var

Me!Liste1.Requery

Anne Berg
05.07.2006, 11:31
Vielleicht noch eine Erklärung dazu: ;)
In deinem Code wird ein x-beliebiger (bzw. der erste) Datensatz im Recordset gelöscht - und bei Mehrfachauswahl immer wieder! :D
Letzteres führt natürlich zu einem Fehler, weil du ja im Recordset nicht "weiterwanderst" sondern nur im Listenfeld, aber du nutzt ja auch gar nicht das ausgewählte Item zur Datensatzfindung...

jackryan
05.07.2006, 11:51
ehh klasse ihr habt mir schon die lösung des nächsten problem geliefert ohne das ihr es gekannt habt^^

folgendes passiert: es wir alles gelöscht, also nicht nur die markierten einträge sondern alle im listfeld vorhandenen daten. das wollte ich allerdings erst im nächsten schritt machen.

hm woran liegt es aber??

Anne Berg
05.07.2006, 11:59
Zeig mal deinen Code, der Vorschlag von Jan sollte eigentlich funktionieren.

jackryan
05.07.2006, 12:04
klar doch, aber ich zeige dir m besten erstmal das sql statement mit dem ich das listfeld fülle:

abfrage = "SELECT Typen.TypNr , Typen.TypName,TypenWartung.TypNr , TypenWartung.TNr , Texte.TNr , Texte.Text FROM Typen INNER JOIN (Texte INNER JOIN TypenWartung ON Texte.TNr = TypenWartung.TNr) ON Typen.TypNr = TypenWartung.TypNr WHERE (((Typen.TypNr))) =" & auswahl

so und nun der andere:

Dim strSQL As String
Dim var As Variant

For Each var In Me!Liste1.ItemsSelected
strSQL = "DELETE * FROM TypenWartung WHERE TypNr = " & Me!Liste1.ItemData(var)
DBEngine(0)(0).Execute strSQL, dbFailOnError
Next var

Me!Liste1.Requery


bitte schöööööööön

Anne Berg
05.07.2006, 12:15
Ich kann da keinen Fehler entdecken, genau so sollte es sein. (abgesehen davon, dass im Listenfeld zwei Spalten quasi doppelt, weil identisch sind ;))

Du behauptest also, das Listenfeld ist anschließend leer?


PS: und beim nächsten Mal bitte Code-Tags verwenden!

jackryan
05.07.2006, 12:23
glaubs mir doch bitte bitte nachdem der code ausgeführt wird, ist das listenfeld leer :rolleyes:


ps: welche code tags soll ich denn nutzen^^ :)

J_Eilers
05.07.2006, 12:29
Welches ist denn die gebundene Spalte?

jackryan
05.07.2006, 12:33
die gebundene spalte ist die typnr

J_Eilers
05.07.2006, 13:00
Weist du die Abfrage per VBA zu oder ist das eine gespeicherte Abfrage?

jackryan
05.07.2006, 13:05
ich weisse die abfragen per vba zu (wenn du die von oben meinst)

J_Eilers
05.07.2006, 13:12
Da weiße sie bitte nach dem Löschen erneut zu.

jackryan
05.07.2006, 13:23
gemacht, aber..... keine änderung

ich werde dir am besten das teil mal zukommen lassen (zumindest versuche ich es)

Anne Berg
05.07.2006, 13:27
Ich merke gerade erst, dass das doch so nicht gewollt sein kann:

Das Listenfeld enthält Datensätze zu genau einer TypNr und da kannst du auswählen was du willst, am Ende sind alle Datensätze mit dieser TypNr gelöscht - klar! :D

jackryan
05.07.2006, 13:30
so hier die db

erklärung:

in der testform im kombifeld einen typ wählen danach rechts in dem listfeld den genauen typ wählen und dann auf bearbeiten gehen (sollten keine daten im listfeld der 2. form stehen, einfach schließen und welche in dem großen listfeld auswählen und den ersten button betätigen)

Anne Berg
05.07.2006, 15:54
Ich hab das Formular mal für dich geändert... ;)

jackryan
05.07.2006, 17:49
eh vielen dank für eure bemühungen es funzt so wie ich es wollte^^

(wie das genau funzt ist mir noch nicht so ganz klar, aber egal)

Anne Berg
05.07.2006, 18:31
Das sollte dir aber schon klar sein, was da gemacht wird in deinem Programm!

Wenn du meinen vorletzten Beitrag gelesen hast, solltest du drauf kommen können... :rolleyes:

Wenn du alle Reparaturen zu einem Autotyp auflistest und dann beim Löschen alle Reparaturen zu diesem Typ löschst, musst du dich nicht wundern, wenn sie nachher alle weg sind! ;)

Wenn du einzelne Einträge (den markierten Listfeldzeilen entsprechend) löschen willst, musst du die Teile-Nr. (TNr) mit in den Bedingungsteil einbeziehen - that's all!
Dies geschieht mit folgendem Code:"DELETE * FROM TypenWartung WHERE TypNr = " & Me!Liste1.ItemData(var) & " AND TNr=" & Me!Liste1.Column(1, var)

Das heißt: dein Löschkriterium war zu unspezifisch.

Im übrigen hatte ich das Listenfeld im 1. Form von unnötigem Ballast befreit - nicht dass du dich wunderst.

jackryan
06.07.2006, 07:09
moin moin

ich habe es verstanden, und das mit met listenfeld ist mir aufgefallen

danke dir nochmal für deine geduld und deine hilfe