Guten Tag,
ich habe ein etwas komlizierteres Problem. Es gibt ein Formular. Mithilfe eines Buttons im Formular wird ein Bericht aufgerufen, der durch Eingabe vonDatum bis Datum gefiltert wird.
Private Sub Befehl102_Click()
Dim strSQL As String, dvon As Double, dbis As Double
' Variablenwerte löschen
gbl_datvon = Null
gbl_datbis = Null
' Variablen initialisieren
dvon = get_datvon
dbis = get_datbis
' Tabelle aktualisieren
strSQL = "Update tbl_Belege Set Checkbuch = True Where tbl_Belege.Datum Between " & dvon & " AND " & dbis
CurrentDb.Execute strSQL, dbFailOnError
DoCmd.OpenReport "rpt_Monat Check", acViewPreview
DoCmd.Close acForm, "frm_Belege"
End Sub
Im Modul:
Public Function get_datvon() As Double
Dim x
If IsNull(gbl_datvon) Then
x = InputBox("Bitte von-Datum eingeben")
If x <> "" Then
gbl_datvon = CDbl(DateValue(x))
Else
gbl_datvon = 0
End If
End If
get_datvon = gbl_datvon
End Function
Public Function get_datbis() As Double
Dim x
If IsNull(gbl_datbis) Then
x = InputBox("Bitte bis-Datum eingeben")
If x <> "" Then
gbl_datbis = CDbl(DateValue(x))
Else
gbl_datbis = 0
End If
End If
get_datbis = gbl_datbis
End Function
Die Datensätze, die ins Kriterium fallen werden dabei automatisch durch Aktivierung einer Checkbox gesperrt.
Mein Problem ist jetzt aber folgendes.
Die Datensätze die in dem Zeitraum angelegt wurden sind jetzt zwar gesperrt, aber der Benutzer könnte immernoch in dem Zeitraum einen neuen Datensatz eingeben. Auch das soll eigentlich nicht möglich sein.
Hat jemand eine Idee???
Mit freundlichen Grüßen
Hallo,
Zitataber der Benutzer könnte immernoch in dem Zeitraum einen neuen Datensatz eingeben
praktisch müßtest du Datumseingaben verhindern, die KLEINER Sind als das MaxDatum der Tabelle tblBelege mit Checkbuch = True
Das kannst du z.B. in den Formularen regeln in denen Datenerfassungen mit Datumseingaben erfolgen - würde dazu vorschlagen eine (Public) Function in einem Standardmodul zu erstellen, der das eingegebene Datum mitgeschickt wird. (z.B. beim Ereignis BeforeUpdate des Datumsfeldes)
Diese Function ermittelt ob das eingegebene Datum VOR oder NACH dem oben angesprochenen Max(Datum) der tblBelege liegt und liefert 0 oder 1 zurück.
Hast du jetzt bestimmt, dass 1 für OK stehen soll, dann wird die Eingabe des Datensatzes erlaubt, andernfalls mit einer entsprechenden MsgBox abgebrochen.
HTH
Wie würde sowas aussehen ?
Mein Formular basiert auf folgendes:
SELECT tbl_Belege.Datum, tbl_Belege.ID, tbl_Belege.Erfassungsdatum, tbl_Belege.Eingang, tbl_Kassenbuch.Ausgang, tbl_Belege.Beschreibung, tbl_Belege.Kategorie, tbl_Belege.Firma, tbl_Belege.Checkbox
FROM tbl_Belege
ORDER BY tbl_Belege.Datum, tbl_Belege.ID;
Wichtig wäre dabei tbl_Belege.Datum und tbl_Belege.Checkbox
Wie würde ein Modul dazu aussehen ?
Bin noch Anfängerin :)
Gruß
Hallo,
z.B. im Ereignis BeforeUpdate eines Datumsfeldes ...
Option Compare Database
Option Explicit
Private Sub DeinDatumsfeld_BeforeUpdate(Cancel As Integer)
'Feldnamen und Ereignisnamen anpassen!
If Not IsNull(Me.DeinDatumsfeld) Then
If PruefeDatum(Me.DeinDatumsfeld) = 0 Then
MsgBox "Datum zu niedrig, Eingabe wird abgebrochen!"
Cancel = True
End If
End If
End Sub
und dazu in einem Standardmodul:
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
'hier entsprechend die Feld und Tabellennamen anpassen!
maxDat = DMax("BelDatum", "tblBelege", "Checkbuch=-1")
If maxDat >= Belegdatum Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
End Function
Codes sind schnell mal zusammengepfistert und nicht getestet!
Danke, dass du dir die Mühe machst :) Habs eingebaut aber da liegt noch irgendwo ein Problem. Wenn ich ein anderes Datum als das heutige bei einem Datensatz eingebe sagt er mir "unzulässige benutzung von 0" der Fehler soll hier liegen:
Public Function PruefeDatum(ByVal Datum As Date) As Byte
Dim maxDat As Date
'hier entsprechend die Feld und Tabellennamen anpassen!
maxDat = DMax("Datum", "tbl_Belege", "Checkbox=-1")
If maxDat >= Datum Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
End Function
Nochmal weiter geforscht.
Der Fehler tritt nur auf, wenn es noch keinen Datensatz mit Checkbox gibt, also bei einer leeren angefangenen Datenbank. Ansonsten funktioniert es wie gewünscht ;) Dafür noch ne Lösung ?
Hi,
du KÖNNTEST das beispielsweise mit der NZ-Funktion verhindern
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
maxDat = Nz(DMax("BelDatum", "tblBelege", "Checkbuch=-1"), 0)
If maxDat <> 0 Then
If maxDat >= Belegdatum Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
End If
End Function
Super Danke !!!!!!!!!!! Hast mir sehr geholfen :)
Hallo,
freut mich!
Würdest du bitte den Thread in DEINEM ersten Beitrag auch noch auf 'gelöst' setzten
DANKE
Hab gerade den Code mit NZ eingebaut, aber jetzt macht er das Gegenteil, also alle Daten die Größer sind nimmt er nicht :)
Hallo,
dann kontrolliere noch mal den Code - bzw. KOPIERE den aus meinem Posting - ich habe das Ganze eben in eine DB verfrachtet und ausprobiert - das läuft!
Das Beispiel ist unten angehängt.
HTH
[Anhang gelöscht durch Administrator]
Der Fehler lag bei mir :)
Hab vielen Dank für deine Mühen !!!!!
Liebe Grüße
Noch eine Frage :)
wäre es auch möglich, den gesamten Monat (anhand des Max Datums) zu sperren ?
Gruß
Ja,
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
Dim monBeleg As Integer
Dim monMaxDat As Integer
maxDat = Nz(DMax("BelDatum", "tblBelege", "Checkbuch=-1"), 0)
If maxDat <> 0 And Year(Belegdatum) = Year(Date) Then
monBeleg = Month(Belegdatum)
monMaxDat = Month(maxDat)
If monMaxDat >= monBeleg Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
Else
PruefeDatum = 0
End If
End Function
In diesem Code wird auch das Jahr berücksichtigt wodurch nur Eingaben im aktuellen Jahr möglich sind.
Natürlich lässt sich der Code noch ein wenig vereinfachen, fürs Verständnis aber habe ich ihn sehr ausführlich gehalten.
HTH
Genial !
Vielen Dank Saskia
so auch eingebaut und läuft :)
Dann müsste man jedes Jahr eine neue Datenbank anlegen ?
Gäbe es auch eine Möglichkeit diese Sperrmethode über mehrere Jahre funktionstüchtig zu halten ?
Danke für die geduldigen Antworten :)
Saskia
Hallo,
nein es ist sicher nicht notwendig weder eigne Tabellen noch eine eigene Datenbank für jedes Jahr zu führen.
mein obiger Code sollte auch 'über die Jahre' sperren, da ja immer nur das aktuelle Jahr als eines der Kriterien verwendet wird.
Das heißt mit anderen Worten, so wie vergangene Monate nicht mehr geändert werden können können auch vergangene Jahre nicht mehr geändert wrden.
Insgesamt ist dieses eine Kombination aus beiden Möglichkeiten.
Du kannst diese aber auch testen indem du in einer KOPIE deiner Datenbank einfach mal mit den Datumseinträgen Versuche startest.
Ich starte ne ausgiebige Testreihe :)
thx !
Hallo Saskia,
bitte setze den Thread in DEINEM ERSTEN Beitrag auf gelöst - nur so erscheint er auch in der Übersicht als abgeschlossen auf.
DANKE
Moin :),
so ich habe jetzt alle möglichen Kombinationen getestet, aber ein Problem gibt es leider noch. Wenn ich das Datum des PCs ein Jahr vorstelle sind Monate, die im vergangenen Jahr erstellt wurden auch im neuen Jahr gesperrt.
Beispiel:
Januar 2012 gesperrt ---> Datum auf 2013 vorgestellt --> Januar 2013 ist auch gesperrt.
Gibts dafür vlt noch eine Lösung ansonsten klappt es perfekt.
P.S. was mir noch aufgefallen ist ich musste damals deinen Code an einer Stelle abändern, damit nicht jeder Zeitraum gesperrt ist, aber ich glaube damit hab ich die Jahresprüfung ganz ausgehebelt:
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
Dim monBeleg As Integer
Dim monMaxDat As Integer
maxDat = Nz(DMax("BelDatum", "tblBelege", "Checkbuch=-1"), 0)
If maxDat <> 0 And Year(Belegdatum) = Year(Date) Then
monBeleg = Month(Belegdatum)
monMaxDat = Month(maxDat)
If monMaxDat >= monBeleg Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
Else
PruefeDatum =1 --------> in Deinem Code stand hier eine 0 ;)
End If
End Function
Vielleicht hilft dir das :) und du dann mir ;). Stehe irgendwie auf dem Schlauch.....
Gruß Saskia
Update Nummer 2:
soooooo ich glaub ich habs, wäre Dir aber dankbar wenn du es dir mal anschaust. Ich habe meinen Code jetzt folgendermaßen umgeschrieben:
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
Dim monBeleg As Integer
Dim monMaxDat As Integer
maxDat = Nz(DMax("BelDatum", "tblBelege", "Checkbuch=-1"), 0)
If maxDat <> 0 And Year(Belegdatum) <= Year(Date) Then
monBeleg = Month(Belegdatum) and Year(Belegdatum)
monMaxDat = Month(maxDat) and Year (maxDat)
If monMaxDat >= monBeleg Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
Else
PruefeDatum =0
End If
End Function
Hallo,
monBeleg = Month(Belegdatum) and Year(Belegdatum)
monMaxDat = Month(maxDat) and Year (maxDat)
nein, das funktioniert nicht richtig - hast du mal geprüft, was da in den Variablen steht?!
Du möchtest für jedes Datum Einträge erlauben, die für das aktuelle Jahr oder früher eingegeben werden,
wobei KEIN Eintrag erfolgen darf wenn das Belegdatum kleiner oder gleich dem letzten gesperrten Datum ist
oder wenn das Belegdatum größer dem letzten gesperrten Datum ist aber das Monat des Belegdatums gleich
dem Monat des letzten gesperrten Datums ist.
Klingt furchtbar ist es aber nicht... ::)
Ich denke, dass untenstehender Code das leisten können sollte.
Public Function PruefeDatum(ByVal Belegdatum As Date) As Byte
Dim maxDat As Date
Dim monBeleg As Integer
Dim monMaxDat As Integer
'Ermittelt den höchsten Datumseintrag mit gesetzter Checkbox
maxDat = Nz(DMax("BelDatum", "tblBelege", "Checkbuch=-1"), 0)
'Prüft ob das eingegebene Datum gültig ist
'und ob das Jahr der Eingabe kleiner oder gleich dem aktuellen Jahr ist
If maxDat <> 0 And Year(Belegdatum) <= Year(Date) Then
monBeleg = Month(Belegdatum)
monMaxDat = Month(maxDat)
If Belegdatum < maxDat Then
'Jede Datumseingabe die VOR dem letzten gesperrten Eintrag liegt wird abgebrochen
PruefeDatum = 0
ElseIf Belegdatum > maxDat Then 'Wenn das Belegdatum höher ist als der
'höchste erledigte Eintrag dann ...
'...liegt die Eingabe im gleichen Jahr und die Monate vom Belegdatum
'und des höchsten gesperrten Eintrags decken sich wird abgebrochen
If Year(Belegdatum) = Year(maxDat) And monBeleg = monMaxDat Then
PruefeDatum = 0
Else
PruefeDatum = 1
End If
Else
'Das Belegdatum und der höchste gesperrte Datumseintrag sind ident
PruefeDatum = 0
End If
Else
'Für alle anderen Fälle wird die Eingabe gesperrt.
PruefeDatum = 0
End If
End Function
Wenn du zusätzlich auch Eingaben verhindern willst die generell in der Zukunft liegen
dann ersetze in obigem Code diese Zeile:
If maxDat <> 0 And Year(Belegdatum) <= Year(Date) Then
durch jene
If maxDat <> 0 And Belegdatum <= Date Then
HTH
p.s. ja, ich weiß dass diese Prozedur zu verkürzen wäre ... ;)
Moin ;),
wow ! Vielen Dank. Gerade den Code eingebaut und getestet und alles läuft perfekt, auch nach einem simulierten Jahreswechsel ! Sehr toll, dass du mir die Erklärungen mit rein geschrieben hast :). So weiß man auch was man da getan hat xD.
Vielen Dank !!!!!!!