Καλησπέρα στην παρέα
Η βάση δεδομένων «TestDates.mdb», που επισυνάπτεται σε προηγούμενο μήνυμά μου, ενσωματώνει κάποιες διαπιστώσεις του φίλου μου Νίκου (meteora) και δικές μου, σχετικά με το σωστό χειρισμό των ημερομηνιών, στην acces, και δίνει δυνατότητες πειραματισμού.
Μετά την παρέμβαση και του φίλο μου του Τάσου, ασχολήθηκα κάπως περισσότερο με την τρέχουσα ημερομηνία και τις σχετικές δοκιμές τις ενσωμάτωσα στη φόρμα «frmCurrentDate», της συνημμένης βάσης «testDates2.mdb», που περιλαμβάνει και την «TestDates.mdb», έτσι ώστε όλος ο προβληματισμός να βρίσκεται σ’ ένα αρχείο.
Η λειτουργικότητα της φόρμας «frmCurrentDate» οφείλεται στον παρακάτω κώδικα.
Κώδικας:
Private Sub cmdDate1_Click()
'Επιστρέφει την αφετηρία μέτρησης των ημερομηνιών (0=30/12/1899), της access
'Αν υποθέσουμε ότι η τρέχουσα ημερομηνία είναι 13/11/2010 η μέθοδος .execute
'εκτελεί την πρόταση:INSERT INTO [tblDates] ( [TestDates] ) values(13/12/2010)
'η παράσταση 13/12/2010 είναι ένα πηλίκο με τιμή 0,0005 που ισοδυναμεί με την 30/12/1899
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values(" & Date & ")", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
End Sub
Private Sub cmdDate2_Click()
'Επιστρέφει σωστό αποτέλεσμα, μολονότι η ημερομηνία εισάγεται ως κείμενο
'Αν υποθέσουμε ότι η τρέχουσα ημερομηνία είναι 13/11/2010 η μέθοδος .execute
'εκτελεί την πρόταση:INSERT INTO [tblDates] ( [TestDates] ) values('13/12/2010')
'Από την SQL και τη μέθοδο .execute η '13/12/2010' ερμηνεύεται σωστά
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values('" & Date & "')", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
End Sub
Private Sub cmdDate3_Click()
'Η μέθοδος .execute εκτελεί την πρόταση:
'INSERT INTO [tblDates] ( [TestDates] ) values(Date)
'Η Date δεν αναγνωρίζεται ως συνάρτηση και επιστρέφεται λάθος
On Error GoTo err_trap
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values(Date)", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
err_exit:
Exit Sub
err_trap:
MsgBox Err.Description
GoTo err_exit
End Sub
Private Sub cmdDate4_Click()
'Η μέθοδος .execute εκτελεί την πρόταση:
'INSERT INTO [tblDates] ( [TestDates] ) values(Date())
'Η Date() αναγνωρίζεται ως συνάρτηση και επιστρέφεται σωστό αποτέλεσμα
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values(Date())", dbFailOnError
'Ίδια πρόταση SQL μπορούμε να δομίσουμε με πολλούς τρόπους, όπως
'CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] )" & " values(Date())", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
End Sub
Private Sub cmdDate5_Click()
'Αν υποθέσουμε ότι η τρέχουσα ημερομηνία είναι 10/11/2010 η μέθοδος .execute
'εκτελεί την πρόταση:INSERT INTO [tblDates] ( [TestDates] ) values(#10/11/2010#)
'Επειδή θεωρείται ότι η ημερομηνία είναι σε μορφή ΗΠΑ (mm/dd/yyyy)αποθηκεύυεται
'η ημερομηνία 11/10/2010. Το περίεργο είναι ότι αν η μέρα είναι πάνω από 12
'(μέγιστη τιμή μήνα), αντί να εμφανιστεί κάποιο λάθος, δε γίνεται η εναλλαγή
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values(#" & Date & "#)", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
End Sub
Private Sub cmdDate6_Click()
'Αν υποθέσουμε ότι η τρέχουσα ημερομηνία είναι 10/11/2010 η μέθοδος .execute
'εκτελεί την πρόταση:INSERT INTO [tblDates] ( [TestDates] ) values(#11/10/2010#)
'Επειδή η ημερομηνία είναι η ελληνική σε σωστή μορφή ΗΠΑ (mm/dd/yyyy)αποθηκεύυεται
'και εμφανίζεται σωστά (11/10/2010).
CurrentDb.Execute "INSERT INTO [tblDates] ( [TestDates] ) values(#" & Format(Date, "mm/dd/yyyy") & "#)", dbFailOnError
Me.Requery
Me.Recordset.MoveLast
End Sub
Στα σχόλια του κώδικα προσπάθησα να δώσω μία λογική ερμηνεία στον τρόπο που δομούνται οι προτάσεις SQL στο περιβάλλον της
VBA και πως τις αποτιμά η access (μέθοδος .execute), όταν περιέχουν την τρέχουσα ημερομηνία.
Η ερμηνεία είναι προσωπική και βασίζεται στη διαμόρφωση της πρότασης SQL τη στιγμή της εκτέλεσης. Διαφορετικές συνεπώς απόψεις είναι ευπρόσδεκτες.
Για να γίνει σωστή δοκιμή των διάφορων περιπτώσεων θα πρέπει η ημερομηνία να ρυθμιστεί (προσωρινά) σε μία ημερομηνία μικρότερη από 11/11/2010.
Τάσο η λύση που προτείνεις για την εισαγωγή μιας εγγραφής με την τρέχουσα ημερομηνία λειτουργεί σωστά.
Φιλικά/Γιώργος