August 15, 2020, 06:11:22

Neuigkeiten:

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


Checkbox automatisch an/abwählen wenn Prüfdatum abgelaufen

Begonnen von Menthi88, Juli 29, 2020, 12:26:35

⏪ vorheriges - nächstes ⏩

Menthi88

Guten Tag zusammen,

ich habe eine Datenbank in der Betriebsmittel hinterlegt sind, jedes Betriebsmittel hat ein Prüfdatum das natürlich irgendwann abläuft. Neben einer bedingten Formatierung (Prüfdatum wird Grün,Gelb oder Rot bei Überschreitung) habe ich noch zwei Checkboxen = Geprüft + Gesperrt (um die Geprüften und Abgelaufenen mit Hilfe aktiver Checkboxen zählen zu können).

Sollte das aktuelle Datum also noch vor dem Prüfdatum liegen bekommt die Checkbox "Geprüft" einen Haken, ist das aktuelle Datum nach dem Prüfdatum, erlischt das Häkchen bei "Geprüft" und die Checkbox "Gesperrt" hat ein Häkchen.

Bei Eingabe / Änderung des Prüfdatums macht er das auch alles wunderbar.

Der Code dafür steht beim Feld "Prüfungsdatum" unter dem Ereignis "AfterUpdate"
und lautet:

chkGeprueft.Value = Int(Date) <= Int(Pruefdatum)
chkGesperrt.Value = Int(Date) > Int(Pruefdatum)

Allerdings macht er diese Berechnung nicht automatisch für alle Datensätze wenn das Formular geladen wird.
Der Farbumschlag klappt automatisch, aber irgendwann hat man zB. einige rote Prüfdaten und der Haken ist bei "Geprüft" verblieben.

Wie stell ich das an, das er die Haken auch beim Öffnen/Laden aktualisiert um nicht jeden Datensatz einzeln anklicken zu müssen? Den Code unter "Formular" mit dem Ereignis "Beim Laden" oder "Öffnen" zu platzieren klappt nicht.

Ich hoffe ihr könnt mir helfen und ich hoffe ich habe das richtige Unterforum ausgewählt (falls nicht sorry @ die Mods) :)

Viele Grüße
Menthi

Beaker s.a.

Hallo Menthi,
Beim Öffnen bzw. beim Laden ist nur der "erste" DS im Fokus,
da
müsstest du die Aktualisierung aller DS mit einer Aktualisie-
rungsabfrage starten.
Oder du verfrachtest deinen Code ins Ereignis "Beim Anzeigen"
(Form_Current). Dann wird ein DS aktualisiert, sobald der den
Fokus erhält (DS-Wechsel). Dabei werden aber wiederholt ange-
zeigte DS auch wiederholt berechnet.
Bei einem als Liste dargestelltem Form wird wohl die erste
Vorgehensweise am sinnvollsten sein.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

crystal

Hallo Menthi88,

die Events "beim Laden" und "beim Öffnen" werden nur gefeuert, wenn das Formular geladen oder geöffnet wird.

Was du brauchst, ist der Event "Current", der jedesmal feuert, wenn ein anderer Datensatz angezeigt wird.

Du verwendest zwei Checkboxen, die ihren Status vermutlich auch in zwei Datenfeldern der Tabelle speichern. Diese Checkboxen sind unabhängig und können z. B. beide gecheckt oder beide ungecheckt sein. Wenn du eine davon checkst, solltest du die andere un-checken, etwa so:

if date() <= Pruefdatum then
    chkGeprueft = true
    chkGesperrt = false
else
    chkGeprueft = false
    chkGesperrt = true
end if   

Einfacher wäre es mit Radio-Buttons (Options-Schaltflächen): wenn einer gedrückt ist, geht der andere automatisch in den Zustand ungedrückt. (Das geht auch mit mehr als zwei Optionen, dann reicht aber true/false nicht mehr als Werte-Vorrat.) Die Datenbindung an EIN Tabellenfeld erfolgt dann über die Optionsgruppe.

Tipp: mit mehr als zwei Zuständen (als Zahlenwert 1 bis x oder auch als abgekürzter Klartext) könntest du auch noch weitere Prüfdatums-Informationen unterbringen (z. B. "Prüfung vorgezogen", "Prüfung innerhalb der nächsten 2 Wochen", "Prüfung in einem Monat" usw.).

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Menthi88

Juli 30, 2020, 06:36:22 #3 Letzte Bearbeitung: Juli 30, 2020, 07:42:25 von Menthi88
Hallo Beaker s.a. und crystal,

