Neuigkeiten:

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

Mobiles Hauptmenü

Löschen von in Kombo-/Listenfeld ausgewählten Datensätzen

Begonnen von Paule, September 23, 2016, 21:39:13

⏪ vorheriges - nächstes ⏩

Paule

Hallo,
ich habe eine Tabelle CF_InstallmentsT, in der alle Raten mit:
-InstallmentID (ID)
-SalesID_FK (FK zu verbundenen Verkauf)
-InstallmentDate (Datum)
-InstallmentSum (Summe)
-Notes (Kommentar)

gespeichert sind.

Ich möchte nun ab und zu bestimmte Raten löschen.

Dazu habe ich mir ein Formular gemacht.
Erst wähle ich die SalesID in einem Kombinationsfeld aus um mir dann alle RatenID's, Ratenzeitpunkte und Ratensummen in einem Listenfeld anzugeben.
Anschließend wähle ich eine Rate aus und klicke auf den Button.
Dieser hat folgenden Code beim Ereignis Beim Klicken:

Private Sub Befehl14_Click()
    Dim db As DAO.Database

     Dim lngInstallmentID As Long

     Dim strSQL As String

     Set db = CurrentDb

     lngInstallmentID = Me!lstInstallments

     strSQL = "DELETE FROM CF_InstallmentsT WHERE InstallmentID = " & lngInstallmentID

     db.Execute strSQL

     Set db = Nothing
End Sub


Wähle ich nun eine SalesID und eine entsprechende Rate aus und drücke auf dem Button, kommt die Fehlermeldung "Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert". Was mache ich denn falsch?

Wäre sehr dankbar für eure Hilfen!

Viele Grüße!

DF6GL

Hallo,

wenn
Dim db As DAO.Database
markiert wird, dann fehlt der Verweis auf die DAO3.6-Library


VBA-Editor/Extras/Verweise

MaggieMay

Hi,
Zitat von: DF6GL am September 23, 2016, 22:15:38
dann fehlt der Verweis auf die DAO3.6-Library
abhängig von der eingesetzten Office-Version dürfte das bspw. auch die "Microsoft Office 14.0 Access database engine Object Library" (acedao.dll) sein.

Die DAO360.DLL stammt IMHO aus Office 2003 und sollte eigentlich nicht mehr benötigt werden.
Freundliche Grüße
MaggieMay

Paule

Hallo ihr beiden.
Danke für eure Hilfe.
Ich verwende Access 2013.
Unter dem VBA Editor --> Extras --> Verweise ist bisher nur:
- Visual Basic for Applications
- Microsoft Access 15.0 Object Library
- OLE Automation
angekreuzt.

Ich habe jetzt noch die Microsoft Office 15.0 Access database engine Object Library hochgeladen.
Die DAO3.6-Library gibts bei mir in der Liste nicht (zumindest nicht unter diesem Namen).
So hat es zumindest funktioniert! Vielen Dank!

Gibt es jetzt eine Möglichkeit, mehrere Datensätze gleichzeitig auszuwählen und mit Klick auf dem Button löschen zu lassen?
Über das Listenfeld und Gestaltung der Abfrage könnte ich mir alle Datensätze anzeigen lassen, die ich löschen möchte, also nicht nur einzelne aus der Liste.
Dann müsste nur noch alles "markiert" werden und dann Klick auf den Button.
Ist so etwas umzusetzen?

MaggieMay

#4
Zitat von: Paule am September 24, 2016, 07:28:43Die DAO3.6-Library gibts bei mir in der Liste nicht
Wie gesagt, diese Datei stammt aus älteren Office-Versionen.

ZitatGibt es jetzt eine Möglichkeit, mehrere Datensätze gleichzeitig auszuwählen und mit Klick auf dem Button löschen zu lassen?
Dazu kannst du ein Listenfeld mit Mehrfachauswahl einsetzen.
Wie man damit umgeht, lässt sich in der Access-Hilfe finden (-> ItemsSelected, ItemData, ...).

Im SQL-Code würde die Werteliste dann mittels IN(...) abgefragt werden können.
Freundliche Grüße
MaggieMay

Paule

#5
Hallo MaggieMay,
Danke für den Hinweis. Ich habe nun die Eigenschaft Mehrfachauswahl beim Listenfeld gefunden und auf "Erweitert" gestellt, da mir das am ehesten passt.
Ich habe anschließend mehrere Datensätze ausgewählt und habe auf dem Button geklickt, der oben genannten Code als Ereignisprozedur beim Klicken hinterlegt hat.
Anschließend wurde ein Laufzeitfehler 94 (Unzulässige Verwendung von Null) angezeigt. Im VBA Editor sieht man dann foglende Code-Zeile gelb markiert:
lngInstallmentID = Me!lstInstallments.

