Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datensatz im Formular aus einem Listenfeld löschen

Begonnen von Tigra1207, Juli 22, 2011, 01:27:44

⏪ vorheriges - nächstes ⏩

Tigra1207

Hallo,

habe schone diverse Suchmaßnahmen gemacht, jedoch hats noch nicht geklappt.
Zu meinem Problem:

Ich habe eine Datenbank mit 2 Tabellen. Stehen in Beziehung 1-n, und Formulare zum "füttern" der Tabellen. Nun möchte ich nicht nur Datensätze hinzufügen sondern auch löschen. Habe ein Formular wo die bis dahin eingepflegten Datensätze in einem Listenfeld zu sehen sind und ich dort über Button Datensätze hinzufügen kann. Nun möchte ich auch löschen. Habe dazu hinter dem Button folgenden Code gesetzt:
Private Sub Befehl7_Click()
   DoCmd.SetWarnings False
   DoCmd.RunCommand acCmdDeleteRecord
   DoCmd.SetWarnings True
End Sub

Es soll also aus dem Listenfeld ein Datensatz rausgesucht (Datensatzmarkierer)werden und dann mit einem Löschbutton dieser auserwählte gelöscht werden. Klappt aber nicht so. Auch speichert Access immer den letzten Datensatz automatisch und das verwierrt, da auch verwälschte Datensätze zustande kommen.
Hat jemand eine Idee?



Viele Grüße
Marco

database

Hallo,

Datensätze aus einem Listenfeld zu löschen ist an sich keine große Sache.
Voraussetzung für das ordentliche Gelingen ist es aber, dass die GEBUNDENE SPALTE des Listenfeldes die ID, also den Primärschlüssel - des angezeigten Datensatzes enthält!

Durch ...


Dim lngXY as Long
lngXY = Me!Listenfeld


... kann dieser Primärschlüssel - also der Inhalt des gebundenen Feldes ausgelesen werden.

Danach kann mittels...

DoCmd.RunSQL "DELETE * FROM DeineTabelle WHERE ID=" & lngXY

... der betreffende Datensatz aus der Tabelle gelöscht werden.

Mit ...

Me!Listenfeld.Requery
... kann danach das Listenfeld neu eingelesen werden um den gelöschten Datensatz aus der Darstellung zu entfernen.

Alles in Allem sollte aber die Überlegung gelten warum Datensätze überhaupt gelöscht werden sollen?
Kommt sicher auf die Thematik hinter der zugrunde liegenden Tabelle an aber m.E. wäre es besser in der Tabelle ein Statusfeld zu führen welches z.B. per Standard 1 enthält
wobei dann im 'Löschfall' dieses Feld auf 0 gesetzt wird.
Das Listenfeld wird nur mit Datensätzen versorgt, deren Statusfeld 1 aufweist (vorbehaltlich weiterer Kriterien).

"SELECT ID, Feld1, Feld2, Feldn FROM DeineTabelle WHERE Status=1"

Alternativ zu obigem Löschbefehl wäre dann...

DoCmd.RunSQL "UPDATE DeineTabelle SET Statusfeld = 0 WHERE ID=" & lngXY

... der 'Löschvorgang' ohne Datenverlust zu bewerkstelligen.  ;)

HTH

Tigra1207

Hallo,

danke für die schnelle Antwort. Das löschen klappt super.

2 Fragen hab ich dazu:

1)Ich habe das Listenfeld mit der ID gebunden. Leider kann ich jetzt im Listenfeld keine Datensätze mehr anklicken und markieren. Das geht nur noch über Button Nächster Datensatz. Hab ich das falsch gebunden. Folgende Fehlermeldung:"Das Steuerelement kann nicht bearbeitet werden, es ist an das Autowert-Feld ID gebunden".

Listenfeld: Daten - Steuerelementinhalt: ID(hier ist der Primärschlüssel); Datensatzherkunft: tbl(...)
Listenfeld: Format- Spaltenanzahl 2; Spaltenbreiten: 0cm; 7cm ( um nicht Zahlen sondern Text darstellen zu können der Daten)

2) Habe die Prozedur so in der Codeansicht eingefügt. Leider aktualisiert sich das Listenfeld nicht automatisch. Ich glaube das Requery ist an der falschen Stelle:

Private Sub Liste0_Click()
Me!Text2 = Me!Liste0

Dim lngXY As Long
lngXY = Me!Liste0

DoCmd.RunSQL "DELETE * FROM tblLehrgang und Thema WHERE ID=" & lngXY
Me!Liste0.Requery

End Sub


Hätte jemand eine Idee?

Vielen vielen Dank.

Gruß Marco

DF6GL

Hallo,

1) database hat nicht von "gebundenem Listenfeld" gesprochen, sondern von der "gebundenen Spalte" des Listenfeldes.
Entferne also den Eintrag im Steuerelementinhalt des LF wieder.

2) Warum benutzt Du nicht gleich ein Endlosform anstelle des Listenfeldes? 

3) Es ist Dir schon klar, dass mit Deiner Ereignisprozedur  bei JEDEM Klick auf das Listenfeld der angeklickte DS sofort gelöscht wird?

4) das Requery steht an richtiger Stelle.

5) Sicherheitshalber würde ich schreiben:

lngXY = Me!Liste0.Column(0)

wenn die ID in der ersten Spalte (Column(0)) des Listenfeldes steht.


6) Ändere die Benamsung (dringend) insofern, als dass kein Sonder- und Leerzeichen in Namen auftreten. Es ist sonst UNBEDINGT der Name in Eckklammern zu setzen:

DoCmd.RunSQL "DELETE * FROM [tblLehrgang und Thema] WHERE ID=" & lngXY


RunSQL solltest Du nach der Testphase in CurrentDb.Execute auswechseln.