Neuigkeiten:

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

Mobiles Hauptmenü

DS-Update stoppt nach je 111 Records

Begonnen von crystal, Juli 23, 2016, 20:03:54

⏪ vorheriges - nächstes ⏩

crystal

Hallo,

ich habe aus einer Tabelle ein eifaches Formular erstellt und dann im Current-Event Code geschrieben, der einige Felder updated.
Datenquelle ist ein Select-Statement, Typ Dynaset.
Wenn ich im Formular Next Record klicke (oder Page down) funktioniert alles prima.

Also - warum das nicht automatisch machen. Also habe ich in meinem Form_Current-Code als letztes Statement schlicht eingefügt
docmd.gotorecord (,, acnext ist ja Standard).

Hurra, es schien zu funktionieren, aber bei jedem 111. Record erhielt ich die FM 2105 - Sie können nicht zum angegebenen Record springen.

OK - im Fehler-Fenster Beenden klicken, dann im Formular einmal auf previous Record - schon lief es wieder für genau 110 Records und stoppte wieder beim 111.

Man kann zwar eingeben me.recordset.flush, aber zur Laufzeit wird das angemeckert.
Auch ein doevents brachte nichts.
Also habe ich einen Zähler mitlaufen lassen und bei Modulo 100 einfach ein GotoRecord ,,acprevious eingefügt - brachte nichts.

Was, liebe Spezialisten/innen ist die Ursache für diesen Fehler nach konstant 110 bzw. 111 Records? Immerhin hat meine Original-Tabelle mehrere Tausend Datensätze  und da wäre es doch lästig, immer wieder beenden, voriger Datensatz klicken zu müssen.

Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

Hallo,
warum machst Du nicht einfach eine Aktualisierungsabfrage ? Das Formulargerenne ist überflüssig. Auch in einer Aktualisierungsabfrage kannst Du (wenn überhaut erforderlich) eine VBA Funktion verwenden. Wie das mit der 111 zusammenhängt, weis ich jetzt auch nicht, wer weis was da im Hintergrund alles passiert.

Was wird denn wie aktualisiert ?
Gruß Klaus

crystal

Hallo,
hier ist der Code:


Private Sub Form_Current()
    Dim objShell  As Object
    Dim objFolder As Object
    Dim objFolderItem As FolderItem
   
    Dim sFolder As Variant
    Dim i As Integer
   
    Const csFOLDER As String = "k:\va4\"
   
'    TempVars("cnt") = TempVars("cnt") + 1
'        If TempVars("cnt") Mod 100 = 0 Then
'            MsgBox "weiter"
'            'Me.Recordset.Refresh
'            DoEvents
'        End If
   
    sFolder = csFOLDER & SubSourceDir & "\" & MovieNameOnDisc
   
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.NameSpace(sFolder)
    'Schleife über alle Dateien
    For Each objFolderItem In objFolder.Items
            If objFolder.GetDetailsOf(objFolderItem, 183) <> TempVars("dir") Then
                TempVars("dir") = objFolder.GetDetailsOf(objFolderItem, 183)
                TempVars("count") = 0
            End If
            If objFolderItem.Name = MovieFileName Then
                TempVars("count") = TempVars("count") + 1
                MovieFileSequence = TempVars("count")
                MovieFileType = Right(objFolder.GetDetailsOf(objFolderItem, 158), 3)
                MovieFileSize = objFolder.GetDetailsOf(objFolderItem, 1)
                MovieFileLength = objFolder.GetDetailsOf(objFolderItem, 27)
                MovieFileResX = objFolder.GetDetailsOf(objFolderItem, 306)
                MovieFileResY = objFolder.GetDetailsOf(objFolderItem, 304)
                Exit For
            End If
        Next
       
    Set objFolderItem = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    Set sFolder = Nothing
   
    DoCmd.GoToRecord
   
End Sub


Ps: Namen, die mit Movie beginnen, sind Tabellen- bzw. Formular-Felder.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

Hallo,
beschreibe mal was in der Tabelle aktualisiert wird, den Code verstehe ich nicht so ganz. Dass hier TempVars sinnvoll sind möchte ich bezweifeln. Ein einfacher Zähler würde das auch machen. Vieleicht kann ja TempVars nur bis 110 zählen, ich kenn die Dinger nicht.
Gruß Klaus

crystal

Hi Klaus,
upgedated werden in der Tabelle (via Zuweisung ins Formular) alle Felder, die mit MovieFile beginnen.
MovieFileSize = objFolder.GetDetailsOf(objFolderItem, 1) setzt z.B. die Größe des Movies.

Die TempVars können definitiv größer als 111 werden (siehe auskommentierte Sequenz: tempvars("cnt") läuft hier bis z.B. 3000 (Anzahl der Records der Test-Tabelle).

Könnte man auch mit einfachen Variablen lösen, aber ich wollte tempvars mal ausprobieren...
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

crystal

Und:

Wie könnte ich meine Sub in eine Abfrage einbinden?

Ich vermute, dass Access einfach etwas Zeit braucht, um den Recordset (des Formulars) zu aktualiseren, deshalb meine flush-Idee. Fraglich ist, was Access intern benutzt - ADO oder DAO (vermutlich).

Um eventuelle Probleme mit der shell zu umgehen, setze ich alle betr. Variablen explizit auf nothing, owohl dies wohl nicht erforderlich wäre.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

crystal

Hallo,
Ich habe das Thema auf 'gelöst' gesetzt. Meine 'Lösung' ist es, docmd.gotorecord heraus zu nehmen und die page-down-Taste festzuklemmen.

Bitte nicht lachen - oder doch, dann aber laut!

Interessante Beobachtung dabei:

1. wenn mehrere Dateien in einem Directory vorhanden sind, werden diese sehr schnell abgearbeitet. Offensichtlich puffert die shell das zuletzt benutzte Verzeichnis, obwohl ich die Variablen ja auf nothing setze.
2. docmd.gotorecord verhält sich anders als 'page down'. Vermutlich hat microsoft bei ersterem irgendwelche Initialisierungen vergessen (oder es werden zwei unterschiedliche Routinen aufgerufen - was zu microsofts eher prozeduralem Programmierstil passen würde - zumindest bei Nicht-.Net-Applikationen).
3. auch eine Änderung auf public Variable als Ersatz für tempvars hat keine Änderung gebracht.

Egal - da mein 'Scan' nicht dauernd laufen muss und es sich eher um eine einmalige Aktion handelt, ist die 'Lösung' mit der festgeklemmten  Taste OK.

Und: der Code funktioniert, um erweiterte Attribute auszulesen.


Lach. (Es gibt so schöne animierte smilies, wo der smilie lachend auf den Tisch klopft... weiß nur nicht, wie ich sowas hier einbinden könnte...)

Grüsse,

crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...