Re: (Αλλαγή δικαιωμάτων αρχείου) Πίνακες «μόνο ανάγνωση» στο LibreOffice Base

Kostas Oikonomou kikonomou at yahoo.gr
Sat Jan 19 08:58:17 UTC 2013


Απο: Pantelis  Koukousoulas <pktoss at gmail.com>

Προς: Kostas Oikonomou <kikonomou at yahoo.gr> 
Κοιν.: Ubuntu Λίστα <ubuntu-gr at lists.ubuntu.com>; "users at el.libreoffice.org" <users at el.libreoffice.org> 
Στάλθηκε: 10:02 μ.μ. Παρασκευή, 18 Ιανουαρίου 2013
Θέμα: Re: (Αλλαγή δικαιωμάτων αρχείου) Πίνακες «μόνο ανάγνωση» στο LibreOffice Base
 
2013/1/18 Kostas Oikonomou <kikonomou at 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 που έχει όπως είπαμε
παραπάνω.

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

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

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

Φίλε Παντελή,

Το παράδοξο στο αρχείο, είναι ότι υπήρχαν πίνακες με πρωτεύοντα κλειδιά που ήταν «Text [VARCHAR]», χωρίς μάλιστα να απαιτείται η αυτόματη εισαγωγή δεδομένων! Πιθανό ο όρος για INTEGER να ισχύει για τον τρίτο ή τέταρτο πίνακα, ή για κάτι άλλο, που δεν μπορώ να σκεφτώ (δεν είμαι πληροφορικός).

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

Τέλος, για να μην έχω πρόβλημα, μετέτρεψα όλα τα πρωτεύοντα κλειδιά σε INTEGER με αυτόματη εισαγωγή δεδομένων, και πρόσθεσα ένα άλλο πεδίο, με τίτλο patient, όπου θα βάζω ένα μοναδικό κωδικό για τον κάθε ασθενή. Στη συνέχεια δοκίμασα να ορίσω σχέσεις μεταξύ των πινάκων, με το πεδίο patient που θα είναι μοναδικό για κάθε ασθενή, χωρίς επιτυχία. Βγαίνει μήνυμα λάθους, στα αγγλικά, που απ' ότι κατάλαβα λέει ότι το πεδίο patient, πρέπει να είναι πρωτεύων κλειδί ή να μην έχει διπλές τιμές στον πίνακα (πχ δυο τιμές με, ας πούμε, 32). Το πεδίο patient είναι
 επί του παρόντος «Text [VARCHAR]». Πως θα ελέγχει η Base ότι δεν υπάρχουν διπλές τιμές, έτσι που να με αφήσει να ορίσω τις σχέσεις; Με την αυτόματη τιμή στο Id, το πρωτεύων κλειδί, δεν μπορώ να το χρησιμοποιήσω για τη δημιουργία σχέσης μεταξύ των πινάκων.

Ελπίζω να μην σας μπέρδεψα πολύ.

Φιλικά

Κώστας Οικονόμου
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/ubuntu-gr/attachments/20130119/5494ca03/attachment.html>


More information about the Ubuntu-gr mailing list