none
Laufzeitfehler 80020009 und 'Sie können diesem Obejkt keinen Wert zuweisen'

    Frage

  • obige Fehler beschäftigen mich seit Monaten, ohne dass ich eine Lösung gefunden habe. Eine Anfrage vor Wochen hat keine Lösung gebracht.

    - Die Acc2007-DB ist auf einer netzwerk-freigabe gespeichert und wid NUR von einem Rechner aus geöffnet.

    - Es gibt keine Frontend/Backend-Aufteilung

    - Der Fehler entsteht innerhalb eines Button_clicked Codes eines Formulars

    Die dem Formular zugrundeliegende ABfrage verknüpft zahlreiche Tabellen,  unter anderem die Tabelle "Rechnungen" mit der Tabelle "Auftraege" über eine 1:1 Verknüfpung (Pfeil am Rechnugen-Ende der Beziehung und an beiden Enden eine '1')

    Im Code weise ich an 2 Stellen jeweils Feldern der Tabelle Rechnung Werte zu, und zwar in unterscheidlöicher Technik:

    1.  Wert in das zugehörige Textfeld schreiben -> Laufzeitfehler 80020009

    2. Wert direkt in das Tabellenfeld  schreiben - >'Sie können diesem Obejkt keinen Wert zuweisen'

    In beiden Fällen poppt die Box mit der Fehklermeldung auf, ich klicke auf debuggen, anschliessend auf F5 und alles funktioniert wie gwünscht.

    Mich irritiert vor allem, dass der Code nach der Verzögerung durch debuggen und anschl. F5 anscheinend ausführbar ist , wie als bräuchte Access eine kleine Pause.

    Was kann ich tun ?

    Mittwoch, 19. Oktober 2011 13:24

Antworten

  • Hallo,

    NicoNi wrote:

    Die Aufteilung Frontend-/Backend steht sicherlich an, aber den Aufwand
    habe ich bislang gescheut.

    ?
    Den Assistenten zur Aufteilung aufrufen und starten (in 2010 im Ribbon
    Datenbanktools - Daten verschieben - Access-Datenbank), mehr nicht.

    Wäre das generell günstig - DB auf Netzwerk, Frontend lokal ?

    Ja, klar. Schau dir mal http://www.donkarl.com?FAQ1.35 an.

    Public Sub Rechnungsnummer_generieren()

    Aus welchem Ereignis wird die Prozedur denn aufgerufen?

        Me.Dirty = False

    Dir ist bewusst, dass diese Zeile u.U. andere Ereignisse ausloest, die auf
    die aktuelle Prozedur Einfluss haben koennen?

        If IsNull(Me.RE_Rechnung_Code) Then
            Debug.Print "Höchste Rechnungsnummer für diesen Gutachter: " & DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)
            If IsNull(DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)) Then
                Me.RE_Rechnung_fortlaufendeNummer = 1
            Else
                If IsNull(Me.RE_AuftragNr) Then
                    Stop
                End If
                Me.Rechnungsnummer_fortlaufend_txt = DMax("[RE_Rechnung_fortlaufendeNummer]", "Rechnungen", "[GA_Gutachter]=" & Me.GA_Gutachter) + 1

    Weiter oben schreibst du den Wert in Me.RE_Rechnung_fortlaufendeNummer und
    hier nicht. Ist das gewollt?

        If Me.Dirty Then
            DoCmd.RunCommand acCmdSaveRecord

    Hier kannst du genauso
     Me.Dirty = False

    verwenden. acCmdSaveRecord steht nur zur Verfuegung, wenn der Menuepunkt
    vorhanden ist.

    Gruss - Peter


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

    • Als Antwort markiert NicoNi Donnerstag, 20. Oktober 2011 09:53
    Donnerstag, 20. Oktober 2011 09:02
    Moderator

