Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: J.D am März 06, 2020, 02:46:30

Titel: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 02:46:30
Hi forum,

Ich habe in einem Feld als Standard wert Datum(),
also ist auch klar das wenn sich das System Datum ändert sich das Datum ändert...
Ist es möglich einen Hinweis anzuzeigen wenn sich das Datum geändert hat?
Die MessageBox sollte ja kein Problem sein aber wie kann ich das Datum im Feld gegen das System Datum prüfen?
Bei ja soll das Datum ändern, bei nein nicht...
Bin bestimmt einfach nur zublöde,oder zumüde!?

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: DF6GL am März 06, 2020, 08:50:21
Hallo,


?? ??

Du merkst doch auch ohne Access, dass sich ein Datum ändert.. ??

Der Standard-Wert ist doch nur ein Vorgabewert zur komfortablen Eingabe bei einem neuen Datensatz.  Der Standard-Wert ist immer auf dem aktuellen Stand und wird nirgends als solcher gespeichert.  Demzufolge ist er nicht auf Änderung prüfbar.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 15:08:54
Ja, oder ist möglich vor dem Speichern das Datum des letzten eintrages zu prüfen?

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: DF6GL am März 06, 2020, 15:23:43
Hallo,

ja, klar ist es möglich, das zuletzt eingegebene Datum mit dem aktuellen Datum zu vergleichen.

Aber mir erschließt sich immer noch nicht, was das für einen Zweck haben soll..
Vielleicht willst Du an einem Tag nur einen DS eingeben wollen ??


ZitatIf DMax("Datumsfeld", "tblTabellemitDatum") = Date() Then
Msgbox "Es gibt schon einen Datensatz mit dem heutigen Datum"
End if
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 06, 2020, 15:23:48
Hallo,
das Datum des letzten Eintrags ist das höchste Datum und kann mit Max() bestimmt werden.

Wer ändert denn bei Dir das Systemdatum ?
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: ebs17 am März 06, 2020, 16:04:17
Zitatist möglich vor dem Speichern das Datum des letzten eintrages zu prüfen?
Klar, wenn man etwas in den Händen hält, kann man vergleichen.
Wenn Du Befürchtungen hast, dass jemand das Systemdatum vor und zurück stellt, kannst Du auch dieses in eine Extra-Logtabelle speichern in Verbindung mit typischen Aktionen.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 16:13:18
Ich erkläre das mal so,

Das Formular hat das Datum()
Nun ist es so das die Schicht  von 22:00 bis 06:00 also passiert folglich das ein neuer Eintrag um 01:00 Uhr nachts bereits als nächsten Tag gewertet wird, dieses gehört jedoch zum Vortag...

Daher sollte der letzte eintrag gegen geprüft werden, da ist mir das Systemdatum eingefallen.
Eine andere Lösung dazu wüsste ich jetzt nicht :?

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 06, 2020, 16:54:28
Hallo,
dazu brauchst du kein Systemdatum.
Zeiten zwischen 00:00 Uhr und <06:00 gehören immer zum Vortag.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 19:08:19
Zitat von: MzKlMu am März 06, 2020, 16:54:28
Hallo,
dazu brauchst du kein Systemdatum.
Zeiten zwischen 00:00 Uhr und <06:00 gehören immer zum Vortag.

hört sich einfach an, ist es aber nicht :D

Ich habe es jetzt halbwegs, aber leider wird trotzdem eingetragen egal on Ja Nein oder Abbrechen
Private Sub Form_BeforeUpdate(Cancel As Integer)
If DMax("Datum", "Produktionsdaten") < Me![Datum] Then
        MsgBox Format(Date, "DD.MM.YYYY") & " Soll das Datum geändert werden", vbYesNoCancel + vbQuestion
        If vbYes Then
' Speicher die eingaben
' DoCmd.RunCommand acCmdSaveRecord
'Gehe zum neunen Datensatz
' DoCmd.GoToRecord , , acNewRec
' Form Aktionen
Me![Form1].Requery
Me![Form2].Requery
        Else
            Exit Sub
        End If
