Discussion:
Datensatz über Schaltfläche löschen
(zu alt für eine Antwort)
s***@web.de
2005-08-16 19:47:47 UTC
Permalink
Hallo,

ich habe eine Tabelle (AutoWert plus ein paar weitere Felder) als
Unterformular in ein Formular eingebunden. Ich möchte nun, dass der
Benutzer einen mit der Maus markierten Datensatz über eine
Schaltfläche löschen kann, so als würde man die "Entf"-Taste
drücken.
Wenn ich der Schaltfläche die Aktion "Datensatz löschen" zuordne,
wird jedoch nichts gelöscht. Gerne hätte ich auch den VBA-Code für
die korrekte Löschaktion.
Danke!
Gunter Avenius
2005-08-16 20:16:15 UTC
Permalink
Post by s***@web.de
ich habe eine Tabelle (AutoWert plus ein paar weitere Felder) als
Unterformular in ein Formular eingebunden. Ich möchte nun, dass der
Benutzer einen mit der Maus markierten Datensatz über eine
Schaltfläche löschen kann, so als würde man die "Entf"-Taste
drücken.
Wenn ich der Schaltfläche die Aktion "Datensatz löschen" zuordne,
wird jedoch nichts gelöscht. Gerne hätte ich auch den VBA-Code für
die korrekte Löschaktion.
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdDeleteRecord
--
Gruß
Gunter
_________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com
Sebastian Hartwig
2005-08-17 07:30:33 UTC
Permalink
Hallo,
ich habe jetzt folgenden Code:

Private Sub Befehl2_Click()

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdDeleteRecord
End Sub

Nach Auswahl eines Datensatzes und Anklicken der Schaltfläche
"Befehl2" bekomme ich folgende Fehlermeldung:
"Laufzeitfehler 2046- Der Befehl oder die Aktion DatensatzLöschen
steht momentan nicht zur Verfügung."

Danke für die Hilfe,
Sebastian
Henry Habermacher [MVP Access]
2005-08-17 04:27:02 UTC
Permalink
Hallo seb

Bitte verwende hier den Realnamen, Danke
Post by s***@web.de
ich habe eine Tabelle (AutoWert plus ein paar weitere Felder) als
Unterformular in ein Formular eingebunden. Ich möchte nun, dass der
Benutzer einen mit der Maus markierten Datensatz über eine
Schaltfläche löschen kann, so als würde man die "Entf"-Taste
drücken.
Wenn ich der Schaltfläche die Aktion "Datensatz löschen" zuordne,
wird jedoch nichts gelöscht. Gerne hätte ich auch den VBA-Code für
die korrekte Löschaktion.
Dim rs as Recordset
set rs = me.recordsetclone
rs.Bookmark = me.bookmark
rs.delete
set rs = nothing

HTH
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Sebastian Hartwig
2005-08-17 07:38:37 UTC
Permalink
Hallo.
Post by Henry Habermacher [MVP Access]
Dim rs as Recordset
set rs = me.recordsetclone
rs.Bookmark = me.bookmark
rs.delete
set rs = nothing
Ich habe jetzt folgenden Code:

Private Sub Befehl3_Click()
Dim rs As Recordset
Set rs = Me.RecordsetClone
rs.Bookmark = Me.Bookmark
rs.Delete
Set rs = Nothing
End Sub

Nach Auswählen des Datensatzes und Anklicken der Schaltfläche
"Befehl3" erhalte ich folgende Fehlermeldung:

Laufzeitfehler 7951-
Sie haben einen Ausdruck eingegeben, der einen unzulässigen Verweis
auf die RecordsetClone-Eigenschaft enthält.

Danke für die Hilfe,
Sebastian

