Neuigkeiten:

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

Mobiles Hauptmenü

Kontrollkästchen deaktivieren (False)

Begonnen von herb54, August 15, 2018, 08:45:48

⏪ vorheriges - nächstes ⏩

herb54

Hallo,
ich möchte über eine Routine mehrere Kontrollkästchen deaktivieren (auf False setzen).
Dies geschieht über einen Button und über ein Recordset:

'Programmauszug
Private Sub Befehl90_Click()
Dim xs As DAO.Recordset
Set xs = CurrentDb.OpenRecordset("Therapie_neu")

'Eingabe erlauben
Me.AllowEdits = True
Me.AllowAdditions = True
Me.AllowDeletions = True

'Alle Selektionskästchen der Belege löschen
If xs.RecordCount > 0 Then
Do Until xs.EOF
xs.Edit
xs!Bel1 = False
xs!Bel2 = False
xs!Bel3 = False
xs!Bel4 = False
xs!Bel5 = False
xs!bel6 = False
xs!bel7 = False
xs.Update
xs.MoveNext
Loop
End If
xs.Close
Set xs = Nothing

DoCmd.RunCommand acCmdSaveRecord
Me.Refresh

End Sub

Leider deaktivieren sich die Kontrollkästchen erst nach zweimaligem Klicken des Buttons!
Was ist hier falsch?
PS:
Wenn ich die Kontrollkästchen nicht über ein Recordset  sondern manuell
(Me.Bel1 = False usw.) deaktiviere geht es einwandfrei.

Im Voraus vielen Dank
Herbert

ebs17

Über das Recordset werden Daten in der Tabelle geändert.
Das Formular zeigt aber ohne Requery noch den vorherigen Zustand an, und ggf. änderst Du über das Formular einen Datensatz in der Tabelle zurück.

Was würde man tun:
- Aktualisierungsabfrage verwenden, ist schneller und einfacher.
Anschließend mit Me.Requery die Datenherkunft des Formulars aktualisieren.
- Alle sonstigen Aktionen (Allow, SaveRecord) entfallen.
Mit freundlichem Glück Auf!

Eberhard

herb54

Hallo ebs17,
das Problem ist: Ich möchte, dass der Datenzeiger auf dem aktuellen Datensatz stehen bleibt. Mit Me.Requery springt der Datenzeiger auf den ersten Datensatz! Gibt es da eine Möglichkeit das zu verhindern?
Grüße
Herbert


MzKlMu

Hallo,
und nicht zuletzt darf auch das Datenmodell bezweifelt werden.
7 Ja/Nein Felder sind ein Hinweis darauf.

Was steht denn in den 7 Feldern bzw. was wird denn da angehakt ?
Gruß Klaus

herb54

Hallo Franz,
super, wieder was gelernt! Vielen Dank!

Hallo MzKlMu,
die Kontrollkästchen werden aktiviert um über eine Abfrage einen Bericht aufzurufen!

Grüße
Herbert

MzKlMu

Hallo,
und was haben da die KK für eine Aufgabe ?
Gruß Klaus

herb54

KK = True , dann werden über eine Abfrage Daten für einen Bericht bereitgestellt.
Ich habe den Requery eingebaut - leider immer noch das gleiche Problem: Ich muss den Button zweimal betätigen um die KK zu deaktivieren:

Private Sub Befehl90_Click()
Dim xs As DAO.Recordset
Set xs = CurrentDb.OpenRecordset("Therapie_neu")

'Eingabe erlauben
Me.AllowEdits = True
Me.AllowAdditions = True
Me.AllowDeletions = True

Dim lngStore As Long

'ID des Datensatzes speichern um nach einem Requery wieder auf den gleichen Datensatz zu springen
lngStore = Me!ID

'Bildschirmflackern reduzieren
Me.Painting = False

