2016-06-29 7 views
0

Mein Access 2010-Formular wird zur Dateneingabe verwendet. Einige Felder manuell (Eingabe oder Auswahl aus einer Dropdown-Liste), einige andere Felder erhalten vorberechnete Werte in Abhängigkeit von den bereits eingegebenen Daten. Zusätzliche Code-Steuerelemente zum Aktivieren oder Deaktivieren von Eingabefeldern, die von den Eingabedaten abhängen (Sicherstellung der Datenkonsistenz).Fehlermeldung im Access-Formular mit sowohl manuellen als auch berechneten Dateneinträgen

Mein Problem: Wenn ich einen Wert (von einem Dropdownlist) in einem Feld dann zum nächsten Feld (jede Methode: Maus/tab/code) wechseln wählen und versuchen, einen Wert einzugeben, erhalte ich eine [fehlerhafte ] Fehlermeldung, dass "ein anderer Benutzer" (offensichtlich mein eigener VBA-Code) diesen Datensatz geändert und gespeichert hat, bevor meine eigenen Änderungen gespeichert wurden. Aber alles ist in Ordnung und der zweite Versuch, Daten einzugeben, ist erfolgreich.

Ich habe Me.Recalc und Me.Refresh an verschiedenen Positionen im Code versucht, ohne diesen ekligen Fehler zu beseitigen. Wie kann ich Access 2010 mitteilen, dass meine Eingabedaten in einem Feld gespeichert werden sollen, bevor Sie den Code [MyPreviousField_AfterUpdate()] ausführen?

+0

DoCmd.RunCommand acCmdSaveRecord –

Antwort

0

docmd.RunCommand acCmdSaveRecord funktioniert leider überhaupt nicht, da meine problematischen Felder nicht gebunden sind. Es ist die Mischung aus verknüpften und ungebundenen Feldern, die Access nicht wie erwartet verarbeiten kann. Das Deaktivieren von Fehlermeldungen oder das Sperren von Aufnahmen oder sogar Me.Undo oder Me.MyField1.Undo funktionieren überhaupt nicht.

Allerdings habe ich jetzt selbst einen Workaround gefunden. Beachten Sie, dass die einfache Einstellung des Fokus auf ein anderes Feld manchmal Zugriff auf die Werte schiebt, um die Werte zu speichern und die fehlerhafte Fehlermeldung zu vermeiden. Dies schlägt jedoch häufig fehl. Folgender Code auch nicht immer funktioniert, aber ist praktikabel für nur wenige Änderungen in der Form:

Dim MyFieldVal1 As Variant, MyFieldVal2 As Variant ', … [all unbound fields] 
Private Sub MyField1_Change() 
    … 
    If Not IsNull(Me![MyField1]) Then MyFieldVal1 = Me![MyField1] 
    If Not IsNull(Me![MyField2]) Then MyFieldVal1 = Me![MyField2] 
    …  ' same for all unbound fields on the form 
    Call SaveAllValues(Me.Name, Me.CurrentRecord) 
    … 
    … ' here all code to change any field but WITHOUT Me.Refresh 
    … 
    Me![MyField1] = MyFieldVal1 
    Me![MyField2] = MyFieldVal2 
    …  ' same for all unbound fields on the form 
    Me.Refresh 
End Sub 
'=================================================== 
Sub SaveAllValues(ByVal FormName, ByVal CurRec) 
    DoCmd.GoToRecord acDataForm, FormName, acFirst 
    DoCmd.GoToRecord acDataForm, FormName, acGoTo, CurRec 
End Sub 

Die ganze Prozedur wie oben Code mühsam ist, muss für jedes ungebundenes Feld implementiert werden: MyField2_Change() etc. etc.

Es hat eine ganze Weile korrekt funktioniert, aber nach kleineren Änderungen an anderen Stellen im Code erscheinen die Fehler wieder reproduzierbar! Offensichtlich hängt das Ergebnis von der letzten Codekompilierung von Access ab, was manchmal zu anderen erratischen Problemen führt. Wahrscheinlich ist das Modul beschädigt (Datenbankreparatur korrigiert nichts). Ich muss mit dem fehlerhaften Fehler leben oder ein neues Formular von Grund auf neu entwerfen ...

Vielleicht ist es einfach unmöglich, gebundene und ungebundene Felder auf dem gleichen Formular zu mischen, man hat keine andere Möglichkeit als Unterformulare für die gebundene Daten?

0

Abschlussbericht: Es ist nur noch ein weiterer MS-Access-Bug!

Ich habe mein Formular zu einem Hauptformular mit einer Anzahl von Datenbankfeldern und einem Unterformular mit drei ungebundenen Feldern umgestaltet. Dies ändert natürlich die Navigationsreihenfolge zwischen Feldern. Derselbe Fehler wie zuvor beschrieben tritt jedes Mal auf, wenn von einem ungebundenen Feld zu einem anderen ungebundenen Feld auf dem Unterformular gewechselt wird, und dann zu einem Datenbankfeld auf dem Hauptformular.

Das Problem wird durch Zugabe von folgenden Zeilen an dem Ende jedes ungebundenen Feldänderungsverfahren gelöst:

Private Sub MyUnboundField1_Change() 
    … 
    Me.Refresh 
    Me.Parent.Requery 
End Sub