Βάσεις Δεδομένων Εργαστήριο 3 Διαφάνεια 1
Πώς να δημιουργήσω μια συσχέτιση πολλά προς πολλά στην ACCESS; Η απάντηση στο παραπάνω θέμα, θα δοθεί μέσα από ένα παράδειγμα μιας μικρής βάσης δεδομένων. Το μοντέλο οντοτήτων συσχετίσεων δίνεται από το παρακάτω σχήμα: Επωνυμία Κωδ. Πελάτη Πόλη Τ.Κ. Ημερ. Έτοιμο Όνομα Επώνυμο Νομός Κωδ. Αντιπρ. Διεύθυνση 1 Επωνυμία Διεύθυνση 1 Κωδ. Αντιπρ. Πατρώνυμο E-mail Χώρα Διεύθυνση 2 Κωδ. Πελάτη Αρμόδιος Διεύθυνση 2 Ημερ, Παραγγ. Ημερ. Αποστ. ΑΝΤΙΠΡΟΣΩΠΟΣ ΠΑΡΑΓΓΕΛΙΑ ΠΕΛΑΤΗΣ Πόλη Σημειώσεις Κόστος Μετ. Έξοδα Έκπτωση Νομός Τηλέφωνο Νομός Διεύθυνση Συν. Οφειλή ΦΑΞ Χώρα Αριθμ. Παραγγ. Ποσ. Φόρου Max Πίστωση Τ.Κ. Κινητό Τ.Κ. Πόλη Όροι Τηλέφωνο Τελ. Πληρ. Συν. Φόρου Τιμολόγηση Καταβολή Τελ. Πληρωμή Διαφάνεια 2
Για την οντότητα αντιπρόσωπος με όνομα "ΑΝΤΙΠΡΟΣΩΠΟΣ", έχουμε τα εξής: Ιδιότητα οντότητας Όνομα γνωρίσματος Περιγραφή Κωδικός SalesRepID Μοναδικός κωδικός αντιπροσώπου πωλήσεων (πχ 15) Όνομα Πατρώνυμο FirstName MiddleName Όνομα (πχ Μιχάλης) Αρχικό Πατρώνυμο (πχ Σάββας) Επώνυμο LastΝame Επώνυμο (πχ Παπαδόπουλος) Ηλεκτρονικό Ταχυδρομείο EmailName Ηλεκτρονική Διεύθυνση πχ papadm@uom.gr Διεύθυνση Πόλη Address City Διεύθυνση πχ Παπάφη 25 Πόλη πχ Θεσσαλονίκη Διαφάνεια 3 Νομός State Νομός πχ Θεσσαλονίκης Τ.Κ. Zip Ταχυδρομικός Κώδικας πχ 553 37 Τηλέφωνο HomePhone Τηλέφωνο σπιτιού (πχ 2310 999 999) Κινητό Τηλέφωνο Pager Κινητό Τηλέφωνο (πχ. 6955 555 555)
Για την οντότητα πελάτης με όνομα "ΠΕΛΑΤΗΣ", έχουμε τα εξής: Ιδιότητα οντότητας Κωδικός Επωνυμία Όνομα αρμοδίου Διεύθυνση 1 Διεύθυνση 2 Πόλη Νομός PostalCode Χώρα Τηλέφωνο FAX Πίστωση Οφειλή Όνομα γνωρίσματος CustomerID CompanyName CustomerName Address Address City State Zip Country PhoneNumber FaxNumber CreditLimit AmountOwed Όνομα αρμοδίου στην εταιρία (πχ Φωτόπουλος Γιώργος) Διεύθυνση 1 (πχ Παπάφη 25) Διεύθυνση 2 (πχ Σερρών 28) Πόλη (πχ Θεσσαλονίκη) Νομός ή Επαρχία (πχ ΘΕΣ) Ταχυδρομικός Κώδικας (πχ 553 37) Χώρα (πχ Ελλάδα) Περιγραφή Μοναδικός κωδικός πελάτη (πχ 8) Επωνυμία Εταιρίας Πελάτη (πχ Alpha Products) Αριθμός Τηλεφώνου (πχ 2310 999 999) Αριθμός φαξ (πχ 2310 999 999) Μέγιστη επιτρεπτή πίστωση (πχ 3.000 ) Συνολική Οφειλή (πχ 2.000 ) Διαφάνεια 4
Ηδιαδικασίαέχειωςεξής: κατασκευάζουμε τους δύο πίνακες και στη συνέχεια δημιουργούμε τον πίνακα της σχέσης. Αυτό είναι όλο! Ας δημιουργήσουμε λοιπόν αρχικά τον πίνακα ΑΝΤΙΠΡΟΣΩΠΟΣ και στη συνέχεια τον πίνακα ΠΕΛΑΤΗΣ Θα επισημαίνουμε πλέον στη δημιουργία πινάκων πεδία για των οποίων οι ιδιότητες παρουσιάζουν ξεχωριστό ενδιαφέρον (όσα δεν αναφέρονται θεωρούνται ότι μπορούν πλέονναγίνουνεύκολααπότονκαθένα) Διαφάνεια 5
Ο πίνακας ΑΝΤΙΠΡΟΣΩΠΟΣ δεν παρουσιάζει καμία ιδιαιτερότητα στην κατασκευή του Ητελικήτουμορφήθαέχειτη μορφή της διπλανής εικόνας Διαφάνεια 6
Για τον πίνακα ΠΕΛΑΤΗ ημόνη ιδιαιτερότητα στην κατασκευή του είναι η εξής: Για το πεδίο State (Νομός/Επαρχία) επιθυμούμε να ορίσουμε εμείς κάποιες τιμές που μπορεί μόνο να επιλέξει ο χρήστης ή διαφορετικά μπορεί να επιλέξει να αφήσει το συγκεκριμένο πεδίο κενό. Δηλαδή το πεδίο State επιθυμούμε να μπορεί να δεχθεί τις τιμές "ΑΤΤ", "ΘΕΣ", "ΑΧΑ", "ΗΡΑ", "ΜΑΓ", "ΛΚΣ" ή " ". Όπως παρατηρούμε στη διπλανή εικόνα θέτουμε την τιμή στην ιδιότητα Κανόνας επικύρωσης ""ΑΤΤ" Or "ΘΕΣ" Or "ΑΧΑ" Or "ΗΡΑ" Or "ΜΑΓ" Or "ΛΚΣ" Or Is Null " Διαφάνεια 7
Επίσης αναφέρουμε και τα πεδία που αποτελούν ευρετήρια για τον πίνακα ΠΕΛΑΤΗΣ CustomerID (Πρωτεύον Κλειδί) PostalCode State City CompanyName Σε όλα η ταξινόμηση είναι με αύξουσα σειρά Διαφάνεια 8
Τέλος θα αναφέρουμε ακόμα μία συνθήκη ελέγχου σε επίπεδο του πίνακα ΠΕΛΑΤΗΣ και όχι κάποιου πεδίου Ενώ βρίσκεστε στη σχεδίαση του πίνακα, επιλέξτε Προβολή.Ιδιότητες Εδώ μπορούμε να δηλώσουμε Κανόνας επικύρωσης (συνθήκη ελέγχου) πως απαιτούμε να ισχύει η σχέση "[AmountOwed] <= [CreditLimit]" Αντίστοιχα μπορούμε να δηλώσουμε σαν Κείμενο επικύρωσης "To οφειλόμενο ποσό δεν μπορεί να υπερβαίνει το πιστωτικό όριο" για περισσότερη σαφήνεια σε περίπτωση λάθους του χρήστη Διαφάνεια 9
Έτσι πίνακας ΠΕΛΑΤΗΣ θα έχει τη μορφή της διπλανής εικόνας Διαφάνεια 10
Τέλος η σχεδίαση των πινάκων των δύο οντοτήτων ΑΝΤΙΠΡΟΣΩΠΟΣ και ΠΕΛΑΤΗΣ Αςδούμετώρατιγίνεταιμετονπίνακατηςσχέσης ΠΑΡΑΓΓΕΛΙΑ Να θυμόμαστε ότι αυτός ο πίνακας, απαιτεί συνήθως για τη δημιουργία του δικού του πρωτεύοντος κλειδιού, τουλάχιστον τον συνδυασμό, των πρωτευόντων κλειδιών των πινάκων των οντοτήτων που σχετίζει, δηλαδή των πινάκων ΑΝΤΙΠΡΟΣΩΠΟΣ και ΠΕΛΑΤΗΣ Διαφάνεια 11
Για τη σχέση με όνομα "ΠΑΡΑΓΓΕΛΙΑ", έχουμε τα εξής: Ιδιότητα οντότητας Όνομα γνωρίσματος Περιγραφή Κωδ. Πελάτη CustomerID Κλειδί πίνακα Πελάτες (πχ 8) Κωδ. Αντιπρ. SalesRepID Κωδικός πωλητή στον οποίο έγινε η παραγγελία Ημερ. Παραγγ. Ημερ. Έτοιμο OrderDate PromisedByDate Ημερομηνία παραγγελίας Ημερομηνία που πρέπει να είναι έτοιμη η παραγγελία Επωνυμία ShipName Όνομα ατόμου ή εταιρίας που θα παραλάβει Διεύθυνση 1 Διεύθυνση 2 ShipAddress1 ShipAddress2 Διεύθυνση αποστολής (δεν επιτρέπεται ταχ. Θυρίδα) Διεύθυνση αποστολής (δεν επιτρέπεται ταχ. Θυρίδα) Διαφάνεια 12 Πόλη ShipCity Πόλη Αποστολής Νομός ShipState Νομός ή επαρχία αποστολής Τ.Κ. ShipPostalCode Ταχυδρομικός κωδικός αποστολής Χώρα ShipCountry Χώρα αποστολής
Για τη σχέση με όνομα "ΠΑΡΑΓΓΕΛΙΑ", έχουμε τα εξής: Ιδιότητα οντότητας Όνομα γνωρίσματος Περιγραφή Ημερ. Αποστ. ShipDate Ημερομηνία αποστολής παραγγελίας Κόστος SubtotalCost Κόστος ειδών παραγγελίας Έκπτωση Discount Έκπτωση επί τοις εκατό Ποσ. Φόρου SalesTaxPercent Ποσοστό φόρου Συν. Φόρου SalesTax Σύνολο φόρου Μετ. Έξοδα FreightCharge Μεταφορικά έξοδα Αριθμ. Παραγγ. CustomerPO Αριθμός παραγγελίας πελάτη (αν υπάρχει) Όροι Terms Όροι πληρωμής Τιμολόγηση Invoiced Σημαία για το αν τιμολογήθηκε η παραγγελία Διαφάνεια 13 Καταβολή AmountPaid Ποσό που έχει καταβληθεί ως σήμερα Τελ. Πληρ. DatePaid Ημερομηνία τελευταίας πληρωμής Σημειώσεις Notes Ειδικές σημειώσεις για την παραγγελία
Η τελική μορφή του πίνακα ΠΑΡΑΓΓΕΛΙΑ θα έχει ως εξής: Διαφάνεια 14
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Προεπιλεγμένη τιμή" του πεδίου OrderDate θέτουμε την τιμή "=Now()" και στην ιδιότητα Μορφή του ίδιου πεδίου θέτουμε την τιμή Γενική Ημερομηνία. Η προεπιλεγμένη τιμή είναι μια τιμή η οποία μπορεί να τροποποιηθεί από το χρήστη, αν είναι απαραίτητο. Εμφανίζεται ωστόσο χωρίς πληκτρολόγηση και αποθηκεύεται ως έχει αν δεν τροποποιηθεί. Στο παράδειγμα, καλείται η συνάρτηση Now(), (συνάρτηση γνωστή και από το Excel), έτσι ώστε να επιστρέφει την τρέχουσα ημερομηνία και ώρα του συστήματος Διαφάνεια 15
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Οι τιμές των ιδιοτήτων "Απαιτείται" και "Με ευρετήριο" των πεδίων που συνθέτουν το πρωτεύον κλειδί του πίνακα ΠΑΡΑΓΓΕΛΙΑ (δηλ. CustomerID, SalesRepID, OrderDate), παίρνουν τις τιμές αντίστοιχα "Ναι" και "Ναι (Επιτρέπονται διπλότυπα)" Διαφάνεια 16
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Προεπιλεγμένη τιμή" του πεδίου PromisedByDate θέτουμε την τιμή "=Date()", για τους ίδιους λόγους που προαναφέραμε. Στο παράδειγμα, καλείται η συνάρτηση Date(), (συνάρτηση γνωστή και από το Excel), έτσι ώστε να επιστρέφει την τρέχουσα ημερομηνία Στις ιδιότητες του πεδίου, από την αναδιπλούμενη λίστα της μορφής, επιλέγουμε την Πλήρη Ημερομηνία. Αυτό μας επιτρέπει να εισάγουμε μια ημερομηνία ως 19/3/03 και να εμφανίζεται ως Κυριακή, 19 Μαρτίου 2003. Λιγότερη πληκτρολόγηση και μεγαλύτερη σαφήνεια στη παρουσίαση δεδομένων Διαφάνεια 17
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Κανόνας επικύρωσης" των πεδίων ShipAddress1 και ShipAddress2 θέτουμε την τιμή "(Not (Like "*Τ.Θ. *" Or Like "*ΤΘ *")) Or Is Null", έτσι ώστε να αποτρέπουμε τον χρήστη να εισάγει στα συγκεκριμένα πεδία τιμές Ταχυδρομικής Θυρίδας αλλά να του επιτρέπουμε και να αφήνει κενά τα πεδία αυτά Σαν "Κείμενο επικύρωσης" θέτουμε την τιμή στην ιδιότητα αυτή την τιμή "Η διεύθυνση αποστολής δεν μπορεί να είναι Ταχ. Θυρίδα". Το μήνυμα αυτό θα εμφανιστεί στην περίπτωση που ο χρήστης παραβεί τον Κανόνα επικύρωσης που θέσαμε παραπάνω στα συγκεκριμένα πεδία Διαφάνεια 18
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Μάσκα Εισαγωγής" του πεδίου ShipPostalCode θέτουμε την τιμή "000\ 00", έτσι ώστε o χρήστηςναέχειτοδικαίωμανα πληκτρολογεί μόνο αριθμητικά ψηφία και ο ταχυδρομικός κώδικας να εμφανίζεται στη γνωστή μορφή σε εμάς, δηλαδή αυτή που μετά από τα πρώτα τρία ψηφία έχει ένα κενό διάστημα πχ 553 37 Διαφάνεια 19
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Μορφή" του πεδίου SubtotalCost θέτουμε από την αναδιπλούμενη λίστα την τιμή «Ευρώ", έτσι ώστε o χρήστης να πληκτρολογεί μόνο το ποσό οφειλής και να τοποθετείται ο δείκτης του νομίσματος αυτόματα Διαφάνεια 20
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Mορφή" των πεδίων Discount και SalesTaxPercent θέτουμε την τιμή Ποσοστό ενώ στην ιδιότητα "Προεπιλεγμένη Τιμή" θέτουμε την τιμή "0" στο πεδίο Discount και την τιμή "0.08" στο πεδίο SalesTaxPercent. Η προεπιλεγμένη τιμή επαναλαμβάνουμε είναι μια τιμή η οποία μπορεί να τροποποιηθεί από το χρήστη, αν είναι απαραίτητο. Εμφανίζεται ωστόσο χωρίς πληκτρολόγηση και αποθηκεύεται ως έχει αν δεν τροποποιηθεί Διαφάνεια 21
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Mορφή" του πεδίου SalesTax θέτουμε την τιμή Euro ενώ στην ιδιότητα "Προεπιλεγμένη Τιμή" θέτουμε την τιμή "0" Ομοίως και στις αντίστοιχες τιμές των ιδιοτήτων για το πεδίο FreightCharge Διαφάνεια 22
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Προεπιλεγμένη Τιμή" του πεδίου Terms θέτουμε την τιμή "Λήξη 30, 2/15" Διαφάνεια 23
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Για το πεδίο Invoiced στην ιδιότητα "Μορφή" θέτουμε την τιμή ";"Ναι";"Όχι"" για να προβάλει τις τιμές Boolean στη μορφή που εμείς επιθυμούμε. Θα μπορούσαμε σε άλλη περίπτωση να βάλουμε τις τιμές στο ίδιο πεδίο ";"Άνδρας";"Γυναίκα"", αν πρόκειται για την επιλογή φύλου Στην ιδιότητα "Προεπιλεγμένη Τιμή" του ιδίου πεδίου θέτουμε την τιμή "No". Θα μπορούσαμε ομοίως να θέσουμε εδώ την τιμή off με ίδιο αποτέλεσμα (μη επιλογή του checkbox) Διαφάνεια 24
Για τον πίνακα ΠΑΡΑΓΓΕΛΙΑ αξίζει να σημειώσουμε τα εξής: Στην ιδιότητα "Mορφή" του πεδίου AmountPaid θέτουμε την τιμή Ευρώ με "0" Δεκαδικά Ψηφία στην τιμή του αντίστοιχου πεδίου ενώ στην ιδιότητα "Προεπιλεγμένη Τιμή" θέτουμε την τιμή "0" Διαφάνεια 25
Ακολουθούμε τα παρακάτω βήματα Μετακινούμε το δείκτη του ποντικιού στο κουμπί Σχέσεις (ο όροςτηςaccess δεν είναι σωστός από την άποψη της σχεσιακής άλγεβρας) και πιέζουμε το αριστερό πλήκτρο Η ACCESS θα σας ρωτήσει ποιους πίνακες θέλουμε να συσχετίσουμε. Επιλέγουμε και τους τρεις πίνακες και κάνουμε κλικ στη Προσθήκη Διαφάνεια 26
Ακολουθούμε τα παρακάτω βήματα Μπορούμε να αλλάξουμε το μέγεθος εμφάνισης των πινάκων ή τη θέση που αυτοί εμφανίζονται Γιαναξεκινήσουμετη δημιουργία της συσχέτισης, κρατούμε πατημένο το αριστερό πλήκτρο του ποντικιού πάνω στο πεδίο CustomerID του πίνακα ΠΕΛΑΤΗΣ και... Διαφάνεια 27
Ακολουθούμε τα παρακάτω βήματα... σύρουμε το δείκτη του ποντικιού (προσέχουμε την αλλαγή) σχήματος πάνω στο πεδίο CustomerID του πίνακα ΠΑΡΑΓΓΕΛΙΑ Θα εμφανιστεί το πλαίσιο διαλόγου Ιδιότητες Διαφάνεια 28
Ακολουθούμε τα παρακάτω βήματα Κάνουμε κλικ και ενεργοποιούμε την ακεραιότητα αναφορών. Αυτό σημαίνει ότι θα γίνεται έλεγχος στα ξένα κλειδιά, ώστε να μην εισάγονται τιμές που δεν έχουν αντιστοίχιση. Πάντα να επιλέγουμε την ακεραιότητα αναφορών, ανεξάρτητα από τις άλλες δύο επιλογές για τη διαδοχική ενημέρωση εγγραφών, ή διαγραφή εγγραφών Μπορούμε (σε αυτό το παράδειγμα) να ενεργοποιήσουμε τη διαδοχική ενημέρωση εγγραφών (αν αλλάξει το πρωτεύον κλειδί του πίνακα ΠΕΛΑΤΗΣ, αλλάζει αυτόματα και το ξένο κλειδί του πίνακα ΠΑΡΑΓΓΕΛΙΑ) Διαφάνεια 29
Ακολουθούμε τα παρακάτω βήματα Μετά από όλα αυτά πρέπει να έχουμε τη διπλανή εικόνα Διαφάνεια 30
Ακολουθούμε τα παρακάτω βήματα Για τη δημιουργία και της σχέσης ανάμεσα στον πίνακα ΑΝΤΙΠΡΟΣΩΠΟΣ και ΠΑΡΑΓΓΕΛΙΑ ακολουθούμε παρόμοια βήματα Γιαναξεκινήσουμελοιπόντη δημιουργία της συσχέτισης αυτής, κρατούμε πατημένο το αριστερό πλήκτρο του ποντικιού πάνω στο πεδίο SalesRepID του πίνακα ΑΝΤΠΡΟΣΩΠΟΣ και... Διαφάνεια 31
Ακολουθούμε τα παρακάτω βήματα... σύρουμε το δείκτη του ποντικιού (προσέχουμε την αλλαγή) σχήματος πάνω στο πεδίο SalesRepID του πίνακα ΠΑΡΑΓΓΕΛΙΑ Θα εμφανιστεί το πλαίσιο διαλόγου Ιδιότητες Διαφάνεια 32
Ακολουθούμε τα παρακάτω βήματα Κάνουμε κλικ και ενεργοποιούμε την ακεραιότητα αναφορών. Αυτό σημαίνειότιθαγίνεταικαιεδώ έλεγχος στα ξένα κλειδιά, ώστε να μην εισάγονται τιμές που δεν έχουν αντιστοίχιση. Πάντα να επιλέγουμε την ακεραιότητα αναφορών, ανεξάρτητα από τις άλλες δύο επιλογές για τη διαδοχική ενημέρωση εγγραφών, ή διαγραφή εγγραφών Μπορούμε (σε αυτό το παράδειγμα) να ενεργοποιήσουμε τη διαδοχική ενημέρωση εγγραφών (αν αλλάξει το πρωτεύον κλειδί του πίνακα ΑΝΤΙΠΡΟΣΩΠΟΣ, αλλάζει αυτόματα και το ξένο κλειδί του πίνακα ΠΑΡΑΓΓΕΛΙΑ) Διαφάνεια 33
Ακολουθούμε τα παρακάτω βήματα Μετά από όλα αυτά πρέπει να έχουμε τη διπλανή τελική εικόνα για τις συσχετίσεις των πινάκων Διαφάνεια 34
Αυτή είναι η διαδικασία για να δημιουργήσουμε μια συσχέτιση πολλά προς πολλά (many-to-many relationship) στην ACCESS Προσπαθήστε να κάνετε περισσότερα παραδείγματα, μέχρι να μπορείτε να επαναλάβετε τη διαδικασία με "κλειστά μάτια" Στοσημείοαυτόμπορούμεναπροχωρήσουμεστην εισαγωγή εγγραφών στους πίνακες Προσοχή! Πρώτα εισάγουμε εγγραφές στους πίνακες των οντοτήτων και στη συνέχεια στους πίνακες των σχέσεων Διαφάνεια 35