Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Laufzeitfehler 3027 bei verändern des Recordsets

Begonnen von KonradR, November 30, 2024, 08:22:21

⏪ vorheriges - nächstes ⏩

KonradR

Hallo liebe Accessgemeinschaft,

ich möchte einen Recordset verändern und habe dazu folgenden Code verwendet:
With rcsRezeptZutatenGpEinzelnGefiltert
   .Edit
   .Fields("ZutatStammWertung").Value = lngZutatSammlIDUfo1
   .Update
End With 

Der Code stoppt an der Stelle .EditWenn ich den Code durchlaufe, dann erscheint folgende Fehlermeldung:
ZitatLaufzeitfehler 3027: Aktualisieren nicht möglich; Datenbank oder Objekt ist schreibgeschützt.
Habt ihr da eine Idee, woran das liegen könnte?

Der gesamte Code der Prozedur ist (Ich hatte die Select-Case-Anweisung noch nicht gegen IF-Anweisungen getauscht, weil ich erst mal nur die Funktionalität prüfen will.):
Private Sub Form_BeforeUpdate(Cancel As Integer)
'________________________________________________________________________
'EINGABEPRÜFUNG VON STEUERELEMENT txtZugabeMenge UND cboZugabeEinheit
    Select Case True
        Case IsNull(Me.txtZugabeMenge.Value) And IsNull(Me.cboZugabeEinheit.Value)
            MsgBox "Es sind Leerzeichen in den Textfeldern ""Zugabemenge"" und ""Zugabeeinheit""" & vbCrLf & _
            "Bitte in beide Felder einen Wert eintragen."
            Cancel = True
        Case IsNull(Me.txtZugabeMenge.Value) And Me.cboZugabeEinheit.Value <> ""
            MsgBox "Es sind Leerzeichen im Textfeld ""Zugabemenge"". Bitte einen Wert eintragen."
            Cancel = True
        Case IsNull(Me.txtZugabeMenge.Value) And Not IsNull(Me.cboZugabeEinheit.Value)
            MsgBox "Bitte eine Zugabemenge eingeben"
            Cancel = True
        Case Me.txtZugabeMenge.Value = 0 And IsNull(Me.cboZugabeEinheit.Value)
            MsgBox "Bitte eine Zugabemenge > 0 und eine Zugabeinheit eingeben"
            Cancel = True
        Case Me.txtZugabeMenge.Value = 0 And Not IsNull(Me.cboZugabeEinheit.Value)
            MsgBox "Bitte eine Zugabemenge > 0 eingeben"
            Cancel = True
