Frage zu set.Focus

Hallo zusammen,

ich hänge mal wieder bei Access fest.

Ich habe eine Datenbank mit Arbeitszeitangaben für eine Planung. Nun möchte ich, dass eine Änderung nur innerhalb von sieben Tagen- quasi einer Woche möglich ist. Die Frage hat soweit auch ganz gut geklappt und ich bekomme eine entsprechende MSG Box angezeigt, wenn ich versuche ein Feld zu ändern, für das die Zeit abgelaufen ist. NAchdem die MSG Box aber gezeigt wurde, ist ein Ändern trotzdem möglich.

Das Unterprogramm dazu sieht so aus:

Sub Datumsprüfung()
heutedatum = Date
Datumszeiger = 0
If heutedatum > DateAdd(„d“, 2, [Datum]) Then MsgBox „Eine nachträgliche Planänderung ist nur innerhalb von sieben Tagen möglich“
Datumszeiger = 1
Cancel = True

End Sub

Angesprungen wird das Unterprogramm über:

Private Sub PlanBeginnI_GotFocus()
Datumsprüfung
If Datumszeiger = 1 Then Forms!frmIst!Befehl113.SetFocus
End Sub

ICh hätte gerne, dass das Feld Befehl113 bei dem Versuch einer Änderung des Feldes [PlanBeginnI]den Focus erhält und das die Daten eben nicht mehr in dem Feld editiert werden können.

Es will aber einfach nicht funktionieren. Egal ob ich bei Mauszeiger,Focuserhalt oder sonstwo das Unterprogramm aktiviere. NAchdem die MSG Box gezeigt wurde, kann ich in dem Feld etwas eingeben und mithin die Daten nachträglich verändern.

Kann mir jemand einen freundlichen Hinweis geben, was ich falsch mache oder wie ich es besser lösen könnte.

Mit freundlichen Grüßen

Roland

Hallo Roland,

Das Unterprogramm dazu sieht so aus:
Sub Datumsprüfung()
heutedatum = Date
Datumszeiger = 0
If heutedatum > DateAdd(„d“, 2, [Datum]) Then MsgBox „Eine
nachträgliche Planänderung ist nur innerhalb von sieben Tagen
möglich“
Datumszeiger = 1
Cancel = True

End Sub

Frage: warum nutzt du eine Subroutine? Sie ist überflüssig!
Frage: warum gibt es kein abschließendes END IF?

So wie da das programmiert hast, ist dein Datumszeiger IMMER 1.
Du prüfst nur 2 TAGE!! und NICHT 7 Tage!
Was ist [Datum]? Dein zu prüfendes Feld heißt doch PlanBeginnI?

Angesprungen wird das Unterprogramm über:

Private Sub PlanBeginnI_GotFocus()
Datumsprüfung
If Datumszeiger = 1 Then Forms!frmIst!Befehl113.SetFocus
End Sub

Vorschlag:

Private Sub PlanBeginnI_GotFocus()

If date > DateAdd(„ww“, 1, Me.PlanbeginnI) Then
'Änderungsdatum überschritten in PlanbeginnI

'zum Button springen, und damit die Eingabe / Änderung verhindern
Forms!frmIst!Befehl113.SetFocus

'jetzt die Meldung erst anzeigen
MsgBox „Eine nachträgliche Planänderung ist nur innerhalb von sieben Tagen möglich“

ELSE ’ ggf. eine Else Anweisung

END IF ’ if abschließen

End Sub

Grüße aus Raben Steinfeld (bei Schwerin)
Wolfgang
(Netwolf)

Morgen Wolfgang,

danke für Deine Hilfe. DAs mit den zwei Tagen stimmt, ich hate die 2 war nur zur Probe. Die Subroutine nutze ich, weil ich das Datum an fast zehn Stellen überprüfen muss.
Das mit dem End-If vergesse ich immer- weiß nämlich nicht warum ich das machen muss?

Plan Beginn ist die Uhrzeit, bei der die geplante Arbeitszeit beginnt.
Der Sinn des Ganzen ist, dass jemand eine Woche im Voraus planen soll, wenn allerdings die Woche um ist, dann soll das Geplante nicht mehr verändert werden können. Deswegen ist Datum tatsächlich ein Tag.

ICh werde jetzt nochmal mit Deine Änderungsvorschläge einarbeiten und dann testen.

Gruß aus der Voreifel

Roland

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Roland,

ich habe den Sourcecode mal verwendet, prinzipiell funktioniert das ganze auch.

Den von Dir beschriebenen Fehler konnte ich nur dann erzeugen, wenn die Variable „Datumszeiger“ nicht global (zumindest Formularweit) definiert worden war.
In dem Falle würde wohl jede Unteroutine diese Variable nur für sich deklarieren und eine Übergabe des Wertes wäre nicht möglich.

Als Zielfocus hatte ich dabei aber ein Feld auf dem gleichen Formular. Dürfte aber keinen Unterschied machen.

Falls es daran gelegen haben sollte, würde ich immer die Eigenschaft „Option Explicit“ verwenden, da einem das zu ordentlicheren Arbeiten mit Variablen zwingt.

Was das fehlende End-If in der Anweisung anbelangt, so funktioniert das in diesem Fall auch ohne das Ende, weil nur die Anweisungen direkt hinter dem Then ausgewertet werden müssen, aber für die Lesbarkeit ist es meist besser, das auch dann zu setzten.
Vor allem, wenn andere Programmierer später mal einen Blick in den Code werfen sollten.

Gruß Jörg

Alle Angaben ohne Gewähr.