P.S.: Bin auch dankbar für Buchempfehlungen zum Thema Access/VBA
Henry Habermacher [MVP Access]
2005-08-17 08:32:13 UTC
Permalink
Hallo Sebastian
Post by Sebastian Hartwig
Private Sub Befehl3_Click()
Dim rs As Recordset
Set rs = Me.RecordsetClone
rs.Bookmark = Me.Bookmark
rs.Delete
Set rs = Nothing
End Sub
Nach Auswählen des Datensatzes und Anklicken der Schaltfläche
Laufzeitfehler 7951-
Sie haben einen Ausdruck eingegeben, der einen unzulässigen Verweis
auf die RecordsetClone-Eigenschaft enthält.
Was setzt Du ein? Access Version, Backend Version?
ADPs oder MDBs?
Mit MDB/DAO tut das bei unter A2003 mir problemlos. Soeben nochmals
getestet, ob ich mich allenfalls verschrieben habe.
Post by Sebastian Hartwig
P.S.: Bin auch dankbar für Buchempfehlungen zum Thema Access/VBA
Siehe FAQ und Newbie Info, die hier regelmässig gepostet wird.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Josef Poetzl
2005-08-17 08:47:40 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
Private Sub Befehl3_Click()
Dim rs As Recordset
Set rs = Me.RecordsetClone
rs.Bookmark = Me.Bookmark
rs.Delete
Set rs = Nothing
End Sub
Nach Auswählen des Datensatzes und Anklicken der Schaltfläche
Laufzeitfehler 7951-
Sie haben einen Ausdruck eingegeben, der einen unzulässigen Verweis
auf die RecordsetClone-Eigenschaft enthält.
Ein Blick in die Kristallkugel führt zu folgenden Fragestellungen:
Kann es sein, dass Du den Button auf einem ungebundenen Formular
einsetzt?
Im ersten Beitrag schreibst Du: "... einen mit der Maus markierten
Datensatz ...". Befindet sich diese Markierung möglicherweise in einem
Listenfeld oder in einem Unterformular?


mfg
Josef