'        Case Not IsNull(Me.txtZugabeMenge.Value) And IsNull(Me.cboZugabeEinheit.Value): MsgBox "Bitte eine Zugabeeinheit eingeben"
            Cancel = True
        Case Not IsNull(Me.txtZugabeMenge.Value) And Not IsNull(Me.cboZugabeEinheit.Value)
    Dim ZEWert As Integer                   'Variable f. Wert des Feldes cboZugabeEinheit deklariern
    Dim rcsZugabeEinheit As DAO.Recordset   'Variable f. Recordset m.d. Tabelle tblRezeptGewicht deklariern
    Dim rcsEinheiten As DAO.Recordset       'Variable f. Recordset m.d. Tabelle tblGewichtsEinheitenName deklariern
    Dim ZEText As String                    'Variable f. Text des Feldes ZugabeEinheit deklariern
    Dim RezIDRef As Integer                 'Variable f. Zahl die in txtRezepID drin steht deklariern
    Dim db As DAO.Database              '"db" als Variable für eine Datenbank aus der DAO Bibliothek deklarieren - aktuell keine Verwendung
    Dim lngZutatSammlID As Long         '"lngZutatSammlID" als Variable für das 1. Schlüsselfeld des zu kopierenden DS deklarieren (Acces selbst vergeben lassen weil Autowert & sonst doppelt & Fehlermeldung)
    Dim lngZutatSammlIDNeu As Long      '"lngZutatSammlIDNeu" als leere Variable zur Übergabe der DS-Nummer deklarieren auf den nach der Akualisierung gesprungen werden soll
    Dim lngZutatSammlLaMaZIDRef As Long '"lngZutatSammlIDNeu" als Variable für das 2. Schlüssslfeld des zu kopierenden DS deklarieren (Acces selbst vergeben lassen weil Autowert & sonst doppelt)
    Dim lngZutatSammlRezepIDRef As Long 'Variable als Übergabe für den Wert des Fremdschlüsselfeldes ZutatSammlRezepIDRef (damit alle Zutaten des Rezepts aufgelistet werden)
    Dim lngZutatSammlRezepIDRef2 As Long 'Variable als Übergabe für den Wert des Fremdschlüsselfeldes für ZutatSammlRezepIDRef (damit alle Zutaten in den Zielrecordset kopiert werden)
    Dim SQLRcsZiel As String            '"SQL String für den Inhalt des Recordsets für das 2. Unterformular in "sfrmPopRezeptAlsZutatUnter2"
    Dim rcsRezeptZutatenGesamt As DAO.Recordset
    Dim rcsRezeptZutatenGpEinzeln As DAO.Recordset
    Dim rcsRezeptZutatenGpEinzelnGefiltert As DAO.Recordset
    Dim fld As Field
    Dim lngZutatNr As Long
    Dim rcsZutatStammName As DAO.Recordset
    Dim lngZutatSammlIDUfo1 As Integer         'Variable für den Wert 1 für das Textfeld "txtRotAn" deklarieren. Damit mit bedingter Formatierung der Hintergrund aller STE rot gefärbt
                                            'werden kann

        ZEWert = Forms("frmPopRezeptAlsZutat").Controls("cboZugabeEinheit").Value   'Variablen f. ZEWert den Wert zuweisen
        ZEText = Forms("frmPopRezeptAlsZutat").Controls("cboZugabeEinheit").Text    'Variablen f. ZEText den Wert zuweisen
        RezIDRef = Forms("frmPopRezeptAlsZutat").Controls("txtRezepID").Value       'Variablen f. RezIDRef den Wert zuweisen

        Set rcsZugabeEinheit = CurrentDb.OpenRecordset("SELECT * FROM tblRezeptGewicht WHERE rezgeEhIDRef = " & ZEWert & " AND rezgeRezepIDRef = " & RezIDRef, dbOpenDynaset)
        'Recordset der Variablen rcsZugabeEinheit zuweisen: Alle Felder aus der Tabelle tblRezeptGewicht, bei denen der Wert aus dem Feld cboZugabeEinheit mit dem
        'Tabellenfeld rezgeEhIDRef (Feld f. ID d. Fremdschlüsselfeldes f.d. Einheit) übereinstimmt UND
        'der Fremdschlüssel zur tblRezept mit dem Wert in txtRezepID (Variable: RezIDRef) übereinstimmt
        'kurz: alle DS zu der ausgewählten Einheit im cbo cboZugabeEinheit für das Rezept mit der Nummer aus dem Textfeld txtRezepID im RS auflisten
        'kurz2: rcsZugabeEinheit ist der Recordset für die Sammlung der Gewichte der einzelnen Rezepteinheiten des bestimmten Rezepts
        Set rcsEinheiten = CurrentDb.OpenRecordset("SELECT * FROM tblGewichtsEinheitenName WHERE GweNameID = " & ZEWert, dbOpenDynaset)
        'Recordset der Variablen rcsEinheiten zuweisen: alle Felder der Tabelle tblGewichtsEinheitenName bei denen das Feld GweNameID mit dem Wert des Textfeldes cboZugabeEinheit
        '(Variable: ZEWert) übereinstimmt

        If rcsZugabeEinheit.EOF Then 'Wenn es keine DS für die ausgewählte Einheit im Textfeld cboZugabeEinheit gibt dann (das Rezeptgewicht für die Einheit wurde noch nicht ermittelt):
            MsgBox "Bitte die Einheit " & """" & ZEText & """" & " eingeben." 'Wenn die Einheit
                rcsZugabeEinheit.AddNew         'Eingabezeile anlegen (Die gibt es im Recordsetelement nicht. Sonst können dem Recordset keine
                                                'Daten hinzugefügt werden.)
                rcsZugabeEinheit.Fields("rezgeRezepIDRef").Value = Forms("frmPopRezeptAlsZutat").Controls("txtRezepID").Value
                                                'Wert aus cboZugabeEinheit in das Feld rezgeEhIDRef des Recordset schreiben
                rcsZugabeEinheit.Fields("rezgeEhIDRef").Value = Forms("frmPopRezeptAlsZutat").Controls("cboZugabeEinheit").Value
                                                'Den Wert für die Einheit (Zahl) aus cboZugabeEinheit kopieren & in rcsZugabeEinheit einfügen
                rcsZugabeEinheit.Fields("rezgeMenge").Value = Forms("frmPopRezeptAlsZutat").Controls("txtZugabeMenge").Value
                                                'Hier den Wert aus txtZugabeMenge eintragen
                                                    'Prüfung ob txtZugabeMenge 0 oder Null oder "" erfolgt mit EXIT-Ereigniss in txtZugabeMenge
                                                'Erst mal eine 0 reinschreiben, damit der Datensatz überhaupt erzeugt werden kann.
                rcsZugabeEinheit.Update         'Speichern (Damit der Datensatz wieder verlassen werden kann.)
            Forms("frmPopRezeptAlsZutat").Controls("sfrmRezepGeE").Requery
