none
Fehler 80020009 in einem Formular

    Frage

  • Ich verwende eine Tabelle mit 1:n-Verknüpfung zu Personendaten, d.h. eine Tabelle mit Auftragsdaten soll mit Datensätzen der Personendaten verknüpft sein.

    Das funktioniert auch im Allgemeinen ganz gut, aber....

    Im Auftrags-Anlegeformular werden auch die aktuellen Personendaten abgefragt. Man kann schön sehen, dass der Verknüpfungschlüssel zunächst bei Neu-Anlegen NULL ist, und in eine Zahl geändert wird, sobald man ein Zeichen in die Felder für  name, Vorname oder Geburtsdtaum eingibt.

    Soweit so gut.

    Der Programmcode legt nun beim Anlegegn eines Auftrages unter Uumständen Dummy-Personendaten an, weil ich oft Aufträge anonymisiert erhalte, meine DB aber die Angabe einer Person verlangt.

    So, nun hat man Dummy-Daten nebst einem Verknüpfungsschlüssel.

    Nun kommt es aber vor, dass ich noch während der Anlage eines neuen Auftrages die verknüpfte Person ändere, weil die Daten bereits zuvor erfasst wurden.

    Letztlich wird in einem solchen Fall nur per VBA-Code ein anderer Verknüpfungsschlüssel in das Feld ME.GA_ProbandNr geschrieben.

    Und dies löst manchmal o.g, Fehler aus - Dabei ist doch der verknüpfungscchlüssel in der Tabelle Perosndendaten vorhanden

    ich vermute, der Fehler tritt auf, solange der Auftragsdatensatz noch nicht gespeichert ist.

    Ich habe einen identisches Problem noch an einer anderen Stelle und noch keine Lösung. Dort ist es so, dass ich problemlos den Schlüssel zu einer Person ändern kann, sobald der Auftragsdatensatz gespeichert wurde.

    Wie aber bewerkstellige ich das, wenn der DS noch nicht ersmalig gepsiechert wurde - Zurücksetzen auf NULL geht leider auch nicht.

     

    Dienstag, 19. Oktober 2010 15:57

Antworten

  • Hallo,

    NicoNi wrote:

    Allerdings ist nicht gewährleistet dass zum Zeitpunkt der Dateneingabe
    (und auch dann wenn Me.Dirty käme) bereits alle notwendigen Daten
    eingegeben sind. ich würde also wahrscheinlich wieder einen Fehler
    auslösen.

    Naja, Mussfelder muessen gefuellt sein und am besten prueft man das in
    Form_BeforeUpdate, wo per Cancel=True die Ereigniskette abgebrochen werden kann. Beispiel:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
     If Nz(Me!Mussfeld1.Value, "") = "" Then
       MsgBox "Mussfeld1 leer"
       Cancel = True
       Exit Sub
     End If
     If Me!MussFeld2.Value = 0 Then
     ...

    Allerdings wird dir das deine Prozedur durcheinander bringen, weil du durch
    Me.Dirty=False Ereignisse ausloest, die auf die aktuelle Prozedur Einfluss
    haben. Du solltest also schon vor dem Aufruf deiner Prozedur eine
    Mussfeldpruefung machen.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Freitag, 22. Oktober 2010 10:04
    Moderator

Alle Antworten

  • Hallo,

    Aufgrund deiner Beschreibung und ohne irgendwelchen Code zu sehen ist eine
    Analyse schwierig. Welche Access-Version setzt du ein?

    NicoNi wrote:

    [...]
    ich vermute, der Fehler tritt auf, solange der Auftragsdatensatz noch
    nicht gespeichert ist.

    Falls es daran liegen sollte, kannst du die Speicherung erzwingen:

      Me.Dirty = False

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Mittwoch, 20. Oktober 2010 09:46
    Moderator
  • Ich verwende Acc2007

    Auf den ersten Blick ist wohl Me.Dirty=false eine gute Lösung.

    Allerdings ist nicht gewährleistet dass zum Zeitpunkt der Dateneingabe (und auch dann wenn Me.Dirty käme) bereits alle notwendigen Daten eingegeben sind. ich würde also wahrscheinlich wieder einen Fehler auslösen.

    ich werde es trotzdem mal probieren.

     

    Freitag, 22. Oktober 2010 06:44
  • Hallo,

    NicoNi wrote:

    Allerdings ist nicht gewährleistet dass zum Zeitpunkt der Dateneingabe
    (und auch dann wenn Me.Dirty käme) bereits alle notwendigen Daten
    eingegeben sind. ich würde also wahrscheinlich wieder einen Fehler
    auslösen.

    Naja, Mussfelder muessen gefuellt sein und am besten prueft man das in
    Form_BeforeUpdate, wo per Cancel=True die Ereigniskette abgebrochen werden kann. Beispiel:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
     If Nz(Me!Mussfeld1.Value, "") = "" Then
       MsgBox "Mussfeld1 leer"
       Cancel = True
       Exit Sub
     End If
     If Me!MussFeld2.Value = 0 Then
     ...

    Allerdings wird dir das deine Prozedur durcheinander bringen, weil du durch
    Me.Dirty=False Ereignisse ausloest, die auf die aktuelle Prozedur Einfluss
    haben. Du solltest also schon vor dem Aufruf deiner Prozedur eine
    Mussfeldpruefung machen.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Freitag, 22. Oktober 2010 10:04
    Moderator