Access Fehler: beim Öffnen von Access werden abgespeicherte Werte in einer Tabelle auf den Wert der vorletzten Schließung von Accesss zurückgestellt .

Anonym
2021-02-12T13:44:43+00:00

Anwendung mit zwei Arbeitsplätzen mit einer Access Anwendung mit zwei Datenbanken, einer Daten Datenbank und einer Programmdatenbank und aktuellem Microsoft 365. 

Fehlerbeschreibung:
Vor dem Schließen von Access zeigt eine Tabelle korrekte Werte an:

Beispiel:

Rechnungsnummer:  120
Reparaturauftragsnummer: 1002

Nach dem Schließen und Wiederöffnen von Access stehen falsche Werte in der Parametertabelle.

Beispiel:

Rechnungsnummer: 108
Reparaturauftragsnummer: 98

Beim Öffnen findet keine progammgesteuerte Verarbeitung statt.

Dieser Fehler tritt sporadisch, immer nur an einem bestimmten Arbeitsplatz auf.

In einigen Fällen stammten die Werte aus der vorletzten Schließung von Access.

Ich würde mich über eine Rückmeldung freuen.

Gruß Hanns

Microsoft 365 und Office | Access | Für Zuhause | Windows

Gesperrte Frage. Diese Frage wurde aus der Microsoft-Support-Community migriert. Sie können darüber abstimmen, ob sie hilfreich ist, aber Sie können keine Kommentare oder Antworten hinzufügen oder der Frage folgen.

0 Kommentare Keine Kommentare

33 Antworten

