Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > [ Συναρτήσεις ] Έλεγχος Παλαιότερης Ημερομηνίας

Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια!

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 03-01-14, 18:57
Όνομα: Χρήστος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 24-01-2010
Περιοχή: Φλώρινα
Μηνύματα: 164
Προεπιλογή Έλεγχος Παλαιότερης Ημερομηνίας

Φίλοι μου θα ήθελα να μάθω πώς μπορώ με κώδικα να ελέγξω εάν η ημερομηνία που εισάγω σε ένα πλαίσιο δεν είναι παλαιότερη η ίση με τις ημερομηνίες που έχω είδη περάσει για το ίδιο άτομο.


Π.χ. ενώ βρίσκομαι σε έναν μισθωτό και έχω περάσει σε αυτόν 7-8 ημερομηνίες που εργάστηκε και από λάθος πάω να περάσω μια παλαιότερη από την τελευταία που έχω εισάγει εκεί θέλω να με προειδοποιεί.
Απάντηση με παράθεση
  #2  
Παλιά 03-01-14, 20:59
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα

Χρήστο θα μπορούσες στη φόρμα που καταχωρείς τις ημερομηνίες των μισθωτών να δημιουργήσεις ένα κανόνα επικύρωσης.

Αν υποθέσουμε ότι:

1) Ο πίνακας στον οποίο αποθηκεύονται οι ημερομηνίες λέγεται tblDates.

2) Το πεδίο της ημερομηνίας λέγεται fDate

3) Η ταυτότητα (πεδίο που προσδιορίζει μοναδικά το μισθωτό) EmpID

Ο κανόνας επικύρωσης μπορεί να υλοποιηθεί ως εξής:

1) Σε προβολή σχεδίασης της φόρμας, στην ιδιότητα Validation Rule (βρίσκεται στην καρτέλα Data), του πεδίου fDate, πληκτρολογούμε τον τύπο:

[fDate]>DMax("[fDate]";"[tblDates]";"[EmpID] =" & [EmpID]).

2) Στην ιδιότητα Validation Text, πληκτρολογούμε το μήνυμα που θα εμφανίζεται, όταν παραβιάζεται ο κανόνας.

Για παράδειγμα: Η ημερομηνία δεν υπερβαίνει τις καταχωρημένες.

Αν το EmpID είναι πεδίο κειμένου θα πρέπει να πληκτρολογήσεις τον τύπο:

[fDate]>DMax("[fDate]";"[tblDates]";"[EmpID] ='" & [EmpID] & "'").

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #3  
Παλιά 04-01-14, 08:27
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλημέρα

Χρήστο η λύση του προηγούμενου μηνύματος έχει αρκετά κουσούρια.

Για μια πιο ολοκληρωμένη λύση, θα πρότεινα τον παρακάτω κώδικα:

