Εμφάνιση ενός μόνο μηνύματος
  #12  
Παλιά 05-01-14, 17:52
kapetang Ο χρήστης kapetang δεν είναι συνδεδεμένος
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα

Χρήστο κοίταξα λίγο καλύτερα τη ΒΔ σου και διαπίστωσα ότι η τελευταία μέρα απουσίας ενός εργαζόμενου δεν είναι η [ΛήξηΆδειας], αλλά η [ΤελευταίαΜέρα] .

Δηλαδή αν την Παρασκευή συμπληρώνεται η άδειά του αυτός θα λείπει και το Σαββατοκύριακο.

Η τελευταία μέρα είναι αυτή που θα πρέπει να λαμβάνεται υπόψη στους ελέγχους που κάνουμε.

Επειδή η πληροφορία είναι σημαντική θα πρότεινα να προσθέσεις κ’ αυτή στη σχετική φόρμα.

Η ημερομηνία έναρξης μιας άδειας [Start] και η ημερομηνία [ΤελευταίαΜέρα] ορίζουν το χρονικό διάστημα απουσίας του εργαζόμενου (απουσιάζει από [Start] μέχρι και [ΤελευταίαΜέρα]).

Όταν προσθέτουμε μία άδεια ή τροποποιούμε μια παλιά το χρονικό διάστημα που ορίζει (από [Start] μέχρι και [ΤελευταίαΜέρα]) δεν πρέπει να τέμνεται με τα χρονικά διαστήματα που ορίζουν οι άλλες άδειες του εργαζόμενου.

Με βάση τον κανόνα αυτό δημιούργησα για τους ελέγχους τον παρακάτω κώδικα, που είναι σαφέστερος, γενικότερος (δουλεύει και σε άδειες που δεν καταχωρούνται με τη σειρά χορήγησης) και ταχύτερος από αυτόν που πρότεινα στο προηγούμενο μήνυμά μου.


Κώδικας:
Private Sub numDays_BeforeUpdate(Cancel As Integer)
    On Error GoTo Err_Hander

    If Not (IsNull(Me.numDays) Or IsNull(Me.Start)) Then
        If IsInvalidDate Then Cancel = True
    End If

Exit_Sub:
    Exit Sub
Err_Hander:
    MsgBox "Error #" & Err.Number & vbCrLf & Err.Description
    Resume Exit_Sub
End Sub

Private Sub Start_BeforeUpdate(Cancel As Integer)

    On Error GoTo Err_Handler

    If Not (IsNull(Me.numDays) Or IsNull(Me.Start)) Then
        If IsInvalidDate Then Cancel = True
    End If

Exit_Sub:
    Exit Sub
Err_Handler:
    MsgBox "Error #" & Err.Number & vbCrLf & Err.Description
    Resume Exit_Sub
End Sub

Private Function IsInvalidDate() As Boolean
        Dim LastDateSKA As Date, DatesHemi As Integer, EndDate As Date
        Dim strSQL, rs As DAO.Recordset
        
        On Error GoTo Err_Handler
        
        If Me.Parent.Ημερήσιος Then
            LastDateSKA = LastWorkingAbsenceDate(Me.Start, Me.numDays)
        Else
            LastDateSKA = Me.Start - 1 + Me.numDays
        End If
        
        If Me.Parent.Ημερήσιος Then
            DatesHemi = countHmiargiwn(Me.Start, Me.numDays, LastDateSKA)
            EndDate = LastWorkingAbsenceDate(LastDateSKA + 1, DatesHemi, 1)
        Else
            EndDate = Me.Start - 1 + Me.numDays
        End If
        
        strSQL = "SELECT Count(*) AS CountRec FROM qry_Adeies WHERE qry_Adeies.ID <>" & Me.ID _
                & " AND qry_Adeies.Μητρώο='" & Me.Μητρώο & "'" _
                & " AND qry_Adeies.Start<=#" & Format(EndDate, "m/d/yyyy") & "#" _
                & " AND qry_Adeies.ΤελευταίαΜέρα >= #" & Format(Me.Start, "m/d/yyyy") & "#"
    
        Set rs = CurrentDb.OpenRecordset(strSQL)
        If rs!CountRec > 0 Then
            IsInvalidDate = True
            MsgBox "Το διάστημα [Start, ΤελευταίΜέρα] της άδειας τέμνεται τουλάχιστον" & vbCrLf _
                  & "με ένα από τα χρονικά διαστήματα που ορίζουν οι υπόλοιπες άδειες"
        End If
Exit_Function:
        On Error Resume Next
        rs.Close
        Set rs = Nothing
        Exit Function
Err_Handler:
    MsgBox "Error #" & Err.Number & vbCrLf & Err.Description
    Resume Exit_Function
 
End Function
Φιλικά/Γιώργος

Τελευταία επεξεργασία από το χρήστη kapetang : 05-01-14 στις 19:25. Αιτία: υπήρχε λάθος στον υπολογισμό της τελευταίας μέρας του μη ημερήσιου
Απάντηση με παράθεση