Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Problem Zeitraum sperren

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

⏪ vorheriges - nächstes ⏩

Apfelsaft

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


database

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

Apfelsaft

#2
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ß

database

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!

Apfelsaft

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

Apfelsaft

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 ?

database

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

Apfelsaft

Super Danke !!!!!!!!!!! Hast mir sehr geholfen :)

database

Hallo,

freut mich!

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

DANKE

Apfelsaft

Hab gerade den Code mit NZ eingebaut, aber jetzt macht er das Gegenteil, also alle Daten die Größer sind nimmt er nicht :)

database

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]

Apfelsaft

Der Fehler lag bei mir :)

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

Liebe Grüße

Apfelsaft

Noch eine Frage :)

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

Gruß

database

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

Apfelsaft