'Alle Selektionskästchen der Belege löschen
If xs.RecordCount > 0 Then
Do Until xs.EOF
xs.Edit
xs!Bel1 = False
xs!Bel2 = False
xs!Bel3 = False
xs!Bel4 = False
xs!Bel5 = False
xs!bel6 = False
xs!bel7 = False
xs.Update
xs.MoveNext
Loop
End If
xs.Close
Set xs = Nothing

'Datensatz über Requery im Formular und in der Tabelle speichern
Me.Requery

'Den aktuellen Datensatz wieder anspringen
Me.Recordset.FindFirst "Id = " & lngStore

Me.Painting = True

End Sub

Habe es auch am Ende des Recordset mit xs.Requery versucht, dann kommt eine Fehlermeldung "Mit diesem Objekt nicht möglich"

herb54

Habe jetzt eine Lösung gefunden, die einwandfrei geht (aber ohne Recordset):

Private Sub Befehl90_Click()
Dim xs As DAO.Recordset
'Set xs = CurrentDb.OpenRecordset("Therapie_neu")

'Eingabe erlauben
Me.AllowEdits = True
Me.AllowAdditions = True
Me.AllowDeletions = True

Dim lngStore As Long

'ID des Datensatzes speichern um nach einem Requery wieder auf den gleichen Datensatz zu springen
lngStore = Me!ID

'Bildschirmflackern reduzieren
Me.Painting = False

For i = 1 To 7
    Me.Controls("Bel" & i).Value = False
Next i

'Datensatz über Requery im Formular und in der Tabelle speichern

DoCmd.Requery 'Akutalisieren
Me.Refresh
DoCmd.RunCommand acCmdSaveRecord

'Den aktuellen Datensatz wieder anspringen
Me.Recordset.FindFirst "Id = " & lngStore

Me.Painting = True
End Sub

Im Prinzip das Gleiche wie das Recordset - nur wird das Formular sofort aktualisiert.
Das man das über Recordset nicht hinkriegt...???

Grüße
Herbert

Beaker s.a.

Hallo Herbert,
Wenn du Eberhards Hinweise umgesetzt hättest, sollte das in etwa so aussehen
Private Sub Befehl90_Click()
    Dim lngStore As Long
    Dim sSQL As String

'ID des Datensatzes speichern um nach einem Requery wieder auf den gleichen Datensatz zu springen
    lngStore = Me!ID

    sSQL = _
            "UPDATE Therapie_neu " _
         & "SET Bel1 = False, " _
         & "SET Bel2 = False, " _
         & "SET Bel3 = False, " _
         & "SET Bel4 = False, " _
         & "SET Bel5 = False, " _
         & "SET Bel6 = False, " _
         & "SET Bel7 = False, " _
         & "WHERE ID = " & lngStore
Debug.Print sSQL    'zum Prüfen des Strings im Direktfenster

    CurrentDb.Execute sSQL, dbFailOnError

    Me.Requery

'Den aktuellen Datensatz wieder anspringen
    Me.Recordset.FindFirst "Id = " & lngStore

End Sub


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

herb54

Hallo Ekkehard,
man lernt nie aus! Vielen Dank an dich und an alle in diesem Forum für die Hilfe!
Grüße
Herbert

ebs17

Falls es nicht explizit aufgefallen ist: Oben wurde über alle Datensätze des Formularrecordsets hergefallen, jetzt ist man zufrieden, wenn der aktuelle Datensatz verarbeitet wird. Solche Kleinigkeiten sollte man eigentlich gleich am Anfang herausstellen, ggf. nach vorheriger eigener reiflicher Überlegung.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

@Eberhard
ZitatFalls es nicht explizit aufgefallen ist:
Ist es tatsächlich nicht :-(
Habe ich wohl durch das Zurücksetzen auf den letzten DS ausgeblendet.

@Herbert
Wenn also ALLE Datensätze der Tabelle aktualisiert werden sollen, musst
du die WHERE-Klausel entfernen.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

herb54