Sortieren nach: Neueste
  1. Anonym
    2021-03-25T17:29:32+00:00

    Hallo, Hanns!

    Gern geschehen.

    Ich mache gelegentlich Weiterbildungen für kleinere IT-Abteilungen, die (auch) mit Access arbeiten. Ein wichtiges Element dabei sind Agile Techniken wie Pair Programming. Da geht's u.a. genau um das, was du zitierst. Ein qualifizierter zweiter Mitmacher oder auch nur regelmäßiger Drüberschauer erhöht die SW-Qualität erheblich. Das wird gerne unterschätzt bzw. vernachlässigt, besonders im Access-Umfeld der unzähligen Einzelkämpfer.

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  2. Anonym
    2021-03-25T15:22:05+00:00

    Hallo Karl,

    in der Zwischenablage stand Text201 und der Name des Kunden.

    Als ich in meinem Code nach Text201 suchte fand ich:

    Dim Text201

    Offensichtlich eine abgebrochen Felddefinition, die nirgends verwendet wird. Als ich sie entfernte war der Fehler weg.

    Ich habe Wochen gebraucht um diesen simplen Fehler zu finden, erinnerte mich an ein Buch mit dem Titel „The Psychology of Computer Programming“ von Gerald Weinberg, das ich während meiner Ausbildung zum Programmierer gelesen habe, und jetzt wieder hervorgeholt habe, dort schreibt Weinberg auf Seite 55: A programmer who truly sees his program as an extension of his own ego is not going to be trying to find all the errors in that program. On the contrary, he is going to be trying to prove that the program is correct – even if this means to oversight of errors which are monstrous to another eye.”

    Danke für Deine Hilfe, sie war extrem wertvoll.
    Gruß Hanns

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  3. Anonym
    2021-03-19T23:20:56+00:00

    Hallo, Hanns!

    Für einen Aussenstehenden ist schwer zu sagen, was da schief geht, besonders mit einer theoretischen Beschreibung, ohne die Abläufe im Zusammenhang wirklich zu sehen und zu verstehen. Zudem verwende ich ADO nur selten und UpdateBatch nie. Vielleicht liest hier jmd. mit, der das tut und die Fallen kennt, LockTypes etc.

    Was ich wahrscheinlich machen würde, ist, die (versuchten) Updates mitzuloggen. In deinen Ausschnitten sehe ich 1 * normales und 2 * UpdateBatch, also nicht sehr viele potentielle Schuldige. Du könntest in den Zeilen direkt vor und nach den Update-Kandidaten aussagekräftige Werte für die Situation (Zeit, Prozedur, Rg-Nr, Sperr-Kz etc.) in eine Logtabelle wegschreiben. Dann bekommst du vielleicht heraus, in welcher Situation, welche Update-Codestelle misslingt und warum.

    Vielleicht bringt es auch was, im Konfliktdialog die Zwischenablage-Option zu wählen und dir das Ergebnis in einem Editor anzusehen. Da könnte erkennbar sein, welches Update es genau ist und was darin alles versucht wird, zu schreiben.

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  4. Anonym
    2021-03-19T14:35:44+00:00

    Hallo Karl,
    ich habe heute beim Schließen der Datenbank auf die Aufforderung Speichern, Zwischenablage oder Eigene Änderungen verwerfen mit "Eigene Änderungen verwerfen" geantwortet. Wie schon erwartet war die Parametertabelle nicht verstellt, damit ist Deine These vom hängenden Schreibprozess bestätigt.

    "wo und wie die Nummern in die Parametertabelle geschrieben werden.

    Das ist natürlich insg. der Hauptaspekt, den es zu prüfen gilt."

    Ich bin wie folgt vorgegangen um den hängenden Schreibprozess zu finden: Ich konnte in meiner Recherche die Rechnung ausfindig machen,  die **** den hängenden Schreibprozess ausgelöst hat. Ich konnte sie aufgrund der zurückgesetzten  Rechnungsnummer und Auftragsnummer ermitteln. Im Folgenden habe ich den Sourcode überall dort wegelassen in der diese Auftragsart (Reparaturrechnung) und die Parametertabelle nicht involviert war.

    Programmstruktur

    Das Rechnungserstellungsprogramm ruf gleich bei Start eine Prozedur**VorbereitenRechnungsschreibung auf.**In dieser Prozedur wird die Parametertabelle gelesen. Zuerst wird geprüft, ob sie gesperrt ist, wenn ja wird gewartet und ein neuer Versuch unternommen. Wenn Sie frei ist, wird die Sperre gesetzt und die zuletzt gelesene Rechnungsnummer geholt. Die geholte Rechnungsnummer wird an die aufrufende Prozedur übergeben.  Die Prozedur findest Du weiter hinten.  Die aufrufende Prozedur erhöht die geholte Rechnungsnummer um einen Zähler, und erstellt die Rechnung.

    Der Update der Rechnungsnummer in der Parametertabelle erfolgt erst am End der Hauptprozedur.

    Bei erfolgreicher Rechnungsstellung wird die aktuelle Rechnungsnummer in die Parameter Tabelle zurückgeschrieben. Bei einem Abbruch erfolgt keine Rückschreibung in die Parametertabelle.

    Sub RechnungenErstellen(ByVal Monat, ByVal Monatnumerisch, ByVal Rechnungsart, ByVal AuftragsID, ByVal Rechnungsvorschau, _

    ByVal AutomatischeRechnungsschreibung, Abbruch)

    Call datenbanköffnenLiftWin(l_cn)

    Call VorbereitenRechnungsschreibung(ByVal Rechnungsart, ByVal AutomatischeRechnungsschreibung, Firmenkürzel, _

    Rechnungsnummer, ArbeitenmitKontonummer, mehrwertsteuersatzstandard, StundensatzStandard, Monteurnameausweisen, _

    Währungskurszwischenspeicher, AnlagenPfad, Rechnungsdatum, Nachschüssig)

    If Abbruchkennzeichen = True Then

         'MsgBox ("Abbruch")

         DoCmd.RunMacro "Sanduhraus"

         Exit Sub

    End If

      'Rechnungsnummer           '

          'Prüfen, ob Rechnungsnummer nicht schon vergeben wurde

         Set l_rs30 = CreateObject("ADODB.Recordset")

     l_rs30.CursorLocation = adUseClient

     l_rs30.CursorType = adOpenStatic

     l_rs30.LockType = adLockBatchOptimistic

     l_sSQL = " SELECT * From Statistik where Rechnungsnummer=" & Rechnungsnummer

     l_rs30.Open l_sSQL, l_cn

     If l_rs30.RecordCount > 0 Then

    MsgBox ("Die zugeordnete Rechnungsnummer " & Rechnungsnummer & " für die " & Rechnungsart & " ist schon vergeben, " _

    & " Abbruch für diese Rechnungsart und Fabriknummer " & Fabriknummer & ". Bitte Support anrufen.")

     Abbruch = True

     DoCmd.RunMacro "Sanduhraus"

     Exit Sub

     End If

    'Vergabe Rechnungsnummer              

              Rechnungsnummer = Rechnungsnummer + 1

             'Code zum Erstellen der Rechnung. Die Parametertabelle wird nicht gelesen. .............................................

                Call StatistikBuchen(ByVal Auftragsart, ByVal Rechnungsnummer, ByVal Positionsnummer, ByVal Konto, _

    ByVal Firma, ByVal Rechnungsdatum, ByVal Rechnungstext, _

    ByVal Gesamtpreis, ByVal Fabriknummer, ByVal Personalnummer, ByVal Serviceauftragsnummer, _

    ByVal MitarbeiterNachname, ByVal Mehrwertsteuersatz, _

    ByVal ZahlungsbedingungfürStatistik, ByVal FirmenZusatz, ByVal Zahlungsdatum)

    Im Modul StatistikBuchen wird die Parametertabelle gelesen, und es wird der Mehrwertsteuersatz ausgelesen.  Siehe Modul StatistikBuchen weiter hinten. 

    'Hier erfolgt bei erfolgreicher Rechnungsschreibung das Zurückschreiben der zuletzt verwendeten Rechnungsnummer in die Parametertabelle

        'Zurückschreiben zuletzt vergebene Rechnungsnummer

     Set l_rs3 = CreateObject("ADODB.Recordset")

    l_rs3.CursorLocation = adUseClient

    l_rs3.CursorType = adOpenStatic

    l_rs3.LockType = adLockBatchOptimistic           

     l_sSQL = " Update Parameter set Rechnungsnummer=" & Rechnungsnummer            

     l_rs3.Open l_sSQL, l_cn

    'Fakturiersperre rausnehmen und Arbeitstabellen löschen Modul ist weiter hinten einsehbar

      clearRechnungstabellen

        Call Rechnungsschreibung(ByVal Rechnungsart, ByVal AuftragsID, ByVal Rechnungsvorschau)
          'Rechnungsschreibung aus dem Archiv die Parametertabelle wird nicht gelesen und nicht geschrieben

    End Sub

    Public Sub VorbereitenRechnungsschreibung_Doku(ByVal Rechnungsart, ByVal AutomatischeRechnungsschreibung, _

    Firmenkürzel, Rechnungsnummer, _

    ArbeitenmitKontonummer, mehrwertsteuersatzstandard, StundensatzStandard, Monteurnameausweisen, _

    Währungskurszwischenspeicher, AnlagenPfad, Rechnungsdatum, Nachschüssig)

    Call datenbanköffnenLiftWin(l_cn)

     'Parameter Lesen 1

    Set l_rs1 = CreateObject("ADODB.Recordset")

    l_rs1.CursorLocation = adUseClient

    l_rs1.CursorType = adOpenStatic

    l_rs1.LockType = adLockPessimistic

    l_sSQL = " SELECT * From Parameter"

    l_rs1.Open l_sSQL, l_cn

    'Bei der automatisierten Rechnungsschreibung wurde die Fakturiersperre schon gesetzt

    'Fakturiersperre setzen oder abbrechen

    If AutomatischeRechnungsschreibung = False Then

        If l_rs1.Fields("Fakturiersperre") = True And Rechnungsart <> "RechnungennachZeitplan" And _

        Rechnungsart <> "RechnungennachDurchführung" Then

                MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")

               Abbruchkennzeichen = True

                l_rs1.Close

                Exit Sub

         Else

             If l_rs1.Fields("Fakturiersperre") = True And (l_rs1.Fields("Windowuser") <> (Environ$("USERNAME")) Or _

             IsNull(l_rs1.Fields("Windowuser"))) Then

             MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")

             Abbruchkennzeichen = True

                    l_rs1.Close

                    Exit Sub

             End If

             If l_rs1.Fields("Fakturiersperre") = True And l_rs1.Fields("Windowuser") = (Environ$("USERNAME")) And _

             (l_rs1.Fields("ZurückgesetzteRechnungsnummer") = 0 _

             Or IsNull(l_rs1.Fields("ZurückgesetzteRechnungsnummer"))) Then

             MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")

             Abbruchkennzeichen = True

                    l_rs1.Close

                    Exit Sub

             End If

             'Parameter Schreiben Fakturiersperre 1

             'Setzen Fakturiersperre 1

             l_rs1.Fields("Fakturiersperre") = True

             l_rs1.Fields("Windowuser") = (Environ$("USERNAME"))

             On Error GoTo FehlerVorbereitungRechnungsschreibung

              l_rs1.UpdateBatch

         End If

    End If

    Rechnungsnummer = l_rs1.Fields("Rechnungsnummer")

    'Parametertabelle wird geschlossen 1

    l_rs1.Close

    Exit Sub

    FehlerVorbereitungRechnungsschreibung:

    l_rs1.Close

    MsgBox ("Fehler in der Vorbereitung zur Rechnungsschreibung. Abbruch Bitte rufen Sie die Rechnungsschreibung noch einmal auf.")

    Abbruchkennzeichen = True

    End Sub

    Sub StatistikBuchen_doku(ByVal Auftragsart, ByVal Rechnungsnummer, ByVal Positionsnummer, ByVal Konto, ByVal Firma, _

    ByVal Rechnungsdatum, ByVal Rechnungstext, ByVal RechnungsPreis, ByVal Fabriknummer, ByVal Personalnummer, _

    ByVal Serviceauftragsnummer, ByVal MitarbeiterNachname, ByVal Mehrwertsteuersatz, ByVal ZahlungsbedingungService, _

    ByVal FirmenZusatz, ByVal Zahlungsdatum)

    RechnungsnummerGleich = Rechnungsnummer

    If IsNull(Fabriknummer) Or Trim(Fabriknummer) = "" Or IsEmpty(Fabriknummer) Then Fabriknummer = "Diverse"

    If IsNull(Personalnummer) Or Trim(Personalnummer) = "" Or IsEmpty(Personalnummer) Then Personalnummer = 0

    'Verbinden mit der Datenbank

    Call datenbanköffnenLiftWin(l_cn)

    'Lesen Parameter

    Set l_rs1 = CreateObject("ADODB.Recordset")

    l_rs1.CursorLocation = adUseClient

    l_rs1.CursorType = adOpenStatic

    l_rs1.LockType = adLockBatchOptimistic

    l_sSQL = " SELECT * From Parameter"

    l_rs1.Open l_sSQL, l_cn

    mehrwertsteuersatzstandard = l_rs1.Fields("Mehrwertsteuersatz")

    Firmenkürzel = l_rs1.Fields("Firmenkürzel")

    l_rs1.Close

    'Parametertabelle wird geschlossen 2

    End Sub

    Sub clearRechnungstabellen_Doku()

    DoCmd.RunMacro "CleartemporäreRechnungstabellen"

    Call Wait(4)

     'Fakturiersperre löschen

    Call datenbanköffnenLiftWin(l_cn)

      Set l_rs3 = CreateObject("ADODB.Recordset")

    l_rs3.CursorLocation = adUseClient

    l_rs3.CursorType = adOpenStatic

    l_rs3.LockType = adLockPessimistic

    l_sSQL = " Select * from  Parameter"

    l_rs3.Open l_sSQL, l_cn

    l_rs3.Fields("Fakturiersperre") = False

    l_rs3.Fields("Windowuser") = Null

    l_rs3.UpdateBatch

    l_rs3.Close

    l_cn.Close

    weiter:

    End Sub

    Ich kann keinen Fehler finden. Hast Du eine Idee was ich falsch mache?

    Gruß Hanns

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  5. Anonym
    2021-03-18T19:41:52+00:00

    Hallo, Karl,

    du stimmst mir also nicht zu und Du hast Recht, Ursache eines hängenden Schreibprozesses ist eine unsaubere Programmierung.

    „Naja, wenn ich deine Bilder richtig interpretiere, dann hast du da einen hängenden Schreibprozess. Der kann durch die Programmoberfläche passiert sein oder durch Code oder - was sehr oft der Fall ist, besonders, wenn nur ein einzelner Benutzer involviert ist - durch eine Kombination aus beidem“

    .

    1. Parameter-Programmlogik

    „Ich kenne deine Programmlogik nicht, d.h. wann, wo und wie die Nummern in die Parametertabelle geschrieben werden.

    Das ist natürlich insg. der Hauptaspekt, den es zu prüfen gilt.“
    Vergabe der Rechnungs-, Auftrags- und Wartungsauftragsnummer

    In der Parametertabelle sind die letzte vergebene Rechnungsnummer, Auftragsnummer und Wartungsauftragsnummer hinterlegt.

    Benötigt eine Anwendung eine Rechnungsnummer liest sie die Parametertabelle, prüft, ob die Tabelle exklusiv gelesen wurde, anhand der Parametersperre, falls nein, wird eine Pause eingelegt (Wait) und ein neuer Versuch gestartet, falls jetzt die Tabelle frei ist, wird die Sperre gesetzt und die Tabelle erneut gelesen und die zuletzt gespeicherte Rechnungsnummer ausgelesen, und um den Zähler um 1 erhöht. Anschließend wird die Rechnungstabelle gelesen und es wird geprüft, ob diese Nummer noch nicht vergeben wurde. Falls Ja erfolgt ein Abbruch. Nach Beendigung der Rechnungsschreibung wird die aktuelle Rechnungsnummer in die Parametertabelle geschrieben und die Sperre frei gegeben.

    Die Nummernvergabe für die Reparaturauftragsnummern und Wartungsauftragsnummern erfolgt in gleicher Weise.

    „2. Kannst du dir den Schreibkonflikt erklären?

    Du müsstest herausfinden, ob er es ist, der die alten Nummern zurückschreibt.“

    Ich bin sicher, dass der Schreibkonflikt für den hängenden Schreibprozess verantwortlich ist.
    Bei einem meiner Kunden, erstellen die Monteure die Rechnungen auf ihren Tablets und in der Zentrale werden die nur einmal am Tag eingelesen und am Stück verarbeite, die Parametertabelle wird nur einmal gelesen und erst zurückgeschrieben, nachdem alle Rechnungen erstellt wurden. Rechnungen in der Zentrale werden nur selten geschrieben. Bei diesem Kunden tritt der Fehler nur selten auf.

    Häufig dagegen bei einem Kunden, der noch nicht mit den Tablets arbeitet. Dort wird für jede Rechnung, jeden Reparaturauftrag und jeden Wartungsauftrag die Parametertabelle gelesen und geschrieben. Ich schätze, die Parametertabelle wird bei diesem Kunden pro Tag 100 Mal gelesen und geschrieben.

    „3. > Schließen von Access mit Schließen Schaltfläche

    Was heißt das genau? Beenden von Access über das eingebaute Beenden-Kreuz im Access-Hauptfenster? Oder klickt jmd. auf eine von dir erstellte Schaltfläche in einem Formular? Welcher Code passiert da? Was genau schließt sich? Gibt es eine Verbindung zur Parameter-Tabelle? s. 3.“

    Bei dem betroffenen Kunden gibt es nur einen Arbeitsplatz. (Zwei weitere für die Chefs, die kucken aber nur). Die Mitarbeiterin lässt die Anwendung immer offen, wenn ich mich für die Fehlersuch aufschalte und ich schließe immer über das Kreuz.  

    „4. Offene Objekte, laufende Codes beim Schließen

    Gibt es relevanten Code oder Vorgänge (Formular speichert etc.), die beim Schließen deiner Anwendung ablaufen? I.d.R. passiert sowas durch das Schließen des letzten geöffneten Formulares, oft ist das auch ein "organisatorisch" genutztes, nicht sichtbares, dauernd geöffnetes Formular im Hintergrund. Verwendest du so etwas in deiner Anwendung?“

    Den gibt es, er ist aber nicht in Betrieb siehe oben.

    Dank Deiner Hilfe sehe ich jetzt schon ein wenig klarer. Einer der 100 Schreibprozesse bleibt hängen und überschreibt beim Schließen die Parametertabelle.

    Wenn die Anwender beim Schließen mit „Eigene Änderungen verwerfen“ antworten würden, wird nichts passieren, das probiere ich Morgen aus.

    Hinweis:
    Bei dem betroffenen Kunden (KKS) habe ich zum Jahreswechsel einen Update durchgeführt, seitdem gibt es den hängenden Schreibprozess.
    Der Update betraf die Rechnungserstellung via Tablet durch die Monteure (was er nicht nutzt) und das Versenden der Rechnungen via Mail.
    In der alten Version wurde eine Rechnung erstellt und in der Regel im gleichen Prozess gedruckt. Heute ist der Prozess der Erstellung der Rechnung und des Versendens oder Druckens ein eigener Vorgang, allerdings erfolgte auch in der Vergangenheit der Druck immer schon aus dem Rechnungsarchiv.  Es war also immer schon ein getrennter Prozess.

    Nächste Aktion

    1. Prüfen was passiert, wenn ausgewählt wird „Eigene Änderungen verwerfen“
    2. Allen Code prüfen indem die Parametertabelle geschrieben wird  (ein Close vergessen), das war allerdings mein erster Verdacht und ich habe es schon zwei Mal geprüft, mach ich jetzt ein Drittes Mal.

    Lieber Karl,

    ich war schon am Boden zerstört, weil ich seit Wochen mit diesem Problem nicht weiterkomme, aber seit Du dich eingeschaltet hast bin ich zuversichtlich, dass ich es schon bald zu einem guten Ende bringen kann.

    Gruß Hanns

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare