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!
Hallo,
wenn
Dim db As DAO.Database
markiert wird, dann fehlt der Verweis auf die DAO3.6-Library
VBA-Editor/Extras/Verweise
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.
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?
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.
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.
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)
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.
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?
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?
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