Neuigkeiten:

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

Mobiles Hauptmenü

Fortschrittsfenster zuckt :)

Begonnen von datekk, März 02, 2018, 11:12:06

⏪ vorheriges - nächstes ⏩

datekk

Hallo,

ich habe mir für die Bearbeitung größerer Datensätze, welche z.B. mit Do Loop Schleifen durchlaufen werden ein Fortschrittsfenster gebaut. Ein einfaches Fenster in dem steht "Fortschritt: x von y erledigt".

In einem Modul habe ich eine Sub, welche x und y aus der Do Loop Schleife empfängt und die Werte an das geöffnete Fortschrittsfenster weitergibt, in dem die Sub einfach das Textfeld aktualisiert (frm.txtFeld = Fortschritt: " & lngX & " von " & lngY & " erledigt."

Leider flackert dieses Fortschrittsfenster bzw. der Text mit jeder Änderung. Das sieht nicht professionell aus. Gibt es hier andere Ansätze wie das Flackern vermieden werden 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

MzKlMu

Hallo,
Zitatich habe mir für die Bearbeitung größerer Datensätze, welche z.B. mit Do Loop Schleifen durchlaufen werden ein Fortschrittsfenster gebaut.
wahrscheinlich wäre eine Aktualisierungsabfrage besser geeignet als Schleifen. Sollte man in einer Datenbank eh vermeiden.
Und mit einer Abfrage braucht es dann wahrscheinlich keinen Balken mehr, weil die Abfrage das viel schneller erledigt. Und der Balken verlangsamt das Ganze noch zusätzlich, der braucht ja auch Ressourcen des Rechners.

Was wird denn bearbeitet in den Datensätzen ?
Gruß Klaus

Wurliwurm

Bei mir flackert da nichts. Nicht vergessen, DoEvents auszulösen direkt nach der Aktualisierung des Textfelds.

Fragen:
Wie wird das geöffnete Formular denn angesprochen? Wird das Fortschrittsformular evtl immer wieder neu aufgerufen?
Hängt an dem Textfeld vielleicht irgendein Ereignis?

datekk

#3
Ja, erstmal vielen Dank für Eure Antworten.

Eine Aktualisierungsabfrage bringt mich leider nicht in jedem Fall weiter denn diese kann ich ja nur anwenden, wenn Aktualisierungen in den Datentabellen nötig sind, welche auf reinem SQL basieren. Wenn z.B. Mailings zu senden sind oder eine größere Anzahl an Daten anderweitig zu bearbeiten sind, sind Recordsets notwendig, welche dann durchlaufen werden. Ich habe dieses Fortschrittsfenster bewusst nur für Arbeiten gewählt, die länger / lange dauern.

Ansonsten, das Textfeld hängt an keinem Ereignis, ein Do Events ist in der Schleife selbst enthalten. Das Formular wird auch nicht mit jedem durchlaufen der Schleife neu geöffnet, es wird nur das Feld aktualisiert.

Angesprochen wird das Form und das Feld aus einer Sub heraus via

frm = forms("frmFortschritt")
frm.TxtFeld = "Fortschritt: " & lngAktuell & " von " & lngGesamt & " erledigt."


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 hab das mal folgendermassen ausprobiert, und mich stört kein Zucken.

Im Formular gibt es eine public Routine:
Public Sub Fortschritt(ByVal lngAktuell As Long, ByVal lngGesamt As Long)

  txt01.Value = "Fortschritt: " & lngAktuell & " von " & lngGesamt & " erledigt."
  DoEvents

End Sub


Im Modul habe ich folgende Testroutine:
Private Sub meineRoutine()

    DoCmd.OpenForm ("frmFortschritt")

    Dim frm As Object
    Set frm = Forms("frmFortschritt")
   
    Dim lngGesamt As Long
    lngGesamt = 100

    Dim lngAktuell As Long
    For lngAktuell = 1 To lngGesamt
   
        Debug.Print lngAktuell
       
        Call frm.Fortschritt(lngAktuell, lngGesamt)
       
        Warten (10) 'API-Funktion sleep aufrufen

    Next lngAktuell

End Sub



Lachtaube

Das spärlich ausgefallene und unformatierte Code-Zitat stellt in der gezeigten Form schon einmal keine gültige VBA-Syntax dar und trägt kaum zur Ursachenfindung des Problems bei. Du müsstest also schon etwas mehr von Deiner Programmierkunst preisgeben, um eine ähnliche Szenerie nachstellen und analysieren zu können.
Grüße von der (⌒▽⌒)

Wurliwurm

Am besten ein Label (Bezeichnungsfeld) nehmen und mit lbl.Caption den Inhalt aktualisieren. Dann flackert gar nichts.