End If
End Sub


und Me.Undo scheint keine auswirkung zu haben...

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 06, 2020, 19:19:54
Hallo,
ich würde am Datum in der Tabelle gar nix ändern. Das bleibt wie es ist.
In einer Abfrage ermittelts Du ob die Zeit zwischen 00:00 Uhr und <06:00 Uhr liegt, wenn ja, ziehst vom Datum einen Tag ab. Für Auswertungen verwendest Du die Abfrage.

Als Kurzfassung:
SELECT Datum, Uhrzeit, [Datum]+([Uhrzeit]>=0 And [Uhrzeit]<0.25) AS GehörtZumDatum
FROM Zeiten


Die Uhrzeit ist im Hintergrund als Dezimalzahl zwischen 0 und <1 gespeichert.
0 entspricht 00:00 Uhr und 0,25 = 1/4 = 06:00, daher kann einfach mit der Dezimalzahl verglichen werden.

Der oben gezeigte Code wird so nicht richtig funktionieren.
Soll das Datum immer zurückgesetzt werden, oder willst Du tatsächlich per MsgBox erst fragen ?
Wenn ja, warum ? Macht die Farge Sinn ?

PS:
Wenn Du im Code die Leerzeilen weg lässt, wird das deutlich übersichtlicher dargestellt.
Habe es oben mal gemacht.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 20:05:26
Danke Klaus,

hab gerade einen Gehirnstau...
Muss erst mal gucken wie ich das verabeiten kann :D

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 06, 2020, 20:09:47
Hallo,
ich habe meinen Beitrag in #9 noch ergänzt.
Kannst Du das mal noch beantworten.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 06, 2020, 20:19:23
Danke Klaus!

Also nochmal,

ich möchte Prüfen ob das Datum grösser ist als das in der Datenbank, das funktioniert und die Daten werden alle eingetragen... suppie währe noch das er bei Nein das Datum einen Tag zurück setzt (LuxusVers)...
es würde aber auch reichen das er zum Form zurück geht und ich das Datum ändern kann...
Laut DonKarl mit
  ... Else
  Me.Undo  'rückgängig
  Cancel = True  'Ereignisse verhindern
  End If

Denoch wird bei der Auswahl Nein alles eingetragen :(

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 06, 2020, 21:48:44
Hallo,
bitte zeige alle Prozeduren immer vollständig sonst kann man das mit dem Cancel nicht prüfen.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: ebs17 am März 07, 2020, 08:14:16
Vielleicht wäre es auch hilfreich, den Begriff Schichtdatum einzuführen und diesen vom normalen Datum abzugrenzen.
Die Nachtschicht beginnt am alten Tag und wird diesem in der Betrachtung zugerechnet. Das kann man aber durchaus auch erst bei Auswertungen berücksichtigen, nicht zwingend schon beim Tabelleneintrag.
In der normalen Zeitrechnung gehört aber eine Zeit wie 1 Uhr zum neuen Tag und wäre auch in Verbindung mit diesem auszuzeichnen.
Wenn wegen Frosteinbruch die Wasserleitung platzt und die Produktion zum Stehen kommt, kann man nicht einfach dieses Ereignis einen Tag zurück legen.
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 07, 2020, 19:23:40
Sorry, hatte gestern abend noch Nachtschicht!

Private Sub Form_BeforeUpdate(Cancel As Integer)

If DMax("Datum", "Produktionsdaten") < Me![Datum] Then

     MsgBox Format(Date, "DD.MM.YYYY") & " Soll das Datum geändert werden", vbYesNoCancel + vbQuestion
     If vbYes Then
     Me![Form1].Requery
     Me![Form2].Requery
     Else
     Me.Undo  'rückgängig
     Cancel = True  'Ereignisse verhindern
     End If
End If
End Sub


Grüsse J.D

@ebs17 dazu müsste ich abfragen erstellen und alle Formulare und Berichte ändern...
Weiteres würde ich dann bei der abfrage wiederum scheitern ;)
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 07, 2020, 19:52:48
Hallo,
der gezeigte Code ist so nicht richtig. Du wertest ja den Rückgabewert der MsgBox gar nicht aus. So wie das jetzt ist, wird der Else Zweig nie ausgeführt, egal was Du klickst.
Das sollte so aussehen:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If DMax("Datum", "Produktionsdaten") < Me![Datum] Then
     If MsgBox(Format(Date, "DD.MM.YYYY") & " Soll das Datum geändert werden", vbYesNoCancel + vbQuestion) = vbYes Then
        Me![Form1].Requery
        Me![Form2].Requery
     Else
        Me.Undo  'rückgängig
        Cancel = True  'Ereignisse verhindern
     End If
