Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Apfelsaft am Februar 12, 2012, 11:46:34

Titel: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 11:46:34
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

Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 12, 2012, 12:04:03
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 12:26:41
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ß
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 12, 2012, 12:53:48
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!
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 13:16:27
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 13:20:35
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 ?
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 12, 2012, 14:01:35
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 15:39:09
Super Danke !!!!!!!!!!! Hast mir sehr geholfen :)
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 12, 2012, 17:41:29
Hallo,

freut mich!

Würdest du bitte den Thread in DEINEM ersten Beitrag auch noch auf 'gelöst' setzten

DANKE
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 12, 2012, 17:56:58
Hab gerade den Code mit NZ eingebaut, aber jetzt macht er das Gegenteil, also alle Daten die Größer sind nimmt er nicht :)
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 12, 2012, 20:00:36
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]
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 13, 2012, 09:39:45
Der Fehler lag bei mir :)

Hab vielen Dank für deine Mühen !!!!!

Liebe Grüße
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 13, 2012, 17:19:32
Noch eine Frage :)

wäre es auch möglich, den gesamten Monat (anhand des Max Datums) zu sperren ?

Gruß
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 13, 2012, 22:41:14
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 14, 2012, 10:02:31
Genial !

Vielen Dank Saskia
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 14, 2012, 14:52:43
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 15, 2012, 21:08:07
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.
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am Februar 17, 2012, 14:26:01
Ich starte ne ausgiebige Testreihe :)

thx !
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am Februar 17, 2012, 15:25:11
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am März 25, 2012, 11:54:22
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am März 25, 2012, 16:24:12
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
Titel: Re: Problem Zeitraum sperren
Beitrag von: database am März 25, 2012, 20:50:41
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 ...  ;)
Titel: Re: Problem Zeitraum sperren
Beitrag von: Apfelsaft am März 26, 2012, 10:05:27
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 !!!!!!!