P.S.
verwende statt "Dim rs As Recordset" lieber "Dim rs As DAO.Recordset"
wenn Du die DAO verwenden willst. (Sonst kann es zu Problemen führen,
falls auch die ADO-Bibliothek in den Verweisen vorhanden ist.
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-17 09:04:19 UTC
Permalink
Hallo Josef,
Post by Josef Poetzl
Kann es sein, dass Du den Button auf einem ungebundenen Formular
einsetzt?
Was ist ein ungebundenes Formular, und welche anderen Möglichkeiten
gibt es?
Post by Josef Poetzl
Befindet sich diese Markierung möglicherweise in einem Listenfeld oder
in einem Unterformular?
ja, sie befindet sich in einem Unterformular, welches eine Tabelle
anzeigt.

Danke,
Sebastian
Josef Poetzl
2005-08-17 09:30:02 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
Post by Josef Poetzl
Kann es sein, dass Du den Button auf einem ungebundenen Formular
einsetzt?
Was ist ein ungebundenes Formular, und welche anderen Möglichkeiten
gibt es?
Damit meine ich ein Formular, das an keine Datenbasis gebunden ist.
(So ein ungebundenes Formular ist in deinem Fall vermutlich das
Hauptformular, auf dem sich die Schaltfläche befindet.)
Post by Sebastian Hartwig
Post by Josef Poetzl
Befindet sich diese Markierung möglicherweise in einem Listenfeld oder
in einem Unterformular?
ja, sie befindet sich in einem Unterformular, welches eine Tabelle
anzeigt.
Der von Henry gezeigt Code muss in dem Formular ausgeführt werden, in
dem die zu Datenbasis vorhanden ist.

Du könntest also vom Hauptformular aus folgendes versuchen:

Dim frm as Form
Dim rs as DAO.Recordset
set frm = me!ufSteuerelement.Form
set rs = frm.recordsetclone
rs.Bookmark = frm.bookmark
rs.delete
set rs = nothing


Alternativ kannst Du auch den PK vom markierten Datensatz ermitteln
und eine ganz normale Löschabfrage ausführen.
CurrentDb.Execute "DELETE FROM DeineTabelle WHERE PkFeld=" & DeinWert

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-17 17:34:50 UTC
Permalink
Hallo Josef.
Post by Josef Poetzl
Alternativ kannst Du auch den PK vom markierten Datensatz ermitteln
und eine ganz normale Löschabfrage ausführen.
CurrentDb.Execute "DELETE FROM DeineTabelle WHERE PkFeld=" & DeinWert
wie ermittle ich denn den PK des markierten Datensatzes?

Gruß,
Sebastian
Josef Poetzl
2005-08-18 06:37:55 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
wie ermittle ich denn den PK des markierten Datensatzes?
Vom HF aus:
PKwert = me!ufSteuerelement.Form!PKFeld

Damit wird der Wert aus dem gerade aktiven Datensatz zurückgegeben.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-18 08:18:34 UTC
Permalink
Hallo Josef,

ich habe jetzt folgenden Code zusammengebastelt:

Private Sub Befehl2_Click()
PKwert = Me!Tabelle1Unterformular2.Form!PKFeld
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE PkFeld=PKwert"
End Sub

Ich weiß nicht, ob Du mit "ufSteuerelement" den Namen des
Unterformulars gemeint hast.
"Tabelle1Unterformular2" ist der Name des Unterformulars.Tabelle 1 ist
die Tabelle, die dem Unterformular als Datenbasis dient.
Leider bekomme ich immer noch eine Fehlermeldung.
Gruß,
Sebastian
Henry Habermacher [MVP Access]
2005-08-18 08:33:31 UTC
Permalink
Hallo Sebastian
Post by Sebastian Hartwig
Leider bekomme ich immer noch eine Fehlermeldung.
Aber die willst Du uns verheimlichen? Wieso denn? Da steht sicher drin, was
falsch ist.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Josef Poetzl
2005-08-18 09:00:08 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
Private Sub Befehl2_Click()
PKwert = Me!Tabelle1Unterformular2.Form!PKFeld
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE PkFeld=PKwert"
End Sub
Ich weiß nicht, ob Du mit "ufSteuerelement" den Namen des
Unterformulars gemeint hast.
"Tabelle1Unterformular2" ist der Name des Unterformulars.Tabelle 1 ist
die Tabelle, die dem Unterformular als Datenbasis dient.
Mit ufSteuerelement meinte ich das Steuerelement, in dem sich das
Unterformular befindet.

Damit es verständlicher wird:
Nehmen wir an, es gibt ein Formular mit dem Namen "XYZ". (Der Name ist
im Datenbankfenster sichtbar.)
Weiteres gibt es ein Formular mit dem Namen "ABC".

Das Formular XYZ soll nun ein Unterformular erhalten.
Dafür wird im Formular XYZ ein Unterformular-Steuerelement eingefügt,
welches das Unterformular beinhalten soll. Diesem Steuerelement geben
wir den Namen "ufSteuerelement".
Das UF-Steuerelement hat eine Eigenschaft mit der Bezeichnung
"Herkunftsobjekt". Dort wird der Name des Formulars eingetragen, das
als Unterformular verwendet wird. (Dort könnte z. B. "ABC" stehen)

Das Unterformular ("ABC") wird nun vom Hauptformular "XYZ" so
angesprochen:
Dim frm As Form
Set frm = Me!ufSteuerelement.Form
Msgbox frm.Name ' => "ABC"

Ich hoffe das war jetzt einigermaßen verständlich.
Post by Sebastian Hartwig
PKwert = Me!Tabelle1Unterformular2.Form!PKFeld
Warum wird die Variable PKwert nicht deklariert?
Post by Sebastian Hartwig
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE PkFeld=PKwert"
So habe ich dir das aber nicht gezeigt, oder?
Post by Sebastian Hartwig
Leider bekomme ich immer noch eine Fehlermeldung.
Das ist natürlich schlecht.


Ich schreibe Dir jetzt mit Absicht keine exakte Lösung, da ich den
Verdacht habe, dass Du diese nur 1:1 kopieren würdest und Dir keine
Gedanken darüber machst, warum das so geschrieben wird.
Ich beantworte Dir aber gerne weitere Fragen, falls Du Probleme bei
der Umsetzung hast.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-19 09:04:50 UTC
Permalink
Hallo Josef.

Ich taste mich am Besten langsam an die Lösung heran...
Zunächst möchte ich, das nach Anklicken einer Schaltfläche die
PK-Nummer ausgegeben wird.
Das Hauptformular heißt Formular1, das Steuerelement, das die Tabelle
mit den Daten anzeigt, heißt ufSteuerelement.
Folgenden Code habe ich eingegeben:

Private Sub Befehl2_Click()
Dim PKwert As Integer
PKwert = Me!ufSteuerelement.Form!PKFeld
MsgBox PKwert

End Sub

Nach Anklicken der Schaltfläche bekomme ich folgende Fehlermeldung:

"Microsoft Access kann das in Ihrem Ausdruck angesprochene Feld
'PKFeld' nicht finden.
Mir selbst ist auch noch nicht klar, worauf sich PKFeld bezieht.

Danke,
Sebastian
Josef Poetzl
2005-08-19 09:24:06 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
Ich taste mich am Besten langsam an die Lösung heran...
Gute Idee. ;-)
Post by Sebastian Hartwig
Zunächst möchte ich, das nach Anklicken einer Schaltfläche die
PK-Nummer ausgegeben wird.
Das Hauptformular heißt Formular1, das Steuerelement, das die Tabelle
mit den Daten anzeigt, heißt ufSteuerelement.
Nur damit nicht noch weitere Verständigungsprobleme auftreten:
ufSteuerelement ist ein Steuerelement für ein Unterformular und
enthält ein Formular (Eigenschaftsfeld "Herkunftsobjekt"), welches in
der Datenblattansicht verwendet wird - bzw. es ist als
"Herkunftsobjekt" die Tabelle eingetragen.
Oder ist es vielleicht doch ein Listenfeld oder etwas anderes?
Post by Sebastian Hartwig
Private Sub Befehl2_Click()
Dim PKwert As Integer
PKwert = Me!ufSteuerelement.Form!PKFeld
MsgBox PKwert
End Sub
"Microsoft Access kann das in Ihrem Ausdruck angesprochene Feld
'PKFeld' nicht finden.
Mir selbst ist auch noch nicht klar, worauf sich PKFeld bezieht.
Mit PKFeld meinte ich jenes Feld, dass den Primärschlüssel des
Datensatzes enthält. Ich dachte meine verwendete Abkürzung PK für
"primary key" sei dir bekannt.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-19 11:46:04 UTC
Permalink
Hallo Josef.

