Date: prev next · Thread: first prev next last


2013/1/18 Kostas Oikonomou <kikonomou@yahoo.gr>:
Είναι απαραίτητο, στο ID, να προσθέτει το πρόγραμμα κάτι από μόνο του;

Αν μιλήσουμε με όρους θεωρίας σχεσιακών βάσεων δεδομένων τότε σίγουρα όχι,
το μόνο που είναι απαραίτητο είναι να μην υπάρχουν 2 αράδες (rows) με την
ίδια τιμή στο πεδίο που παίζει το ρόλο του πρωτεύοντος κλειδιού (και συνήθως
ονομάζεται ID - υποθέτω ότι όταν λες "ID" εννοείς "πρωτεύον κλειδί").

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

Το κατά πόσο το "autoincrement" / αυτόματη αύξηση είναι υποχρεωτικό ή όχι
βέβαια να πω την αλήθεια δεν το δοκίμασα ιδιαίτερα οπότε αν θέλεις μπορείς
να δοκιμάσεις εσύ να αφαιρέσεις την ιδιότητα "αυτόματη αύξηση' και να δεις
αν το ID παραμένει πρωτεύον κλειδί ή όχι.

Εν ολίγοις είναι πρόβλημα της Base και γνωστό, απλά δεν έχει βρεθεί ακόμα
τρόπος για να φτιαχτεί (εθελοντικά ή με αμοιβή). Μέχρι να φτιαχτεί, σίγουρα
είσαι αναγκασμένος να συμβιβαστείς με το να είναι το πεδίο "INTEGER"
και πιθανότατα με το να είναι και autoincrement.

Η διαδικασία που ακολουθώ έχει ως εξής. Ανοίγω την πρώτη φόρμα και καταχωρώ
τα δεδομένα μου, καταχωρώντας και τον κωδικό του ασθενούς, σαν πρωτεύων
κλειδί. Αφού τελειώσω από αυτή τη φόρμα, που συνήθως καταγράφει τα δεδομένα
σε ένα πίνακα, πριν πάω σε κάποια άλλη φόρμα που καταγράφει δεδομένα σε ένα
άλλο πίνακα, ανοίγω πρώτα τον πίνακα, από τους πίνακες, προσθέτω τον κωδικό
του ασθενούς-πρωτεύων κλειδί, στο δεύτερο πίνακα. Στη συνέχεια βγαίνω από
τον πίνακα και ανοίγω την καινούργια φόρμα, που παίρνει και καταγράφει
δεδομένα σε αυτόν, και προσθέτω τα δεδομένα μου, στην εγγραφή εκείνη που θα
έχει σαν πρωτεύων κλειδί-κωδικός του ασθενούς που όρισα. Αυτή η αυτόματη
εισαγωγή αύξοντος αριθμού σαν πρωτεύων κλειδί, με μπερδεύει. Μπορεί στον ένα
πίνακα ο «α» ασθενείς να έχει πρωτεύων κλειδί «5» και στον άλλο πίνακα, ο
ίδιος ασθενής να έχει πρωτεύων κλειδί «3».

Όχι αυτό δε θα έπρεπε να συμβαίνει. Βασικά πολύ απλά στη φόρμα που
αντιστοιχεί στον πίνακα στον οποίο το πρωτεύον κλειδί είναι το ID του
ασθενούς δε χρειάζεται να υπάρχει καν πεδίο "ID".

Αν τώρα θες να καταχωρήσεις το ID ενός ασθενή σε μια άλλη φόρμα
(στον πίνακα που αντιστοιχεί η οποία το ID του ασθενή *δεν* είναι
το πρωτεύον κλειδί, π.χ., "Ακτινογραφίες" με πρωτεύον κλειδί
IDακτινογραφίας) τότε πας πρώτα στον πίνακα "Ασθενείς"
και βρίσκεις το ID του ασθενούς που ψάχνεις και μετά το καταχωρείς
στη φόρμα "Ακτινογραφίες".

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

Και μια δεύτερη απορία. Που έκανα λάθος όταν σχεδίασα το αρχείο; Η ερώτηση
αποσκοπεί στο να αποφύγω το «δις εξ' αμαρτείν».

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

Στη δική σου περίπτωση είχες 2 πίνακες που δεν είχαν πρωτεύον κλειδί.
Σε αυτούς μάλιστα το πεδίο "ID" δεν είχε τύπο INTEGER αλλά string (VARCHAR)
αν θυμάμαι καλά. Οπότε ακόμα και αν τα είχες ορίσει ως πρωτεύοντα κλειδιά
η Base δεν το είχε δεχτεί αυτό λόγω του γνωστού bug που έχει όπως είπαμε
παραπάνω.

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

Κανένα πρόβλημα :)

Χαιρετισμούς,
Παντελής

-- 
Unsubscribe instructions: E-mail to users+help@el.libreoffice.org
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/el/users/
All messages sent to this list will be publicly archived and cannot be deleted

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.