'            Forms("frmPopRezeptAlsZutat").Controls("sfrmRezepGeE").SetFocus 'Das Feld für die Einheitenangabe schon mit der in cboZugabeEinheit ausgewählten Einheit vorauswählen
'UFO setfocus?
        Else 'Die ausgewhälte Einheit im cbo "cboZugabeEinheit" gibt es.
'            MsgBox "Einheit " & """" & rcsEinheiten.Fields("GweNameText").Value & """" & " vorhanden"
'__________________________________________________________________________________________________________________
'GEWICHTSPRÜFUNG DER EINZELNEN ZUTATEN FÜR DIE AUSGEWÄHLTE REZEPTEINHEIT
            Set rcsRezeptZutatenGesamt = CurrentDb.OpenRecordset("SELECT * FROM qryZutatenEinkaufsliste WHERE ZutatSammlRezepIDRef =" & RezIDRef, dbOpenDynaset)
            Set rcsRezeptZutatenGpEinzeln = CurrentDb.OpenRecordset("SELECT * FROM  qryRezepteGewichtSumZutatenEinzeln WHERE rezepID =" & RezIDRef, dbOpenDynaset)
'Variable lngRezetNr            Set rcsRezeptZutatenGpEinzelnGefiltert = CurrentDb.OpenRecordset("SELECT * FROM qryRezepteGewichtSumZutatenEinzeln WHERE rezepID =" & lngRezetNr, dbOpenDynaset)
            'qryRezepteGewichtSumZutatenEinzeln
            If Not rcsRezeptZutatenGesamt.EOF Then
                rcsRezeptZutatenGesamt.MoveLast
                rcsRezeptZutatenGesamt.MoveFirst
                rcsRezeptZutatenGpEinzeln.MoveLast
                rcsRezeptZutatenGpEinzeln.MoveFirst