End If
End Sub

Außerdem erschließt sich mir der Sinn immer noch nicht. Die Uhrzeit spielt doch bei Deiner Verion keine Rolle, das heißt, die die MsgBox kommt immer, auch mittags um 12:00 wenn sich die Frage nach dem Datum gar nicht stellt. Ist das beabsichtigt ?
Was beinhalten denn das Feld Me.Datum ?

Würde es nicht Sinn machen, das Datum einfach zwischen 00:00 Uhr und <06:00 einen Tag zurückzusetzen, ggf. mit Rückfrage ?
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 07, 2020, 23:04:28
Danke Klaus, es funktioniert jetzt aber nun geht das Speichern und so weiter nicht mehr wenn ich nein klicke

Private Sub Speichern_Click()

' Diese beiden befehle gegen dann nicht mehr ;(
[s]DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord , , acNewRec[/s]

' Aktuallisiere Datenblätter
' Me.Requery
'
Me![Form1].Requery
Me![Form2].Requery
End Sub


Wenn ich auf ja klicke funktioniert es alles wie gehabt, nur bei nein gibt es dann mächtig probleme und Access bemängelt jede menge schlechten code  :-[
[edit]
Cancel = True  'Ereignisse verhindern
entfernt, jetzt geht es...
[/edit]

Sicherlich ist es möglich über das Feld Me![Datum] es einen Tag zurück zu setzen...
Das feld Me![Datum] enthält das Datum tt.mm.jjjj format.

Leider bin ich nicht so Fit... daher werde ich wohl versuchen es auszubauen, weil nun muss im
DMax ein zweiter Parameter rein... bei Ja soll das Datum geändert werden und bei Nein soll das neue Datum übernommen werden...

Ich werde damit sicherlich noch etwas spass haben  ;D

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 02:31:38
So weit so gut, jedoch möchte ich jetzt noch einen Zweiten Parameter anhängen!
Dieses habe ich wie folgt gelösst, aber scheint nicht zu funktionieren... sprich es kommt immer die Box.
Der Wert Me!MaschinenId.Column(0) ist ja ein Dropdown die SQL ist
SELECT Maschine.ID, Maschine.Maschinen_Name
FROM Maschine
ORDER BY Maschine.[Maschinen_Name];

Daher gehe ich davon aus das (0) die Maschine.ID ist...

  If DMax("Datum", "Produktionsdaten") < Me![Datum] & " AND Maschine =" & Me!MaschinenId.Column(0) Then

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: ebs17 am März 08, 2020, 08:08:57
Ich wollte auch nur anmerken, dass man vor Code-Aktionismus und -Wirrungen vorher evtl. erst einmal über Abläufe nachdenkt und diese fixiert. Nach einer Datensatzspeicherung sollen vmtl. diese Daten auch ausgewertet und verarbeitet werden, womöglich auch tages-, monatsübergreifend, und vmtl. auch fachlich richtig. Das sollte man dann auch beherrschen.

Aber Du hast ja zu tun. Viel Erfolg weiterhin.

Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 10:58:55
So, ich lasse die Maschinen_ID mit in MsgBox anzeigen zur Kontrolle und sie wird mir richtig dargestellt, nur warum wird es im DMax nicht berücksichtigt!?

Private Sub Form_BeforeUpdate(Cancel As Integer)
' If DMax("Datum", "Produktionsdaten") < Me![Datum] Then
  If DMax("Datum", "Produktionsdaten") < Me![Datum] & " AND [Maschinen_ID] =" & Me!Maschinen_ID.Column(0) Then
 
     If MsgBox(Format(Date, "DD.MM.YYYY") & " Soll das Datum geändert werden Maschine: " & Me!Maschinen_ID.Column(0), vbYesNoCancel + vbQuestion) = vbYes Then

Me![Form1].Requery
Me![Form2].Requery

     Else
        Me.Undo  'rückgängig
       ' Cancel = True  'Ereignisse verhindern
     End If
End If
End Sub


Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: MzKlMu am März 08, 2020, 11:06:57
Hallo,
welcher Datentyp ist die Maschinen_ID ?
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 11:40:19
Zitat von: MzKlMu am März 08, 2020, 11:06:57
Hallo,
welcher Datentyp ist die Maschinen_ID ?

Zahl...

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: Beaker s.a. am März 08, 2020, 11:55:02
Falsche Syntax
If DMax("Datum", "Produktionsdaten") < Me![Datum] AND [Maschinen_ID] = Me!Maschinen_ID.Column(0) Then
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 15:05:04
Zitat von: Beaker s.a. am März 08, 2020, 11:55:02
Falsche Syntax
If DMax("Datum", "Produktionsdaten") < Me![Datum] AND [Maschinen_ID] = Me!Maschinen_ID.Column(0) Then

Danke, aber jetzt kommt keine Abfrage mehr wenn das Datum abweicht...  ;(

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: DF6GL am März 08, 2020, 15:27:30
Hallo,

das ist alles verkorkst...-

Zitatweil nun muss im
DMax ein zweiter Parameter rein...

Wo ist da ein erster Parameter?

Wenn das Max-Datum zu einer bestimmten MaschinenID ermittelt werden soll, dann etwa so:


If DMax("[Datum]", "Produktionsdaten","[Maschinen_ID] =" &  Me!Maschinen_ID.Column(0)) < Me![Datum]  Then

sofern [Maschinen_ID] den Datentyp Zahl, Long aufweist und im Kombi "Me!Maschinen_ID"  in der ersten Spalte der Wert für die Maschinen-ID zu finden ist.

Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 15:50:00
Danke Franz,

so geht es... war in der annahme das Datum auch ein Parameter ist...
Jetzt geht es an das kleingemachte... :D

Grüsse J.D
Titel: Re: Bei Systemdatum MesageBox
Beitrag von: J.D am März 08, 2020, 18:16:34
So, danke liebe Helfer und Kopfzerbrecher...  :-*
Ja ich bin Beratungsresistent  8)

Denoch habe ich es geschaft an mein Ziel zu kommen...
Anbei für alle
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If DMax("[Datum]", "Produktionsdaten", "[Maschinen_ID] =" & Me!Maschinen_ID.Column(0)) < Me![Datum] Then
    If MsgBox("Soll das Datum auf " & Me![Datum] & " für die Maschine: [" & Me!Maschinen_ID.Column(0) & "] geändert werden? Bei Nachtschicht bitte Nein", vbYesNo + vbQuestion) = vbYes Then
    Me![Form1].Requery
    Me![Form2].Requery
    Else
     
    Dim DatumNeu As Date
    DatumNeu = Me![Datum] - 1
   
    On Error Resume Next
    CurrentDb.Execute ("Insert into Produktionsdaten (Maschinen_ID, Mitarbeiter_ID, Material_ID, Anzahl, Datum, von, bis) values ('" & Me!Maschinen_ID.Column(0) & "', '" & Me!Mitarbeiter_ID.Column(0) & "', '" & Me!Material_ID.Column(0) & "','" & Me.Anzahl & "', '" & DatumNeu & "', '" & Me.von & "', '" & Me.bis & "')")
    Me.Undo
    MsgBox "Datum wurde auf " & DatumNeu & " geändert!"
    End If
End If
End Sub


Grüsse J.D