Alle Antworten

  • Hallo,

    NicoNi wrote:

    - Die Acc2007-DB ist auf einer netzwerk-freigabe gespeichert und wid NUR
    von einem Rechner aus geöffnet.

    - Es gibt keine Frontend/Backend-Aufteilung

    Warum nicht?

    - Der Fehler entsteht innerhalb eines Button_clicked Codes eines
    Formulars

    Zeig mal den Code und markiere die Zeile, die den Fehler ausloest.

    Im Code weise ich an 2 Stellen jeweils Feldern der Tabelle Rechnung
    Werte zu, und zwar in unterscheidlöicher Technik:

    1.  Wert in das zugehörige Textfeld schreiben -> Laufzeitfehler 80020009


    2. Wert direkt in das Tabellenfeld  schreiben - >'Sie können diesem
    Obejkt keinen Wert zuweisen'

    Oeffne mal die Abfrage und versuch, diese Felder zu aktualisieren. Wenn das
    auch schon nicht geht, zeig mal die Abfrage.

    Gruss - Peter


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

    Mittwoch, 19. Oktober 2011 13:34
    Moderator
  • Die Aufteilung Frontend-/Backend steht sicherlich an, aber den Aufwand habe ich bislang gescheut.

    Wäre das generell günstig - DB auf Netzwerk, Frontend lokal ?

    HIer kommt der erste (Teil-)code:

    Public Sub Rechnungsnummer_generieren()
        'If IsNull(Me!Rechnung_Datum_txt) Then
         '   Me.Rechnung_Datum_txt = Now()
        'End If
       
       
       
        Me.Dirty = False
       
        If IsNull(Me.RE_Rechnung_Code) Then
            Debug.Print "Höchste Rechnungsnummer für diesen Gutachter: " & DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)
            If IsNull(DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)) Then
                Me.RE_Rechnung_fortlaufendeNummer = 1
            Else
                If IsNull(Me.RE_AuftragNr) Then
                    Stop
                End If
                Me.Rechnungsnummer_fortlaufend_txt = DMax("[RE_Rechnung_fortlaufendeNummer]", "Rechnungen", "[GA_Gutachter]=" & Me.GA_Gutachter) + 1
            End If
           
            Me.RE_Rechnung_Code = Year(Now) & "-" & Format(Me.RE_Rechnung_fortlaufendeNummer, "00000")
            Debug.Print "neu generierte Rechnungsnummer:", Me.RE_Rechnung_fortlaufendeNummer
        End If
           
        If Me.Dirty Then
            DoCmd.RunCommand acCmdSaveRecord
        End If
       
        DoCmd.Requery
       
        'jetzt muss noch wieder auf den Datensatz gesetzt werden.
    End Sub

    es klemmt in der fett gedruckten Zeile ...

    das Me.Dirty... ist glaube ich mal hineingeraten um den Fehler zu beheben. ->könnte es das sein ?

     

    Mittwoch, 19. Oktober 2011 15:20
  • Am 19.10.2011 schrieb NicoNi:

    Die Aufteilung Frontend-/Backend steht sicherlich an, aber den Aufwand habe ich bislang gescheut.

    Welcher Aufwand? 1 Minute ist kein Aufwand.

    Wäre das generell günstig - DB auf Netzwerk, Frontend lokal ?

    Nicht günstig, sondern IMHO nötig.

                Me.Rechnungsnummer_fortlaufend_txt = DMax("[RE_Rechnung_fortlaufendeNummer]", "Rechnungen", "[GA_Gutachter]=" & Me.GA_Gutachter) + 1

    es klemmt in der fett gedruckten Zeile ...

    Ist Me.Rechnungsnummer_fortlaufend_txt ein ungebundenes Textfeld oder
    die Datengrundlage aus der Tabelle?

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Mittwoch, 19. Oktober 2011 18:30
  • Hallo,

    NicoNi wrote:

    Die Aufteilung Frontend-/Backend steht sicherlich an, aber den Aufwand
    habe ich bislang gescheut.

    ?
    Den Assistenten zur Aufteilung aufrufen und starten (in 2010 im Ribbon
    Datenbanktools - Daten verschieben - Access-Datenbank), mehr nicht.

    Wäre das generell günstig - DB auf Netzwerk, Frontend lokal ?

    Ja, klar. Schau dir mal http://www.donkarl.com?FAQ1.35 an.

    Public Sub Rechnungsnummer_generieren()

    Aus welchem Ereignis wird die Prozedur denn aufgerufen?

        Me.Dirty = False

    Dir ist bewusst, dass diese Zeile u.U. andere Ereignisse ausloest, die auf
    die aktuelle Prozedur Einfluss haben koennen?

        If IsNull(Me.RE_Rechnung_Code) Then
            Debug.Print "Höchste Rechnungsnummer für diesen Gutachter: " & DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)
            If IsNull(DMax("[Re_Rechnung_fortlaufendenummer]", "Rechnungen", "[RE_Rechnung_GutachterNr]=" & Me.GA_Gutachter)) Then
                Me.RE_Rechnung_fortlaufendeNummer = 1
            Else
                If IsNull(Me.RE_AuftragNr) Then
                    Stop
                End If
                Me.Rechnungsnummer_fortlaufend_txt = DMax("[RE_Rechnung_fortlaufendeNummer]", "Rechnungen", "[GA_Gutachter]=" & Me.GA_Gutachter) + 1

    Weiter oben schreibst du den Wert in Me.RE_Rechnung_fortlaufendeNummer und
    hier nicht. Ist das gewollt?

        If Me.Dirty Then
            DoCmd.RunCommand acCmdSaveRecord

    Hier kannst du genauso
     Me.Dirty = False

    verwenden. acCmdSaveRecord steht nur zur Verfuegung, wenn der Menuepunkt
    vorhanden ist.

    Gruss - Peter


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

    • Als Antwort markiert NicoNi Donnerstag, 20. Oktober 2011 09:53
    Donnerstag, 20. Oktober 2011 09:02
    Moderator
  • Zunächst mal vielen Dank.

    Die Aufteilung in BE/FE hat anscheinend wirklich in 1 Minte reibungslos geklappt.

    Die Me.Dirty's habe ich probeweise auskommentiert.

    Bei einem Test-Datensatz hat es jetzt reibungslos geklappt - Jubel!!!!!!!

     

    Ich werde mal beobachten, wie es sich bei realen Daten bewährt.

     

    Donnerstag, 20. Oktober 2011 09:52