ich habe es fast geschafft:

Private Sub Befehl2_Click()
Dim PKwert As Integer
PKwert = Me!ufSteuerelement.Form!ID
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE ID=" & PKwert

End Sub

Wenn ich den zu löschenden Datensatz markiere und auf die
Schaltfläche Befehl2 klicke, ist der Datensatz aus der Tabelle
gelöscht. Leider verschwindet der Datensatz noch nicht sofort aus dem
Unterformular, sondern erst, wenn ich das Formular schließe und
anschließend wieder öffne. Hast du eine Idee?

Danke,
Sebastian
Josef Poetzl
2005-08-19 11:54:35 UTC
Permalink
Hallo!
Post by Sebastian Hartwig
Private Sub Befehl2_Click()
Dim PKwert As Integer
fällt mir erst jetzt auf:
verwende lieber long statt integer
Dim PKwert as long
Post by Sebastian Hartwig
PKwert = Me!ufSteuerelement.Form!ID
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE ID=" & PKwert
End Sub
Wenn ich den zu löschenden Datensatz markiere und auf die
Schaltfläche Befehl2 klicke, ist der Datensatz aus der Tabelle
gelöscht. Leider verschwindet der Datensatz noch nicht sofort aus dem
Unterformular, sondern erst, wenn ich das Formular schließe und
anschließend wieder öffne. Hast du eine Idee?
Es fehlt ein Requery, damit die Datensätze im UF aktualisiert werden.
Me!ufSteuerelement.Form.Requery

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Sebastian Hartwig
2005-08-19 12:38:55 UTC
Permalink
Es funktioniert nun alles. Vielen Dank!
Karl Donaubauer
2005-08-19 11:51:03 UTC
Permalink
Post by Sebastian Hartwig
Private Sub Befehl2_Click()
Dim PKwert As Integer
PKwert = Me!ufSteuerelement.Form!ID
CurrentDb.Execute "DELETE FROM Tabelle1 WHERE ID=" & PKwert
End Sub
Wenn ich den zu löschenden Datensatz markiere und auf die
Schaltfläche Befehl2 klicke, ist der Datensatz aus der Tabelle
gelöscht. Leider verschwindet der Datensatz noch nicht sofort aus dem
Unterformular, sondern erst, wenn ich das Formular schließe und
anschließend wieder öffne. Hast du eine Idee?
Me!ufSteuerelement.Requery
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
+ Access-Entwickler-Konferenz (AEK8) 1./2.10.+8./9.10.2005
Henry Habermacher [MVP Access]
2005-08-20 17:04:27 UTC
Permalink
Hallo Sebastian
Post by Karl Donaubauer
Post by Sebastian Hartwig
Wenn ich den zu löschenden Datensatz markiere und auf die
Schaltfläche Befehl2 klicke, ist der Datensatz aus der Tabelle
gelöscht. Leider verschwindet der Datensatz noch nicht sofort aus dem
Unterformular, sondern erst, wenn ich das Formular schließe und
anschließend wieder öffne. Hast du eine Idee?
Me!ufSteuerelement.Requery
Und wenn's nicht stört, dass da anschliessend #DELETED# oder was ähnliches
drin steht, Du aber den markierten Datensatz noch sehen möchtest, dann geht
vermutlich auch ein:

