1.1k Aufrufe
Gefragt in Datenbanken von
Hallo Supportler!

Ich möchte in meiner DB aus der tbl_MediPlan zunächst eine (markierte) Zeile in eine tbl_Archiv sichern und anschließend diese Zeile dann aus der tbl_MediPlan löschen. Mit einer Abfrage komme ich da nicht weiter - ich denke da muss Code her. Wie sollte der aussehen? Insbesondere macht mir das Selektieren der markierten Zeile Probleme. Meine Versuche endeten immer damit, dass alle Zeilen gelöscht wurden.

Für Anregungen bin ich Euch wie immer dankbar.

Stefan

4 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Stefan,

ich mache mal paar Annahmen, da die Angaben etwas spärlich sind:

1. du benutzt MS Access
2. deine Tabelle hat einen eindeutige ID (primary Key), z.B. ID vom Typ Autowert
3. deine tbl_Archiv ist identisch aufgebaut (bei ID allerdings kein Autowert sondern Zahl (long int)

Dann würde ich folgendermaßen vorgehen:

a) erstelle ein Formular mit der Datenherkunft tbl_Mediplan (z.B. in der Standardansicht Datenblatt)
b) erstelle beim Ereignis "Beim Löschen" folgende Prozedure:

Private Sub Form_Delete(Cancel As Integer)
DoCmd.RunSQL "INSERT INTO Tbl_archiv SELECT * FROM tbl_mediplan where ID = " & Me!ID
End Sub

Das Löschen wird über die Access Standardverfahren ausgeführt (indem du im Formular auf den Datensatzzeiger gehst und die Taste "DEL" drückst. Das Ereignis "Beim Löschen" wird VOR dem eigentlichen Löschvorgang ausgelöst. Du solltest jedoch beachten das das Löschen und das INSERT-Statement unabhängige Statements sind. Mein Beispiel prüft nicht, ob das eine oder andere Statement nicht ausgeführt worden ist und es so zu inkonsistenzen kommen kann.
Solltest du MSSQL oder ORACLE verwenden, dann empfehle ich eine Triggerfunktion, die es unter Access leider nicht gibt.

Gruß
Ralf
0 Punkte
Beantwortet von
Hallo Ralf,

Danke für die schnelle Antwort. Ich arbeite mit Access 2007. Die zu löschende Zeile befindet sich in einem Unterformular, Datenherkunft ist die genannte tbl_MediPlan. Der Anwender soll halt nur einen Button Med_Loeschen betätigen und dann soll die beschriebene Funktion in einem Rutsch ablaufen. 1. archiviern der markierten Zeile, 2. loeschen des Inhaltes dieser Zeile. Wie schon beschrieben funktioniert das auch schon, bis auf das Problem, dass eben ALLE Zeilen gelöscht werden und nicht nur die markierte. Ich bastele da jetzt schon seit Tagen dran....

Gruß
Stefan
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Stefan,

zu den Annahmen 2 und 3 hast du noch nichts gesagt. Ich gehe mal davon aus, dass sie zutreffen. Je nachdem wo dein Lösch-Button liegt (Hauptformular bzw Unterformular), musst du die eine oder andere idref-Zuweisung ausblenden. Den Namen des Unterformulars musst du entsprechend anpassen.

Dim idRef As Long

' Löschbutton im Unterformular
idRef = Me!ID
' Löschbutton im Hauptformular
idRef = Me!MED_UF.Form!ID

MsgBox "Archivere und Lösche den Datensatz mit der ID = " & idRef

DoCmd.RunSQL "INSERT INTO Tbl_archiv SELECT * FROM tbl_mediplan where ID = " & idRef
DoCmd.RunSQL "DELETE * FROM tbl_mediplan where ID = " & idRef

Die Msgbox-Anzeige sollte dir die ID zum dem Datensatz anzeigen der gelöscht wird.
Eventuell könnstest du noch ein
Me!MED_UF.Form.Requery
bzw.
Me.Requery
am Ende noch einfügen.

Gruß
Ralf
0 Punkte
Beantwortet von
Hallo Ralf,

mit dem ersten Vorschlag habe ich es jetzt hinbekommen.

Nochmals Danke für die kompetente Hilfe.

Gruß

Stefan
...