This is my corner for documenting my ideas.
It mostly contains posts for Access Databases (samples, full applications, etc.) as i like rapid software application development. Occasionally you will find other stuff like physics notes.

Friday, 30 December 2011

Στατιστικά ΤΖΟΚΕΡ (Μέρος 1)

Στατιστικά για το ΤΖΟΚΕΡ με την Microsoft Access; Όχι δεν γίνομαι JOKER :Ρ



ΚΑΤΕΒΑΣΜΑ (δωρεάν φυσικά): 


H εφαρμογή καλύπτει τα πολύ βασικά (ε, τα ζόρικα να μην τα κρατήσω για μένα;) και την δημοσιεύω κυρίως για εκπαιδευτικούς λόγους και για να δείξω ότι ακόμα και σε σημεία όπου η επεξεργασία με το Excel υπερτερεί σε ευκολία και ταχύτητα, αν γνωρίζουμε πως να φτιάξουμε τα ερωτήματα μας (queries) ακόμα και με visual design (όχι δηλαδή γράφοντας απευθείας το ερώτημα σε SQL) και με τη συνδρομή της VBA μπορείς να χτίσεις μια εφαρμογή που να κάνει ακριβώς αυτό που θες. Φυσικά για όσους θέλουν να ασχοληθούν σοβαρά με το σπορ του κυνηγιού της τυχερής πεντάδας, υπάρχουν πολύ πιο σοβαρά εργαλεία και μάλιστα ανακάλυψα ένα πολύ δυνατό το οποίο είναι και εντελώς δωρεάν. Ο κύριος εδώ έχει το αναπτύσσει χρόνια και κάνει "παπάδες":

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

Πρώτα από όλα χρειάζεσαι τα δεδομένα και στη συγκεκριμένη περίπτωση τις κληρώσεις με τους τυχερούς αριθμούς. Αυτές είναι διαθέσιμες από το site του ΟΠΑΠ (ανά έτος) και ρίχνοντας τες μέσα σε ένα Excel μπορούμε να τις ενώσουμε σε ένα μεγάλο αρχείο (πχ. joker.xls) πετώντας πληροφορίες που δεν μας ενδιαφέρουν για τη συγκεκριμένη εφαρμογή (π.χ. αριθμό νικητών και διανεμόμενα κέρδη). Επειδή ξέρω ότι βαριέστε να το κάνετε, πάρτε το και αυτό έτοιμο:

Αυτό το αρχείο μετά μπορούμε να το εισάγουμε στην Access από το μενού File->Get External Data->Import όπως φαίνεται στο screenshot



Eπιλέγουμε το αρχείο του excel μας, πατάμε Import και ξεκινάει η διαδικασία εισαγωγής. Πρέπει να "πούμε" ότι στην πρώτη γραμμή είναι οι "ταμπέλες" των δεδομένων:


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


και τέλος να το σιγουρέψουμε δηλώνοντας ότι το ID είναι το πρωτεύον κλειδί



και έτσι έχουμε ένα πίνακα στην Access με όλες τις κληρώσεις έτοιμο να τον "εκμεταλλευτούμε" (ας τον σώσουμε με όνομα joker). Ένα σημαντικό στοιχείο για τον πίνακα είναι να είναι ορισμένα τα πεδία των αριθμών των κληρώσεων ως "αριθμοί ως τύπος" και όχι κείμενο γιατί παίζει σημαντικό ρόλο για το πως αντιλαμβάνεται η βάση τα δεδομένα της. Αυτό μπορούμε να το ελέγξουμε ανοίγοντας τον πίνακα σε μορφή σχεδίασης και κοιτάζοντας τους τύπους των πεδίων.



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

Πάμε: χρησιμοποιώντας τον ενσωματωμένο οδηγό για τη δημιουργία ερωτημάτων ρίχνουμε όλα τα τα πεδία του πίνακα μας μέσα στο ερώτημα και αποθηκεύουμε το query (με όνομα π.χ. qry_drawings)




Τώρα με τον ενσωματωμένο οδηγό δημιουργίας φορμών δημιουργούμε τη φόρμα μας η οποία θα βασίζεται στο qry_drawings για να παρουσιάζει δεδομένα. Προς το παρόν το query μας "ταυτίζεται" με τον πίνακα joker. 




Από τους ενσωματωμένους τρόπους διάταξης των δεδομένων επιλέγουμε Tabular έτσι ώστε να μπορούμε να βλέπουμε πολλές κληρώσεις ταυτόχρονα.



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