Nach Recherche im Internet bin ich auf folgendes gestoßen:
ZitatZudem ist der Wert des Listenfeld-Steuerelements immer Null, wenn die MultiSelect-Eigenschaft auf Erweitert oder Einfach festgelegt ist.

Das beduetet, das Listenfeld bekommt den Wert Null automatisch durch die getroffene Multiselect-Eigenschaft.
InstallmentID ist ein Long Integer vom Felddatentyp. Beißt sich das irgendwie mit "null"?

Wäre für einen Hinweis dankbar.

DF6GL

Hallo,

wie lautet denn die Datensatzherkunft des Listenfeldes?

Ansonsten stelle die Multiselect-Eigenschaft zunächst der Einfachheit halber auf einzeln zurück (dann kann nur ein Eintrag gewählt werden) und schreibe so:


lngInstallmentID = nz(Me!lstInstallments.Column(0),0)

Paule

Hallo Franz,

die Datensatzherkunft das Listenfelds ist:
SELECT CF_InstallmentsT.InstallmentID, CF_InstallmentsT.ReferingSale, CF_InstallmentsT.InstallmentDate, CF_InstallmentsT.InstallmentSum, CF_InstallmentsT.Notes
FROM SA_Retakes RIGHT JOIN CF_InstallmentsT ON SA_Retakes.SalesID = CF_InstallmentsT.ReferingSale
WHERE (((CF_InstallmentsT.InstallmentDate)>[SA_Retakes].[RetakeDate]));


Falls es eine Möglichkeit gibt, "Erweitert" zu benutzen, wäre das super. Weil ich tlws. ca. 20-25 DS auf einmal löschen muss. Aber wenn es nicht anders geht ist alles besser, als nichts. :)

So wird auf jeden Fall etwas rausgelöscht bei Klick auf dem Button.
Allerdings nur ein Datensatz und nicht alle markierten.

MaggieMay

Hallo Paule!
Zitat von: Paule am September 25, 2016, 10:26:54
Wäre für einen Hinweis dankbar.
Sorry, aber ich hatte dir bereits den Hinweis gegeben, dass du dich bzgl. des Umgangs mit einem Listenfeld mit Mehrfachauswahl vertrauensvoll an die Access-Hilfe wenden solltest. Die genannten Stichworte sollten dabei hilfreich sein. Der Einstieg wäre wie üblich per F1-Taste aus der markierten Listbox-Eigenschaft "Mehrfachauswahl" (-> Elemente des Listbox-Objekts -> ItemsSelected etc.) zu finden.

Das Lesen und Ausprobieren kann dir keiner abnehmen. Mit konkreten Fragen oder Problemen kannst du dich dann gern wieder an uns wenden.

PS:
Welche Access-Version setzt du ein?
Freundliche Grüße
MaggieMay

Paule

Hallo MaggieMay. Die Access-Hilfe war mir leider nicht wirklich behilflich. Ich habe sonst nochmal rumgeschaut und bin auf folgenden Code gestoßen, den ich entsprechend angepasst habe an mein Beispiel.

Private Sub Befehl14_Click()
   
     
Dim lngInstallmentID As Long
     
     With Me!lstInstallments
     For lngInstallmentID = 0 To .ListCount - 1
            Debug.Print lngInstallmentID, .Selected(lngInstallmentID), .ItemsSelected.Count;
            If .Selected(lngInstallmentID) Then .RemoveItem lngInstallmentID
            Debug.Print "->" & .ItemsSelected.Count
      Next lngInstallmentID
     End With
End Sub


Da markiert er mir den Teil
RemoveItem

Und gibt den Laufzeitfehler 6014: Die Herkunftstyp-Eigenschaft muss auf "Wertliste" festgelegt sein, um diese Methode verwenden zu können.

Das Problem ist wohl, dass ich nur die Datensatzherkunft verwende und keine Wertliste im Listenfeld. Könnte man RemoveItem auch für die Datensatzherkunft verwenden?

Paule

Ok. Ich habe das Ganze jetzt so gelöst:

Private Sub Befehl14_Click()
     Dim LbElem As Variant
     Dim SelInstID As Long
     
     If Me.lstInstallments.ItemsSelected.Count = 0 Then
        MsgBox "Please Choose Installments to delete", _
                vbInformation, Me.Caption
        Exit Sub
    End If
   
     For Each LbElem In Me!lstInstallments.ItemsSelected
     
     SelInstID = Me!lstInstallments.Column(0, LbElem)
     CurrentDb.Execute "DELETE FROM CF_InstallmentsT WHERE " & _
                          "[InstallmentID]=" & Str(SelInstID)
    Next LbElem
   
    Me!lstInstallments.Requery
End Sub