Hi. Ich habe ein Endlosformular, welches mir eine Vorgangsliste anzeigt. Klicke ich auf einen Vorgang, öffnet sich ein Fenster. Wenn ich in diesem Fenster das Vorgangsereignis lösche und das Fenster schließe, soll aus dem Endlosformular der entsprechende Eintrag entfernt werden, aber ohne, dass das Endlosformular komplett neu geladen wird. Wie ist dies möglich?
Meine bisherige Lösung besteht in einem Requery des Formulars, was aber zu Folge hat, dass das Formular neu dargestellt wird. Befindet man sich bei einer längeren Liste an deren Ende, so hat dieser Befehlt zur folge, dass das Formular wieder neu geladen wird und man wieder ganz nach unten scrollen muss.
Besteht also eine Möglichkeit, dass einzelne Zeilen gelöscht werden und der Inhalt darunter nach oben rutscht und das Formular insgesamt an der Stelle bleibt auf die es der User gescrollt hat?
LG
datekk
Hallo,
Du kommst um ein Requery nicht herum, denn die Datenherkunft muss neu abgefragt werden um das Formular zu aktualisieren.
Du musst Dir in einer globalen Variablen den Datensatz (dessen Primärschlüsel) merken und nach dem Requery wieder anzeigen.
Stichwort zur Suche in der Hilfe: FindFirst
Warum verwendest Du zum Löschen ein extra Fenster ?
Hallo,
Zitatdas Formular insgesamt an der Stelle bleibt auf die es der User gescrollt hat
soll heißen: auf den vorher aktuellen DS positioniert wird:
http://www.donkarl.com/?FAQ4.5
Hallo Franz,
Dürfte in diesem Fall aber nicht funzen, da der letzte gemerkte DS ja
im Popup gelöscht wird. Nach .Requery ist die gemerkte ID nicht mehr
im UFo-Rs.
Vielleicht reicht ein einfaches DoCmd.GotoRecord acLast ?
gruss ekkehard
Hallo,
Zitat
da der letzte gemerkte DS ja
im Popup gelöscht wird
Dann kann man ja den vorangehenden merken..... 8)
mh ok... das wird nicht ganz funktionieren. Durch eine entsprechende Sortierung sind die IDs wild durcheinandergewirbelt.... Gibt es eine Möglichkeit die Zeilen des Formulars von oben nach unten durchzunummerieren via Textfeld, dann bei Klick auf den Datensatz das Textfeld der geklickten Zeile auszulesen, an eine Variable übergeben, requery und dann Sprung auf Zeile des Variableninhalts -1?
Du kannst ja vor dem Löschen einen Datensatz vorspringen und dann die dazugehörige ID auslesen und in einer Variablen hinterlegen.
Müsstest halt noch berücksichtigen, wo hingsprungen werden soll, wenn der erste Datensatz gelöscht wird. (In dem Fall wohl nicht zum vorherigen, sondern zum nächsten.
Gruß trebuh
Wie gesagt, die ID ist kein wirklich guter Indikator, da das Formular nicht nach IDs geordnet wird. Ich habe nun in mein Formular Zeilennummern eingefügt. Ein ungebundenes Textfeld gibt nun die Zeilennummer für jeden Datensatz aus. Mit Klick auf die Zeile kann ich schon mal diese Zeilennummer in eine Variable übergeben. Soweit bin ich nun schon gekommen. Das läuft über me.bookmark. Nun müsste ich wissen, wie ich zu dem entsprechenden Datensatz bzw. zur entsprechenden Zeilennummer in der Variable springen kann....
Ich habe das, was Du Dir vorstellst, schon das eine oder andere Mal gemacht. Es ist allerdings ein bißchen aufwendiger, und es kommen wieder die ungebundenen Recordsets, die ich schon mal vorgestellt hatte, in´s Spiel. Es braucht dann auch nicht unbedingt einen Requery, aber wenn der Datensatz auch in der DB physikalisch gelöscht werden soll, einen zusätzlichen DELETE.
Ich habe mich auch ein bisschen falsch ausgedrückt wie ich jetzt sehe. Der Datensatz wird gar nicht gelöscht. Das Formular basiert auf meiner Kundentabelle. Darin gibt es ein Datumsfeld. Das Formular gibt alle Kundendatensätze aus, bei denen ein Datum kleiner als Jetzt() erfasst ist. Wird der Termin auf später gelegt, oder das Datum gänzlich gelöscht, so erscheint der Kunde auch nicht mehr in der Liste.... Der komplette Datensatz wird aber nicht gelöscht... Sorry..
Es braucht einen eindeutigen Key, der im Recordset genau eine Zeile repräsentiert, ganz unabhängig, wo diese sich gerade im Formular befinden sollte.
Dieser Key sollte dem Bearbeitungsformular oder der Routine bekannt sein, die das Entfernen der einen Zeile auslösen soll. Es braucht dann eine Routine im Unterformular in der Art entferneZeile(byval intZeile as Integer), die extern aufgerufen wird. Das ganze geht, wie gesagt, nur mit einem ungebundenen Recordset.
Vielleicht kannst Du mit dem folgenden Beispielcode etwas anfangen:
Public Sub ListeAktualisierenNachLoeschen(ByVal strKtoNrDel As String)
On Error GoTo Fehler
Dim strKto As String
If rsA.RecordCount = 0 Then GoTo Wegloeschen
strKto = txtKtoNr.Value
If IsNumeric(strKto) = False Then Exit Sub
Dim arrPos() As Integer
arrPos = KontopositionAbfragen
Dim aktFeld As String
aktFeld = Me.ActiveControl.Name
Wegloeschen:
Dim rsKlon As ADODB.Recordset
Set rsKlon = rsU.Clone
If rsU.RecordCount = 0 Then Exit Sub
rsKlon.Filter = rsU.Filter
rsKlon.Filter = "KtoNr='" & strKtoNrDel & "'"
If rsU.BOF = True And rsU.EOF = True Then Exit Sub
Dim rsKlonA As ADODB.Recordset
Set rsKlonA = rsA.Clone
rsKlonA.Filter = rsKlon.Filter
Me.Painting = False
rsKlon.Delete
rsKlon.Update
If rsKlonA.BOF = True And rsKlonA.EOF = True Then
Else
rsKlonA.Delete
rsKlonA.Update
End If
Set Me.Recordset = rsA
If rsA.RecordCount = 0 Then
Set Me.Recordset = rsA
Else
rsA.Move arrPos(0), adBookmarkFirst
If arrPos(0) > rsA.RecordCount And rsA.RecordCount > intShowZeilen Then
rsA.MoveLast
rsA.Move -(intShowZeilen - 2)
rsA.MoveLast
ElseIf arrPos(0) > 0 Then
rsA.Move -arrPos(1)
rsA.Move arrPos(1) - 1
End If
End If
If rsA.RecordCount = 0 Then
Else
Me.Controls(aktFeld).SetFocus
End If
Me.Painting = True
Exit Sub
Fehler:
End Sub
Private Function KontopositionAbfragen() As Variant
Dim arrPos() As Integer
ReDim arrPos(2) '0 = Aktueller, 1 = Wievielter
Dim lngErster As Long
Dim lngAktueller As Long
Dim lngHeightDetailsection As Long
Dim lngCurrentSectionTopStart As Long
Dim intWievielter As Long
Dim lngNummer As Long
lngAktueller = rsA.AbsolutePosition
arrPos(0) = lngAktueller
lngHeightDetailsection = Me.Form.Section(0).Height
lngCurrentSectionTopStart = Me.Form.CurrentSectionTop
intWievielter = lngCurrentSectionTopStart / lngHeightDetailsection
arrPos(1) = intWievielter
''debug.print vbCrLf & "Absolut " & arrPos(0) & " Wievielter " & arrPos(1)
KontopositionAbfragen = arrPos
End Function