Κώδικας:
Private Sub fDate_BeforeUpdate(Cancel As Integer)
    Dim minDate As Date, maxDate As Date, strC As String
    If Me.NewRecord Then
        If Me.fDate <= Nz(DMax("[fDate]", "[tblDates]", "[EmpID] =" & [EmpID]), 0) Then
            MsgBox "Η ημερομηνία δεν υπερβαίνει τις προηγούμενες"
            Cancel = True
        End If
    Else
        'Αρχή σχολίων
        strC = "[EmpID] =" & [EmpID] & " And [ID] < " & Me.ID
        minDate = Nz(DMax("[fDate]", "[tblDates]", strC), 0)
        strC = "[EmpID] =" & [EmpID] & " And [ID] > " & Me.ID
        maxDate = Nz(DMin("[fDate]", "[tblDates]", strC), #1/1/9999#)
        If Me.fDate < minDate Or Me.fDate > maxDate Then
            MsgBox "Η νέα ημερομηνία πρέπει να είναι ανάμεσα στις υπάρχουσες"
            Cancel = True
        End If
        'τέλος σχολίων
    End If
End Sub
Το πεδίο ID στον κώδικα είναι το πρωτεύον κλειδί του πίνακα.

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

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #4  
Παλιά 04-01-14, 12:53
Όνομα: Χρήστος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 24-01-2010
Περιοχή: Φλώρινα
Μηνύματα: 164
Προεπιλογή

Δυστυχώς Γιώργο δεν μου δούλεψε κανένα, βασικά το πρόβλημα πιστεύω πώς είναι στο :

Η ταυτότητα (πεδίο που προσδιορίζει μοναδικά το μισθωτό) EmpID

Το πεδίο EmpID δεν είναι μοναδικό μπορεί να υπάρχει 5,10, 15 φορές αυτό υποδουλώνει της εγγραφές στον συγκεκριμένο μισθωτό.

Δηλαδή η βάση δουλεύει με δύο πίνακες ο ένας περιέχει τα στοιχεία του μισθωτού όπου εκεί το πεδίο EmpID είναι μοναδικό και ο άλλος πίνακας περιέχει τις εγγραφές των ημερών και συνδέονται μεταξύ τους με το πεδίο EmpID και με σχέση ένα προς πολλά.

Ευχαριστώ για την βοήθεια Γιώργο, και συ προσπαθείς να δώσεις οδηγίες όπως σε μια ιατρική εξέταση δια τηλεφώνου, τη άλλο να κάνεις...

Αυτό που κατάλαβα ότι πρέπει να κινηθώ με την Dmax - Dmin θα το παλέψω...
Απάντηση με παράθεση
  #5  
Παλιά 04-01-14, 14:49
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα

Χρήστο, ο κώδικας που σου πρότεινα θα πρέπει να εισαχθεί στη φόρμα που καταχωρείς τις ημερομηνίες των μισθωτών.

Το πεδίο EmPID είναι πρωτεύον κλειδί στον πίνακα με τα ονόματα των μισθωτών (πχ Employees) και εξωτερικό στον πίνακα όπου καταχωρείς τις ημερομηνίες (πχ tblDates).

Όλα τα πεδία που αναφέρονται στον κώδικα, αφορούν τον πίνακα των ημερομηνιών (tblDates).

Δες και τη συνημμένη ΒΔ

Φιλικά/Γιώργος

ΥΓ. Αν το πεδίο EmplID δεν είναι αριθμητικό, αλλά κειμένου, ο κώδικας για να δουλέψει χρειάζεται μια μικρή τροποποίηση.
Συνημμένα Αρχεία
Τύπος Αρχείου: accdb DateAfterDates.accdb (352,0 KB, 18 εμφανίσεις)
Απάντηση με παράθεση
  #6  
Παλιά 04-01-14, 17:22
Όνομα: Χρήστος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 24-01-2010
Περιοχή: Φλώρινα
Μηνύματα: 164
Προεπιλογή

Γιώργο καλά ανέφερα προηγουμένως παίζουμε σπασμένο τηλέφωνο και για αυτό φταίω εγώ, συγνώμη για την αναστάτωση.

Εκ των υστέρων σου ανεβάζω μια πειραματική βάση για να κατανοήσεις πώς έχω το σύστημα όταν πάω να εισάγω μια καινούργια ημερομηνία.

Αυτό έπρεπε να το είχα κάνει από αρχής..:
Συνημμένα Αρχεία
Τύπος Αρχείου: zip Test kanonikes.zip (73,8 KB, 7 εμφανίσεις)
Απάντηση με παράθεση
  #7  
Παλιά 04-01-14, 20:20
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα

Χρήστο έκανα την προσαρμογή, αλλά με προβλήματα στον κώδικα που αντιμετωπίζει την περίπτωση τροποποίησης παλιών αδειών

Τα σημειώνω ως σχόλια στον κώδικα.

Αν κατάλαβα καλά, όταν τροποποιούμε μια παλιά ημερομηνία η νέα ημερομηνία πρέπει να είναι ανάμεσα στη μέγιστη [ΗμερομηνίαΛήξης] ( στον κώδικα μεταβλητή minDate) των προηγούμενων αδειών και στην ελάχιστη [Start] (στον κώδικα μεταβλητή maxDate) των επόμενων.

Κανονικά θα πρέπει να εξετάζεται και η διάρκεια της άδειας, ώστε η λήξη της να μη είναι μέσα στην επόμενη άδεια ([ΗμερομηνίαΛήξης]< maxStart).

Ελπίζω να μπορέσεις να υλοποιήσεις και την περίπτωση τροποποίησης παλιών αδειών.

Φιλικά/Γιώργος
Συνημμένα Αρχεία
Τύπος Αρχείου: zip Test kanonikes2.zip (80,7 KB, 14 εμφανίσεις)
Απάντηση με παράθεση
  #8  
Παλιά 04-01-14, 21:53
Όνομα: Χρήστος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 24-01-2010
Περιοχή: Φλώρινα
Μηνύματα: 164
Προεπιλογή

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

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

Έτσι ακούγεται πιο απλό ??
Απάντηση με παράθεση
  #9  
Παλιά 04-01-14, 22:45
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Αν περιοριστούμε μόνο στις νέες εγγραφές ο παρακάτω κώδικας είναι αρκετός:

Κώδικας:
Private Sub Start_BeforeUpdate(Cancel As Integer)

'Η έναρξη πρέπει να είναι μεγαλύτερη από τη μέγιστη ημερομηνία [ΛήξηΆδειας]
    If Me.NewRecord Then
        If Me.Start <= Nz(DMax("[ΛήξηΆδειας]", "[qry_Adeies]", "[Μητρώο] ='" & Me.Μητρώο & "'"), 0) Then
            MsgBox "Η ημερομηνία δεν υπερβαίνει τις προηγούμενες"
            Cancel = True
        End If
    End If
End Sub
Απάντηση με παράθεση
  #10  
Παλιά 05-01-14, 07:11
Όνομα: Χρήστος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 24-01-2010
Περιοχή: Φλώρινα
Μηνύματα: 164
Προεπιλογή

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

Τώρα ως προς τις διορθώσεις που αναφέρεις, δεν αξίζει τον κόπο διότι είναι μόλις δυο – τρείς τον χρόνο και τις κάνω εύκολα, η μάστιγα ήταν η παλαιότερη ημερομηνία που πάντα έπρεπε να ελέγχω και όλο και κάτι ξέφευγε και αυτό από μόνο του δημιουργούσε μελλοντικές διορθώσεις.

Εφόσον η βάση ξεκινήσει για το 2014 από το μηδέν και κάθε άδεια ελέγχεται πλέον τότε νομίζω πώς δεν θα υπάρχει πρόβλημα.

Όσον αφορά εσένα Γιώργο δεν ξέρω πώς μπορώ να σε ευχαριστήσω για πολλοστή φορά διότι μέσω αυτού του Forum με έχεις ξελασπώσει πάρα πολλές φορές…

Δεν νομίζω πώς αρκούν τα λόγια μα αφού μόνο αυτά διαθέτουμε μέσω του Forum Ευχαριστώ για άλλη μια φορά Γιώργο.

Υ.Γ. Θυμήσου αυτή η εφαρμογή δέχτηκε άπειρη βοήθεια από εσένα για να την στήσω (στην κανονική έκδοση).
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
[VBA] Έλεγχος και συμπλήρωση Α.Φ.Μ. Spirosgr Excel samples - Χρήσιμα αρχεία & παραδείγματα 0 19-09-16 12:33
Έλεγχος Ποσού thanosgr Access - Ερωτήσεις / Απαντήσεις 4 25-02-16 13:26
Έλεγχος προσωπικών στοιχείων γιώργοςΚ Access - Ερωτήσεις / Απαντήσεις 3 02-01-16 19:47
ΕΛΕΓΧΟΣ ΣΕ ΔΥΟ ΠΙΝΑΚΕΣ NIC Access - Ερωτήσεις / Απαντήσεις 2 12-03-10 18:58


Η ώρα είναι 04:42.