Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
Νέα εγγραφή σε ημερομηνία
Παιδιά την καλησπέρα μου. 1)Έχω μια φόρμα apousies και έχει ημερομηνίες από - έως που καταχωρώ τις απουσίες Η τελική έκθεση όμως πρέπει να βγαίνει μηνιαία. όταν καταχωρώ πχ. μια ασθένεια που περιλαμβάνει 2 μήνες δηλαδή από 18/11/2012 έως 4/12/2012 υπάρχει τρόπος να μου συμπληρώσει το πεδίο έως 30/11/2012 και να κάνει μόνο του μια νέα εγγραφή που να συμπληρώνει το υπόλοιπο δηλ. από 1/12/2012 έως 4/12/2012; 2) Με την πολύτιμη βοήθεια σας έχω φτάσει σε ένα πολύ καλό αποτέλεσμα. Στο ερώτημα της βάσης έχω δοκιμάσει 4 διαφορετικές μεθόδους που μου έχετε υποδείξει αλλά δεν τα κατάφερα να την φτιάξω στην έκθεση, (στο πεδίο τελικές απουσίες). ευχαριστώ και πάλι για την βοήθεια |
#2
| |||
| |||
Καλό μεσημέρι σ' όλο το forum. Σταύρο, στην φόρμα 'apousiesF2' , στα πεδία των ημερομηνιών και στα συμβάντα τους 'After Update', υπάρχει κώδικας που κάνει αυτό που ζητάς. Το πρόβλημα είναι, αν είσαι σίγουρος ότι θέλεις κάτι τέτοιο να συμβαίνει στην βάση σου. π.χ. σε περίπτωση λάθους ή αστοχίας πληκτρολόγησης θα έχεις να διορθώσεις μία εγγραφή (update για τέλος του μήνα) και να να διαγράψεις μία εγγραφή (Insert για αρχή επόμενου έως ημερομηνία επόμενου) και καλά να το δεις αμέσως, αν το δεις μετά από εύλογο χρονικό διάστημα το μόνο που σου μένει είναι να ελέγξεις της εγγραφές με καθολικό. Δεν θέλω να σε "φοβίσω" εσύ ξέρεις. Σκέψου το όμως πριν χρησιμοποιήσεις τον κώδικα. |
#3
| |||
| |||
Κώστα σε ευχαριστώ πολύ. έκανε αυτό που ήθελα όμως όταν του βάλω ασθένεια 4..5...6 μηνών παρακάμπτει τους ενδιάμεσους μήνες. Ένα παράδειγμα αν μια κοπέλα πάρει άδεια εγκυμοσύνης καταλαβαίνεις ότι υπερβαίνει κατά πολύ το διάστημα των 2 μηνών. Ύστερα όταν του κάνω ανανέωση στην φόρμα δεν μου δείχνει το αποτέλεσμα για να γίνει ένας γρήγορος έλεγχος αλλά πρέπει να την κλείσω και να την ξανά ανοίξω για να το δω. Πάντως σε ευχαριστώ που έκαστες και έγραψες έναν τόσο πολύπλοκο κώδικα |
#4
| |||
| |||
Σταύρο, κοίτα την Βάση. |
#5
| |||
| |||
Καλημέρα στην παρέα Σταύρο στην ΒΔ που ανέβασες έχω προσθέσει: 1) Τον πίνακα ApousiesPerMonth_p στον οποίο με κατάλληλο κώδικα καταγράφονται τα χρονικά διαστήματα των απουσιών, αλλά έτσι ώστε η αρχή και το τέλος τους να ανήκει στον ίδιο μήνα. Αντιμετωπίζονται χρονικά διαστήματα πολλών μηνών, αλλά και ετών Έτσι, όταν θέλεις αποτελέσματα ανά μήνα, αντί να χρησιμοποιείς στα ερωτήματα και στις εκθέσεις τον πίνακα apousies_p θα πρέπει να χρησιμοποιείς τον ApousiesPerMonth_p. 2) Τη φόρμα frmDiastimataAnaMina στην οποία πατώντας το σχετικό κουμπί εκτελείται ο κώδικας ο οποίος δημιουργεί τις κατάλληλες εγγραφές στον πίνακα ApousiesPerMonth_p. 3) Τη λειτουργική μονάδα TomiDiastimaton που περιέχει τον κώδικα που φαίνεται παρακάτω. Κώδικας: Option Compare Database Option Explicit Public Sub XronikoDiastimaAnaMina(Optional StartDate As Date = #12:00:00 AM#, _ Optional EndDate As Date = #12/31/9998#) 'Χωρίζει ένα χρονικό διάστημα σε τμήματα έτσι ώστε κάθε τμήμα να ανήκει στον ίδιο μήνα. 'Τα διαστήματα [StartDate, EndDate] τα παίρνει από τον πίνακα apousies_p 'και τα αποτελέσματα τα αποθηκεύει στον πίνακα ApousiesPerMonth_p '==================================================================================== Dim StartMonth As Date, EndMonth As Date 'ημερομηνίες έναρξης και λήξης του μήνα Dim numMonths As Integer, j As Integer 'το πλήθος μηνών του χρονικού διαστήματος Dim rs As DAO.Recordset Dim strSQL As String Dim yr As Integer, mn As Integer Dim Tomi As Variant 'Αποθηκεύει την αρχή και το τέλος της τομής ενός μήνα με το διάστημα On Error GoTo Err_Hadler ' Εγκυρότητα παραμέτρων If StartDate > EndDate Then Exit Sub 'Προσαρμογή άκρων χρονικού διαστήματος για σύμπτωση με την αρχή και το τέλος μήνα StartDate = DateSerial(Year(StartDate), Month(StartDate), 1) EndDate = DateSerial(Year(EndDate), Month(EndDate) + 1, 0) 'Διαγραφή των εγγραφών του πίνακα ApousiesPerMonth_p, δημιουργία recordset CurrentDb.Execute ("DELETE * FROM ApousiesPerMonth_p") strSQL = "SELECT ID_apousies_p, kod_apousies_p, idosapousias_apousies_p, " _ & "apo_apousies_p, eos_apousies_p FROM apousies_p WHERE " _ & "apo_apousies_p>=#" & Format(StartDate, "m/d/yyyy") _ & "# AND eos_apousies_p<= #" & EndDate & "#" Set rs = CurrentDb.OpenRecordset(strSQL) 'Γέμισμα πίνακα ApousiesPerMonth_p With rs If Not (rs.EOF And rs.BOF) Then .MoveFirst Do Until .EOF numMonths = DateDiff("m", !apo_apousies_p, !eos_apousies_p) + 1 yr = Year(!apo_apousies_p): mn = Month(!apo_apousies_p) For j = 0 To numMonths - 1 StartMonth = DateSerial(yr, mn + j, 1) EndMonth = DateSerial(yr, mn + j + 1, 0) Tomi = TomiDiastimatonArray(!apo_apousies_p, !eos_apousies_p, StartMonth, EndMonth) strSQL = "INSERT INTO ApousiesPerMonth_p (ID, kod_apousies_p, " _ & "idosapousias_apousies_p, Apo, Eos) values(" & !ID_apousies_p _ & ", '" & !kod_apousies_p & "', '" & !idosapousias_apousies_p & "' , #" _ & Format(Tomi(1), "m/d/yyyy") & "#, #" & Format(Tomi(2), "m/d/yyyy") & "#)" CurrentDb.Execute strSQL Next .MoveNext Loop End If End With Err_Hadler: If Err <> 0 Then MsgBox "Error: " & Err.Number & vbCrLf & Err.Description End If On Error Resume Next rs.Close: Set rs = Nothing End Sub Public Function TomiDiastimatonArray(Start1 As Variant, End1 As Variant, _ Start2 As Variant, End2 As Variant) As Variant() 'Βρίσκει την τομή των διαστημάτων [Start1, End1] και [Start2, End2] 'Επιστρέφειτην αρχή tStart και το τέλος του διαστήματος της τομής [tStart, tEnd] '================================================================================== Dim Tomi(1 To 2) As Variant 'Αν δεν οριστούν τα διαστήματα If IsNull(Start1) Or IsNull(End1) Or IsNull(Start2) Or IsNull(End2) Then Tomi(1) = Null: Tomi(2) = Null TomiDiastimatonArray = Tomi Exit Function End If 'Αν τα όρια των διαστημάτων δεν είναι σωστά επιστρέφει "Λάθος!" If Start1 > End1 Or Start2 > End2 Then Tomi(1) = "Λάθος!": Tomi(2) = "Λάθος!" TomiDiastimatonArray = Tomi Exit Function End If 'Αν δεν υπάρχει τομή τα διαστήματα χαρακτηρίζονται ως "Ξένα!" If Start2 > End1 Or End2 < Start1 Then Tomi(1) = "Ξένα!": Tomi(2) = "Ξένα!" 'Αν υπάρχει τομή υπολογίζονται τα άκρα της [tStart, tEnd] Else Tomi(1) = IIf(Start1 < Start2, Start2, Start1) Tomi(2) = IIf(End1 < End2, End1, End2) End If TomiDiastimatonArray = Tomi End Function ΥΓ Τι έγινε με το ερώτημα αντιγραφής και επικόλλησης ιδιοτήτων φόρμας. Νομίζω ότι χρωστάς στο φόρουμ μια απάντηση. |
#6
| |||
| |||
Κώστα το ένα πρόβλημα διορθώθηκε. Βλέπω τώρα τον διαχωρισμό επί τόπου. το άλλο όμως είναι ότι δεν το χώρισε σε μήνες αλλά σε 2 μέρη δηλαδή αν βάλω 4/3/2012 έως 5/8/2012 τότε το χωρίζει στα 2: από 4/3/2012 έως 31/3/2012 και 1/8/2012 έως 5/8/2012 έχει χάσει δηλαδή 4 μήνες Σου βγάζω το καπέλο φίλε. |
#7
| |||
| |||
Παράθεση:
δεν είχα καταλάβει ότι ήθελες τα διαστήματα ανά μήνα, δεν το είχες διευκρινήσει. Δεν το έχω κοιτάξει, αλλά είμαι σίγουρος ότι η "ζωγραφική" του Γιώργου θα σε καλύψει. |
#8
| |||
| |||
Γιώργο και Κώστα είσαστε άπαιχτοι. Γιώργο σε ευχαριστώ αλλά θέλω λίγο χρόνο για να δω τι κάνει (τουλάχιστον όσο καταλαβαίνω) Θα σου απαντήσω σε λίγο. (για την απάντηση που λες στην αντιγραφή ιδιοτήτων φόρμας επειδή δεν ήταν αυτό που ζητούσα ...... δηλαδή παράδειγμα ήθελα όλες οι φόρμες με το τρέχον να μεγιστοποίηση... ή αναδυόμενη ναι κλπ.) Η απάντησή σου στο τέλος ότι δεν γίνεται να αντιγραφούν μόνο οι ιδιότητες με κάλυψε και θεώρησα ότι επειδή δεν γίνεται τελείωσε το θέμα. Δεν έκανα κάτι σκόπιμα) Τώρα κοιτάω την δική σου βάση και απαντώ Ευχαριστώ που ασχολήθηκες |
#9
| |||
| |||
Γιώργο έχει δίκιο ο Κώστας ζωγραφίζεις. Ένα πρόβλημα που εντόπισα είναι ότι έβαλα ασθένεια από 1/6/2012 έως 3/12/2012 άνοιξα την φόρμα frmDiastimataAnaMina και έβαλα διάστημα από 7/7/2012 έως 20/10/2012 και στον πίνακα δεν εμφάνισε τίποτα. Ύστερα το άφησα κενό και μου τα εμφάνισε όλα. Μπορεί να διορθωθεί; Με τους παπάδες που έκανες μου άνοιξες την όρεξη για να κάνω πολλά. (όπως να γίνεται το ίδιο που έχετε κάνει με τις εκθέσεις (έκθεση με παραμέτρους) Θα το πολεμήσω. Ευχαριστώ και πάλι |
#10
| |||
| |||
Σταύρο στον κώδικα έχω προβλέψει να επεξεργάζεται μόνο τις εγγραφές που το χρονικό διάστημα στον πίνακα περιέχεται στο διάστημα που καθορίζεις στη φόρμα. Θα μπορούσε να αλλάξει, αν σε βολεύει καλύτερα, για να επεξεργάζεται τις εγγραφές που η έναρξη του χρονικού διαστήματος στον πίνακα περιέχεται σ’ αυτό της φόρμας |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
Διπλότυπη Εγγραφή | choulio19 | Access - Ερωτήσεις / Απαντήσεις | 1 | 25-05-14 19:10 |
[ Συναρτήσεις ] Εγγραφή σε πίνακα | sirpanos | Access - Ερωτήσεις / Απαντήσεις | 8 | 05-05-14 08:48 |
[ Φόρμες ] Έλεγχος για ήδη υπάρχουσα εγγραφή | dimitris p | Access - Ερωτήσεις / Απαντήσεις | 5 | 10-07-12 15:08 |
Αυτόματη εγγραφή | TZON_FON | Access - Ερωτήσεις / Απαντήσεις | 11 | 23-10-10 17:18 |
[ Φόρμες ] ΜΕΤΑΒΑΣΗ ΣΕ ΕΓΓΡΑΦΗ | gregory_m | Access - Ερωτήσεις / Απαντήσεις | 2 | 27-09-10 23:26 |
Η ώρα είναι 19:36.