'                MsgBox "insgesamt: " & rcsRezeptZutatenGesamt.RecordCount & " Zutaten" & vbCrLf & _
'                        "mit Gewicht pro Einheit: " & rcsRezeptZutatenGpEinzeln.RecordCount & " Zutaten", , "Rezept: " & Me.txtRezeptAlsZutat.Value
                If rcsRezeptZutatenGesamt.RecordCount = rcsRezeptZutatenGpEinzeln.RecordCount Then
                    MsgBox "auf Nullwerte prüfen"
                Else
                    Do Until rcsRezeptZutatenGesamt.EOF                'alle Zeilen im RS qryZutatenEinkaufsliste bis zum Ende durchlaufen (Das RS mit ALLEN Zutaten)
                        lngZutatNr = rcsRezeptZutatenGesamt("LaMaZzutatIDRef").Value 'Das Fremdschlüsselfeld der Variablen zuweisen (zum merken)
                        Set rcsRezeptZutatenGpEinzelnGefiltert = _
                            CurrentDb.OpenRecordset("SELECT * FROM qryRezepteGewichtSumZutatenEinzeln WHERE ZutatStammID =" & lngZutatNr, dbOpenDynaset)
                            'Recordset mit nur den Gewichtsangaben nach der rezepID mit dem Wert von lngRezetNr filtern
                            'Wenn leer oder NULL dann Hintergrund rot einfärben
                            Set rcsZutatStammName = CurrentDb.OpenRecordset("SELECT * FROM tblZutatStamm WHERE ZutatStammID = " & _
                            lngZutatNr, dbOpenDynaset)
                            If rcsRezeptZutatenGpEinzelnGefiltert.EOF Then
                                    'Wenn für die Zutat vom Rezept noch
                                    'Wenn kein Gewicht für die im Rezept verwendete Einheit vergeben wurde.
                                    'Recordset um den Namen der Zutat anhand der Variablen lngZutatNr (von LaMaZzutatIDRef) zu ermitteln
                                MsgBox "Hintergrund" & " von " & rcsZutatStammName.Fields("ZutatStammName").Value & " rot einfärben "
                                lngZutatSammlIDUfo1 = 1     'Hier könnte noch eine Enumeration eingebaut werden, so dass der Wert der Variable nicht "1" Sonder "RotAn" heißt
                                                            '(1=rot an 0=Rot aus
                                With rcsRezeptZutatenGpEinzelnGefiltert
                                    .Edit
                                    .Fields("ZutatStammWertung").Value = lngZutatSammlIDUfo1
                                    .Update
                                End With    'jetzt steht der Wert im DS im Formular und die bedingte Formatierung nach diesem Feld greift und kann den DS rot färben
                            Else
                                If IsNull(rcsRezeptZutatenGpEinzelnGefiltert.Fields("GweZutatgweGewicht").Value) Then
                                    lngZutatSammlIDUfo1 = 1     'Hier könnte noch eine Enumeration eingebaut werden, so dass der Wert der Variable nicht "1" Sonder
                                                                '"RotAn" heißt (1=rot an 0=Rot aus
                                With rcsRezeptZutatenGpEinzelnGefiltert
                                    .Edit
                                    .Fields("ZutatStammWertung").Value = lngZutatSammlIDUfo1
                                    .Update
                                End With    'jetzt steht der Wert im DS im Formular und die bedingte Formatierung nach diesem Feld greift und kann den DS rot färben
                                        'Wert 1 in das Textfeld "txtWertung DS im Formular schreiben und die bedingte Formatierung nach diesem Feld greift und kann den DS rot färben
                                    MsgBox "Hintergrund" & " von " & rcsZutatStammName.Fields("ZutatStammName").Value & " rot einfärben "
                                    'Hintergrundfarbe des Textfeldes "cboProdukt" rot einfärben, wenn die Zutat der die ZutatSammlID zugeordnet ist kein Gewicht für die
                                    'im Rezept verwendete Einheit hat
                                Else
                                   
                                    lngZutatSammlIDUfo1 = 0     'Hier könnte noch eine Enumeration eingebaut werden, so dass der Wert der Variable nicht "1" Sonder
                                                                '"RotAn" heißt (1=rot an 0=Rot aus
                                    With rcsRezeptZutatenGpEinzelnGefiltert
                                        .Edit
                                        .Fields("ZutatStammWertung").Value = lngZutatSammlIDUfo1
                                        .Update
                                    End With
                                    'Wert 0 in das Textfeld "txtWertung DS im Formular schreiben und die bedingte Formatierung nach diesem Feld greift und kann den DS weis färben
                                End If
                            End If
                        rcsRezeptZutatenGesamt.MoveNext
                    Loop
                End If
            Else
                MsgBox "keine Zutaten im Rezept vorhanden." & vbCrLf & "Bitte Zutaten eingeben. Ohne Zutaten können keine Zutaten dupliziert werden"
            End If
'_________________________________________________________________________________________________________________
'DUPLIZIEREN DER DATENSÄTZE
''            Set db = CurrentDb 'Wert vergeben aber nicht verwendet
''            lngZutatSammlID = Nz(Forms("frmPopRezeptAlsZutat").Controls("sfrmPopBWTMahlzeitRezepteZutatenErfassen_Unter").Controls("txtZutatSammlID").Value, 0)
''                'für den Zielrecordset um die beim Kopieren auszusparen, damit Access die Autowertvergabe selbst machen kann (Primärschlüssel)
''            lngZutatSammlRezepIDRef = Nz(Forms("frmPopRezeptAlsZutat").Controls("txtRezepID").Value, 0)
''                'Für den Quellrecordset um die zu kopierenden DS nach dem Rezept zu filtern
''            lngZutatSammlRezepIDRef2 = Nz(Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Controls("ZutatSammlRezepIDRef").Value, 0)
''            If Not lngZutatSammlID = 0 Then 'Wenn im Textfeld "txtZutatSammlID" des Formulars "frmPopRezeptAlsZutat" etwas steht (nicht 0) dann
''                If KopiereDatensatzOhnePK("qryZutatenEinkaufsliste", "ZutatSammlID", "ZutatSammlLaMaZIDRef", "ZutatSammlRezepIDRef", lngZutatSammlRezepIDRef, lngZutatSammlRezepIDRef2, _
''                    SQLRcsZiel, lngZutatSammlIDNeu) Then
''    '            If KopiereDatensatzOhnePK("qryZutatenEinkaufsliste", "ZutatSammlID", lngZutatSammlID, "ZutatSammlLaMaZIDRef", SQLRcsZiel, lngZutatSammlIDNeu) Then
''                    Me.sfrmPopRezeptAlsZutatUnter2.Form.RecordSource = SQLRcsZiel
''                    Me.sfrmPopRezeptAlsZutatUnter2.Form.Requery
''                    Me.sfrmPopRezeptAlsZutatUnter2.Form.Recordset.FindFirst "ZutatSammlID = " & lngZutatSammlIDNeu
''                    Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Requery
''                End If
''            Else
''            End If
        End If
