Neuigkeiten:

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

Mobiles Hauptmenü

Problem Zeitraum sperren

Begonnen von Apfelsaft, Februar 12, 2012, 11:46:34

⏪ vorheriges - nächstes ⏩

Apfelsaft

#15
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

database

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.

Apfelsaft

Ich starte ne ausgiebige Testreihe :)

thx !

database

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

Apfelsaft

#19
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

Apfelsaft

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

database

#21
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 ...  ;)

Apfelsaft

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 !!!!!!!