Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: datekk am April 26, 2016, 16:09:32

Titel: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: datekk am April 26, 2016, 16:09:32
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
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: MzKlMu am April 26, 2016, 16:13:31
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 ?
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: DF6GL am April 26, 2016, 16:23:19
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
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: Beaker s.a. am April 26, 2016, 17:27:39
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
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: DF6GL am April 26, 2016, 18:14:50
Hallo,
Zitat
da der letzte gemerkte DS ja
im Popup gelöscht wird

Dann kann man ja den vorangehenden merken.....  8)
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: datekk am April 27, 2016, 10:44:50
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?
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: trebuh am April 27, 2016, 11:29:10
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
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: datekk am April 27, 2016, 12:40:27
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....
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: Wurliwurm am April 27, 2016, 13:25:32
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.
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: datekk am April 27, 2016, 13:32:33
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..
Titel: Re: Endlos-Formular aktualisieren ohne es kompett neu darzustellen
Beitrag von: Wurliwurm am April 27, 2016, 16:40:08
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