Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Endlos-Formular aktualisieren ohne es kompett neu darzustellen

Begonnen von datekk, April 26, 2016, 16:09:32

⏪ vorheriges - nächstes ⏩

datekk

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
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MzKlMu

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 ?
Gruß Klaus

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,
Zitat
da der letzte gemerkte DS ja
im Popup gelöscht wird

Dann kann man ja den vorangehenden merken.....  8)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

datekk

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?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

trebuh

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

datekk

#7
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....
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Wurliwurm

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.

datekk

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..
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Wurliwurm

#10
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