vielen Dank für die schnellen + hilfreichen Antworten :)

Habe mir das mit der Aktualisierungsanfrage mal angeschaut,wenn ich die erstellt habe, kann ich die quasi beim Laden des Formulars vorher durchlaufen lassen mit den Kriterien (chkGeprueft.Value = Int(Date) <= Int(Pruefdatum) sowie chkGesperrt.Value = Int(Date) > Int(Pruefdatum) ) ?

Das Current bedeutet ja das ich den DS nicht nur sehe sondern auch mit der Maus anklicken muss oder?
Weil dann müsste ich auch wieder jeden DS erst anklicken um ihn zu aktualisieren.

Am besten wäre es, man öffnet die Datei und er rattert einmal alle DS durch + aktualisiert die Haken und ich kann direkt sehen X Geräte sind geprüft, X Geräte sind gesperrt (anhand der Summezeile der Haken).

Heute habe ich zB. wieder einen DS der ins rote gesprungen ist, aber der Haken steht immer noch auf geprüft weil er den Vergleich der Datumswerte (Prüfdatum/Heutiges Datum) nicht automatisch beim Laden des Formulars / Öffnen der DB macht.

EDIT:
Hab mal was versucht mit der Aktualisierungsabfrage.

Hab es so eingegeben:

Feld:                  Gesperrt                Geprueft                Pruefdatum
Aktualisieren:            -1                      -1
Kriterien:      (Date) > (Pruefdatum)  (Date) <= (Pruefdatum)   

Die -1 hab ich geschrieben,weil es normal ja für "Haken setzen" steht.
Access hat mir aber nach dem speichern, die Kriterien entfernt und bei Pruefdatum unter Kriterien: >("Pruefdatum") Und <=("Pruefdatum") reingeschrieben...                             



Starten wollte ich die Abfrage so :

Private Sub Form_Load()
  DoCmd.SetWarnings False
  DoCmd.OpenQuery "Aktualisierungsabfrage", acViewNormal
  DoCmd.SetWarnings True



Grüße
Menthi

MzKlMu

Juli 30, 2020, 10:43:52 #4 Letzte Bearbeitung: Juli 30, 2020, 10:55:16 von MzKlMu
Hallo,
verwende [] für das Prüfdatum.
Das automatische Einfügen der " halte ich für einen Bug bei Access.
>[Pruefdatum] Und <=[Pruefdatum] 
Bitte zeige mal den SQL Code der Abfrage.

Gestartet wird eine Aktionsabfrage mit Execute.
CurrentDb.Execute "Aktualisierungsabfrage", DbFailOnErrorDie Befehle SetWarnings braucht es da nicht.
Gruß
Klaus

Beaker s.a.

Hallo Menthi,
Deine ersten beiden Fragen sind mit Ja zu beantworten, hast mich
also richtig verstanden.
Die Aktualisierungs-Abfrage (hast du die schon hinbekommen?) wird
dabei in einem der Ereignisse, die beim Öffnen eines Form ausgelöst
werden (Form_Load wohl am Besten), angestossen, wie von Klaus gezeigt.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Menthi88

Juli 30, 2020, 17:11:47 #6 Letzte Bearbeitung: Juli 31, 2020, 08:50:22 von Menthi88
Moin zusammen,

werde morgen die Ausbesserungen wie von Klaus beschrieben machen und dann mal testen :)

Ich berichte dann sofort


Menthi88

UPDATE:

Guten Morgen zusammen,

Hab jetzt mal den Code ausprobiert:
CurrentDb.Execute "Aktualisierungsabfrage", dbFailOnErrorDas Ganze liegt bei Form_Load.

Da kommt dann Laufzeitfehler 3061:

"1 Parameter wurde erwartet es wurden aber zu wenig Parameter übergeben."
Hängt das mit [Date] zusammen? Müsste Access doch eigentlich "universell" kennen oder (greift er doch von der Systemzeit ab)?

Der SQL Code der Abfrage:
UPDATE Assets SET Assets.Gesperrt = -1, Assets.Geprueft = -1
WHERE (((Assets.[Pruefdatum])>[Date] And (Assets.[Pruefdatum])<=[Date]));