Me!ufSteuerelement.Refresh

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Helga Schulz
2005-08-20 13:06:53 UTC
Permalink
Post by s***@web.de
Wenn ich der Schaltfläche die Aktion "Datensatz löschen" zuordne,
wird jedoch nichts gelöscht. Gerne hätte ich auch den VBA-Code für
die korrekte Löschaktion.
Danke!
Ich mach das bisher so, daß ich da einfach einen SQL-DELETE
anhänge, dann ist es auch sicher tot:

Option Compare Database
Option Explicit

Dim sqlstr$

Private Sub bLoeschen_Click()
'ich nenne diese Knöpfe immer bLoeschen

sqlstr = "DELETE * FROM tbl_meineTabelle WHERE "
sqlstr = sqlstr & "IDmT=" & Me.fIDmT & ";"
'Pfad/Name zu dem ID-Feld muß angepasst werden,
'falls der z.B. zu einem Unterformular zeigt

MsgBox sqlstr
'zum Entwanzen, bei längeren SQL-Strings
DoCmd.SetWarnings False
'beim ersten Mal auf true setzen, damit man sich
'am Fortschritt erfreuen kann
DoCmd.RunSQL sqlstr

Me.Requery
'auch hier entsprechend anpassen, z.B.
'Form_UFmeinUnterformular.Requery

End Sub

Die rs.delete-Variante erscheint mir wegen der Brauchbarkeit für
viele Formulare (wenig Anpassung nötig) eleganter, aber wie
gesagt, SQL-DELETE ist auch eine prima Fliegenklatsche.
Hat halt den Nachteil, daß man jedesmal den SQL-String anpassen
muß.
Loading...