'''löschen?    End If

            Cancel = False
        Case Else
            Cancel = False
            MsgBox "Case Else"
    End Select
End Sub

Viele Grüße: Konrad

markusxy

Zitat von: KonradR am November 30, 2024, 08:22:21If rcsRezeptZutatenGpEinzelnGefiltert.EOF Then

                                With rcsRezeptZutatenGpEinzelnGefiltert
                                    .Edit

Sollte es sich wirklich um diese Stelle handeln, könnte Nachdenken möglicherweise helfen ...

.EOF bedeutet ja, dass sich der Zeiger des Recordsets auf keinem Datensatz befindet.
Editieren kann man aber nur ....

KonradR

Ich habe das Problem jetzt gelöst. Thema war, dass ich in der Tabellenansicht der Abfrage schon keine Änderung machen konnte. Als ich dort das entsprechende Feld editieren wollte, hat die Statusleiste folgende Meldung gezeigt:
Zitat"Diese Datensatzgruppe kann nicht aktualisiert werden."
Da das entsprechende Feld in der Tabelle "tblZutatStamm" enthalten ist, habe ich einen Recordset mit dem Feld "ZutatStammWertung" erstellt und es funktioniert. Hier das Ergebnis (ab dem Beginn der Do Loop Schleife:
                    Do Until rcsRezeptZutatenGesamt.EOF                'alle Zeilen im RS qryZutatenEinkaufsliste bis zum Ende durchlaufen (Das RS mit ALLEN Zutaten)
                        lngZutatNr = rcsRezeptZutatenGesamt("LaMaZzutatIDRef").Value 'Das Fremdschlüsselfeld der Variablen zuweisen (zum merken)
                        Set rcsRezeptZutatenGpEinzelnGefiltert = _
                            CurrentDb.OpenRecordset("SELECT * FROM qryRezepteGewichtSumZutatenEinzeln WHERE ZutatStammID =" & lngZutatNr, dbOpenDynaset)
                            'Recordset mit nur den Gewichtsangaben nach der rezepID mit dem Wert von lngRezetNr filtern
                            'Wenn leer oder NULL dann Hintergrund rot einfärben
                            Set rcsZutatStammName = CurrentDb.OpenRecordset("SELECT * FROM tblZutatStamm WHERE ZutatStammID = " & _
                            lngZutatNr, dbOpenDynaset)
                            If rcsRezeptZutatenGpEinzelnGefiltert.EOF Then
                                    'Wenn für die Zutat vom Rezept noch
                                    'Wenn kein Gewicht für die im Rezept verwendete Einheit vergeben wurde.
                                    'Recordset um den Namen der Zutat anhand der Variablen lngZutatNr (von LaMaZzutatIDRef) zu ermitteln
                                MsgBox "Hintergrund" & " von " & rcsZutatStammName.Fields("ZutatStammName").Value & " rot einfärben "
                                lngZutatSammlIDUfo1 = 1     'Hier könnte noch eine Enumeration eingebaut werden, so dass der Wert der Variable nicht "1" Sonder "RotAn" heißt
                                                            '(1=rot an 0=Rot aus
                                With rcsZutatStammName
                                    .Edit
                                    .Fields("ZutatStammWertung").Value = lngZutatSammlIDUfo1
                                    .Update
                                End With    'jetzt steht der Wert im DS im Formular und die bedingte Formatierung nach diesem Feld greift und kann den DS rot färben
Warum es allerding die oben genannte Meldung zeigt ist mir schleierhaft. Hier noch ein Bild von der Abfrage:
Sie dürfen in diesem Board keine Dateianhänge sehen.