Hab jetzt nochmal was mit Recordset "gebastelt", allerdings bleibt er bei mir immer beim ersten DS obwohl er die korrekte Anzahl der DS zählt etc.
Kann natürlich auch daran liegen, das der Code hier unten komplett falsch ist...

  Private Sub Form_Load()

  Dim X As Variant            '
  Dim rst As Recordset        '
  Set rst = Me.RecordsetClone
   
    rst.MoveLast
    X = rst.RecordCount
    rst.MoveFirst
    For i = 1 To X
        rst.Edit
        If Int(Date) > Int(Pruefdatum) Then chkGesperrt.Value = -1 Else chkGesperrt.Value = 0
        If Int(Date) <= Int(Pruefdatum) Then chkGeprueft.Value = -1 Else chkGeprueft.Value = 0
        rst.Update
        rst.MoveNext
    Next i
  End Sub

MzKlMu

Hallo,
bei Date sind die [] natürlich falsch. Date ist eine Funktion mit einem leeren () Klammerpaar hinten.
Versuche es mal so :
Prüfdatum >Date() And Prüfdatum <=Date()
Gruß
Klaus

Menthi88

Juli 31, 2020, 12:03:12 #9 Letzte Bearbeitung: Juli 31, 2020, 12:10:39 von Menthi88
Hallo Klaus,

hab ich geändert, Fehlermeldung kommt nicht mehr :)

Hab jetzt mal ein paar DS geändert damit ich welche hab die er auf "gesperrt" setzen müsste.
Aber es passiert leider nix, die roten abgelaufenen DS haben immer noch den Haken bei "geprüft" :(

Ich weiß jetzt nicht ob die SQL Abfrage überhaupt richtig ist, er müsste ja prüfen ob Prüfdatum > oder <= Datum ist und falls ja, in einem anderem Feld (Geprüft oder Gesperrt) den Wert ändern.Für mich sieht die SQL so aus wie "Ändere die Werte in den Feldern Geprüft und Gesperrt wenn Prüfdatum > und <= Datum ist." Nur kann das Prüfdatum ja nie > Datum UND <=Datum gleichzeitig sein.

Hab es jetzt mal so geändert:
Bei beiden Feldern unter Aktualisierung:

Bei Gesperrt:
Wenn([Pruefdatum]>Datum();-1;0)
Bei Geprüft:
Wenn([Pruefdatum]<=Datum();-1;0)

SQL :
UPDATE Assets SET Assets.Gesperrt = IIf([Pruefdatum]>Date(),-1,0), Assets.Geprueft = IIf([Pruefdatum]<=Date(),-1,0);

Hat aber auch keinen Erfolg gebracht ...

Gruß
Menthi


Beaker s.a.

Hallo Menthi,
Versuch mal so

UPDATE Assets As A
    SET A.gesperrt = (A.Pruefdatum>Date()),
        A.geprueft = (A.Pruefdatum<=Date())

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

ebs17

Denkfrage: Wozu benötigt man zusätzliche berechnete Felder in der Tabelle?

Eine Auswahlabfrage verwendet unmittelbar die Originalinformation und gibt ohne weitere Maßnahmen die Auswertung aus:
SELECT
   Pruefdatum,
   Pruefdatum <= Date() AS geprueft,
   Pruefdatum > Date() AS gesperrt
FROM
   Assets
Dem kann sich dann auch die Formularanzeige nicht entziehen.
Mit freundlichem Glück Auf!

Eberhard

Menthi88

Hallo,

danke euch, werde testen sobald das Wetter es zulässt *schwitz*.
Und dann auch berichten :)

Wünsche ein schönes Wochenende!


Menthi88

August 04, 2020, 06:23:05 #13 Letzte Bearbeitung: August 04, 2020, 10:01:44 von Menthi88
Zitat von: Beaker s.a. am Juli 31, 2020, 16:42:55Hallo Menthi,
Versuch mal so

UPDATE Assets As A
    SET A.gesperrt = (A.Pruefdatum>Date()),
        A.geprueft = (A.Pruefdatum<=Date())

gruss ekkehard

Moin zusammen, dieser Lösungansatz funktioniert DANKE !

Musste nur noch die < Zeichen vertauschen dann klappte es richtig rum.

VIELEN DANK an alle die sich beteiligt haben !

PS: Wo ist der "Thema gelöst" Button ?

Gruß
Menthi

Beaker s.a.

Hallo Menthi,
ZitatMusste nur noch die < Zeichen vertauschen dann klappte es richtig rum.
Na ja, ich hatte es hier abgeschrieben
ZitatBei Gesperrt:
Wenn([Pruefdatum]>Datum();-1;0)
Bei Geprüft:
Wenn([Pruefdatum]<=Datum();-1;0)

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.