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.
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 ?
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.
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.
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...
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.
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