Τώρα πως θα κάνουμε την φόρμα να μας παρουσιάζει κληρώσεις για την περίοδο που επιθυμούμε; Προφανώς θα πρέπει να προσθέσουμε δύο πεδία στα οποία θα ορίζουμε τα χρονικά διαστήματα αρχής και έναρξης και μετά θα πρέπει το query να μας δίνει τις κληρώσεις με ημερομηνίες ανάμεσα στα δύο αυτά διαστήματα και τέλος η φόρμα να μας παρουσιάζει μόνο αυτές. Αυτή η τεχνική είναι γνωστή ως parameter query using criteria from a form (μην αυτοκτονήσετε ακόμα, έχει και πιο δύσκολα!)

Έτσι σε λειτουργία σχεδίασης της φόρμας προσθέτουμε δύο πεδία τύπου κειμένου και ονομάζουμε το πρώτο StartDate και το δεύτερο EndDate με format ημερομηνίας (short date) φυσικά.




Ιδού




Τώρα θα πρέπει να "πούμε" στο query να μας δίνει τις κληρώσεις σύμφωνα με τις ημερομηνίες στα δύο πεδία που προσθέσαμε. Σε ότι αφορά ημερομηνίες αυτό γίνεται γενικά με τον τελεστή between. Εδώ όμως τα πράγματα είναι πιο σύνθετα. Έτσι ανοίγουμε το qry_drawings σε μορφή σχεδίασης, πάμε στο πεδίο Date και στη γραμμή Criteria προσθέτουμε αυτά της εικόνας



που λένε ότι η ημερομηνίες των κληρώσεων πρέπει να είναι ανάμεσα σε όσα ορίζουν τα StartDate και EndDate αλλά επειδή ενδέχεται να έχει συμπληρωθεί μόνο ένα από τα δύο πεδία πρέπει να μπoυν ακόμα δύο συνθήκες (or) για τα StartDate και EndDate. Νομίζω ότι οι αριθμητικοί τελεστές >,<,= και ο λογικός τελεστής And δεν χρειάζονται επεξήγηση. Συνολικά είπαμε στο query να μας δίνει τις κληρώσεις με Date ανάμεσα (ή ίσο με) στα StartDate και EndDate αν έχουν συμπληρωθεί και τα δύο, όσες είναι μεγαλύτερες ή ίσες από το StartDate αν έχει τιμή μόνο αυτό το πεδίο και αντίστοιχα για το EndDate.

Σώζουμε και είμαστε σχεδόν έτοιμοι. Γιατί σχεδόν;

Γιατί όταν φορτώνει η φόρμα για πρώτη φορά δεν έχουν εισαχθεί ημερομηνίες ως κριτήρια και έτσι το query μας δίνει όλες τις κληρώσεις. Θα πρέπει να πούμε στην Access με κάποιο τρόπο ότι αφού εισάγουμε μία ημερομηνία ως κριτήριο να πάει να "τρέξει" το ερώτημα ξανά και η φόρμα να εμφανίσει τα νέα αποτελέσματα. Πως γίνεται αυτό; Εδώ θα  χρειαστούμε λίγη VBA. 

Πάμε στη φόρμα σε μορφή σχεδίασης πάλι και πάμε στις ιδιότητες (properties) του πεδίου StartDate, μετακινούμαστε στο tab Event και στο πεδίο AfterUpdate επιλέγουμε [EventProcedure]. Δηλαδή λέμε στην Access όταν καταχωρηθεί κάτι στο πεδίο StartDate να τρέξει μια διαδικασία. Ποια είναι αυτή; Πατάμε το κουμπάκι με τις τελίτσες για να την φτιάξουμε.




Ανοίγει το παράθυρο της VBA (κρατηθείτε :Ρ) και εισάγουμε τη γραμμή που έχω κυκλώσει με κόκκινο. Αυτή λέει στην Access μετά την ενημέρωση του StartDate με νέα δεδομένα (AfterUpdate) να ανανεώσει τα δεδομένα της φόρμας από το ερώτημα στο οποίο βασίζεται (requery). Το ίδιο κάνουμε και για το EndDate και είμαστε έτοιμοι.




Στο παρακάτω screenshot έχω ζητήσει όλες τις κληρώσεις από την αρχή του 2011 χωρίς να θέσω τιμή στο EndDate και βλέπετε ότι μου δίνει 104 από συνολικά 1468 (μέχρι 29/12/2011).




Τώρα μπορείτε να αυτοκτονήσετε! :Ρ
Όσοι αντέξατε στο επόμενο μέρος θα δούμε και άλλα σκληρά...