Forum

Forum (https://www.ms-office.gr/forum/)
-   Access - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/)
-   -   Αρίθμηση γραμμών ερωτήματος μετά την ταξινόμησή τους (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/642-arithmisi-grammon-erotimatos-meta-tin-taksinomisi-toys.html)

kapetang 25-06-10 14:36

Αρίθμηση γραμμών ερωτήματος μετά την ταξινόμησή τους
 
Καλησπέρα, σε όλους

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

Ευχαριστώ/Γιώργος

schizo 25-06-10 15:47

1 Συνημμένο(α)
Έφτιαξα κάτι που λύνει εν μέρει το πρόβλημά σου. Έχουμε κάποιους περιορισμούς, όπως το ότι η αρίθμηση θα "χαλάει" αν ο χρήστης προσπαθήσει να κάνει on-the-fly ταξινόμηση στα αποτελέσματα του ερωτήματος. Ένα άλλο ζήτημα είναι ότι αν δεν έχουμε πεδίο που τα περιεχόμενά του να είναι μοναδικά, θα συμβεί ό,τι και στην περίπτωση του "Παύλου" (στο παράδειγμα).
Αν έχουμε πολλαπλές ταξινομήσεις, αυτές μπορούν να προστεθούν στο υποερώτημα.

kapetang 25-06-10 17:43

Δυστυχώς δε μπορώ να ανοίξω το αρχείο *.accdb.
Η access που διαθέτω είναι η 2003 (ελληνική).
Θα με βοηθούσε αν μπορούσες να μου στείλεις το αρχείο σε μορφή *.mdb.
Αν δε γίνεται ίσως θα μπορούσα να βρω στο internet κάποιο πρόσθετο ή viewer.
Ευχαριστώ/Γιώργος

schizo 25-06-10 17:54

1 Συνημμένο(α)
Mea culpa. Έκδοση mdb
Σίγουρα δε θέλεις να χρησιμοποιήσεις VBA;

kapetang 25-06-10 23:25

Είδα το παράδειγμα και το πάθημα! του Παύλου. Η λύση, όπως φαίνεται, απαιτεί το τελευταίο πεδίο, ως προς το οποίο γίνεται η ταξινόμηση, να έχει μοναδικές τιμές.
Πίστευα ότι η access θα είχε στα ερωτήματα κάποιο εύκολο τρόπο αρίθμησης των γραμμών τους μετά την ταξινόμησή τους.
Φαίνεται ότι δεν υπάρχει.
Συνεπώς κάθε λύση, ακόμα και με κώδικα VBA, είναι ευπρόσδεκτη
Καληνύχτα/Γιώργος

editolis 26-06-10 01:25

ACC: Adding Dynamic Counter to Query to Count Records

nisgia 26-06-10 02:24

Φίλε Γιώργο, η Access είναι μια εφαρμογή βάσεων δεδομένων.
Ένας από τους κυριότερους κανόνες βάσεων δεδομένων είναι αυτός που λέει πως σε μια εγγραφή
δεν πρέπει να εμφανίζονται δεδομένα άσχετα με την εγγραφή.

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

Είναι λοιπόν ανώφελο να "καίγεσαι" και να "βαραίνεις" την εφαρμογή σου με τέτοιου είδους τρικ.

Αντιθέτως, τέτοιες ευκολίες είναι διαθέσιμες στην παρουσίαση των δεδομένων στις εκθέσεις.
Για την αύξουσα αρίθμηση, σε ένα μη δεσμευμένο πεδίο κειμένου, στην καρτέλα Δεδομένα
δίνεις ως Προέλευση στοιχείου ελέγχου το =1 και θέτεις την ιδιότητα Τρέχον άθροισμα
σε μια διαφορετική τιμή του Όχι.

Με την ίδια ιδιότητα μπορείς να δημιουργήσεις και το τρέχον άθροισμα για ένα αριθμητικό πεδίο.

Επίσης, η Access προσανατολίζεται στην εγγραφή και όχι σε περιοχές δεδομένων
με συνέπεια να κάνει πολύ δύσκολη την επεξεργασία δεδομένων μεταξύ "κελιών".
Για απεριόριστες δυνατότητες σε επεξεργασία περιοχών δεδομένων υπάρχει το Excel.

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

Φιλικά, Γιάννης.

kapetang 26-06-10 14:31

Καλησπέρα

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

Γιάννη σ΄ευχαριστώ για το ξεκαθάρισμα του ρόλου της access και τις πολύτιμες συμβουλές.
Πάντως, αν έβαζε λίγο νερό στο κρασί της η microsoft και διευκόλυνε, στα ερωτήματα, τη δημιουργία αρίθμησης, έχω τη γνώμη ότι θα βοηθούσε στην επίλυση προβλήμάτων της ακόλουθης μορφής:
Καταγράφονται οι ενδείξεις ενός μετρητή νερού και στη συνέχεια καταχωρούνται στον πίνακα "ΚατανάλωσηΝερού", με πεδία: Ημερομηνία (πρωτεύον κλειδί) και ΣυνολικήΚατανάλωση (η συνολική κατανάλωση νερού μέχρι την ημερομηνία μέτρησης).
Εδώ ισχύει ο κανόνας: Η ΣυνολικήΚατανάλωση αυξάνει (ορθότερα δε μειώνεται) με την Ημερομηνία.
Στην καταχώρηση έγιναν λάθη με αποτέλεσμα ο παραπάνω κανόνας να παραβιάζεται.
Πώς θα διαπιστωθούν οι λανθασμένες εγγραφές;
Σκέφτομαι την ακόλουθη λύση:
1. Ένα ερώτημα θα ταξινομεί τις εγγραφές κατά ημερομηνία, θα τις αριθμεί και στη συνέχεια θα τις αποθηκεύει στον πίνακα "ΤαξινόμησηΚατάΗμερομην α" με πεδία: Αρίθμηση, Ημερομηνία, ΣυνολικήΚατανάλωση.
2. Ένα παρόμοιο θα τις ταξινομεί κατά ΣυνολικήΚατανάλωση και θα τις αποθηκεύει στον πίνακα "ΤαξινόμησηΚατάΣυνολικήΚα ανάλωση".
3. Με ένα ερώτημα στο οποίο θα ενώνονταν οι βοηθητικοί πίνακες με το πεδίο τους "Αρίθμηση", θα μπορούσε να ελεγχθεί η σχέση:[ΤαξινόμησηΚατάΗμερομηνία]![ΣυνολικήΚατανάλωση]<> [ΤαξινόμησηΚατάΣυνολικήΚατ ανάλωση]![ΣυνολικήΚατανάλωση] και να προσδιοριστούν οι λανθασμένες εγγραφές.
Συγνώμην για τη φλυαρία και το κόλλημα.
Ίσως ο εγκέφαλος να ακολούθησε περίπλοκη διαδρομή.
Πάντως οποιαδήποτε άλλη λύση είναι ευπρόσδεκτη.
Φιλικά/Γιώργος

Tasos 26-06-10 17:19

Γιώργο καλησπέρα!
Για τα προβλήματα αυτά αγαπητέ μου η Microsoft μας παρέχει την Εφαρμογή Excel.

Όλα αυτά που περιγράφεις που δύσκολα εφαρμόζονται στην Access, αποτελούν μια απλή ρουτίνα στην Excel!

Γενικά και εδώ ισχύει: πρέπει να επιλέγουμε το κατάλληλο "εργαλείο" για κάθε δουλειά.


Φιλικά

Τάσος

kapetang 26-06-10 19:19

1 Συνημμένο(α)
Τάσο, Καλησπέρα

Η απάντησή μου στον Τόλη και Γιάννη κόπηκε πιθανόν επειδή ξεπερνούσε κάποιο μήκος.
Τάσο να με συγχωρείς για το κόλλημα.
Αναφέρομαι σε μία αρκετά πολύπλοκη βάση δεδομένων από την οποία απομόνωσα το πρόβλημα, που περιγράφω στη προηγούμενη απάντηση.
Δε νομίζω ότι η οργάνωσή της θα μπορούσε να γίνει με το excel.
Επισυνάπτω μιά λύση εύρεσης των εγγραφών που παραβιάζουν τον κανόνα: η ΣυνολικήΚατανάλωση αυξάνει (ορθότερα δε μειώνεται) με την Ημερομηνία καταγραφής της ένδειξης του μετρητή του νερού.
Χρησιμοποιεί την αρίθμηση των γραμμών.
Πάντως μπορεί να υπάρχει ευκολότερη λύση. Είναι ευπρόσδεκτη.

Φιλικά/Γιώργος

Tasos 26-06-10 23:06

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

Κώδικας:

Private Sub cmdCheckErrors_Click()
    On Error Resume Next
    Dim strSQL As String

    strSQL = "SELECT ΚατανάλωσηΝερού.Ημερομηνία, ΚατανάλωσηΝερού.ΣυνολικήΚατανάλωση INTO "
    strSQL = strSQL & "ΤαξινόμησηΚατάΗμερομηνία FROM ΚατανάλωσηΝερού ORDER BY ΚατανάλωσηΝερού.Ημερομηνία"
    CurrentDb.Execute strSQL

    strSQL = "SELECT ΚατανάλωσηΝερού.Ημερομηνία, ΚατανάλωσηΝερού.ΣυνολικήΚατανάλωση INTO "
    strSQL = strSQL & "ΤαξινόμησηΚατάΣυνολικήΚατανάλωση FROM ΚατανάλωσηΝερού ORDER BY "
    strSQL = strSQL & "ΚατανάλωσηΝερού.ΣυνολικήΚατανάλωση"
    CurrentDb.Execute strSQL

    strSQL = "SELECT ΤαξινόμησηΚατάΗμερομηνία.Ημερομηνία, ΤαξινόμησηΚατάΗμερομηνία.ΣυνολικήΚατανάλωση"
    strSQL = strSQL & " INTO tblResults FROM ΤαξινόμησηΚατάΗμερομηνία INNER JOIN "
    strSQL = strSQL & "ΤαξινόμησηΚατάΣυνολικήΚατανάλωση ON ΤαξινόμησηΚατάΗμερομηνία.Αρίθμηση = "
    strSQL = strSQL & "ΤαξινόμησηΚατάΣυνολικήΚατανάλωση.Αρίθμηση WHERE (((ΤαξινόμησηΚατάΗμερομηνία."
    strSQL = strSQL & "[ΣυνολικήΚατανάλωση)<>ΤαξινόμησηΚατάΣυνολικήΚατανάλωση]![ΣυνολικήΚατανάλωση]))"
    CurrentDb.Execute strSQL
    DoCmd.OpenTable "tblResults"
    DoCmd.DeleteObject acTable, "ΤαξινόμησηΚατάΗμερομηνία"
    DoCmd.DeleteObject acTable, "ΤαξινόμησηΚατάΣυνολικήΚατανάλωση"

End Sub


Καλή συνέχεια!

Τάσος

nisgia 27-06-10 03:37

Φίλε Γιώργο, η Microsoft δεν ορίζει τους κανόνες των σχεσιακών βάσεων δεδομένων
αλλά μέσω των εφαρμογών της φροντίζει να τους τους εφαρμόζει.
Το ίδιο οφείλουμε να κάνουμε και εμείς (ως προγραμματιστές εφαρμογών βάσεων δεδομένων).

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

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

Αυτή η επικύρωση θα πρέπει να γίνεται κατά την καταχώρηση της μέτρησης.

Νομίζω πως η πιο σίγουρη λύση της περίπτωσή σου είναι η διόρθωση του πίνακα μετρήσεων
με βάση τα πραγματικά δελτία μετρήσεων (αν υπάρχουν).

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

Φιλικά, Γιάννης.

kapetang 27-06-10 21:11

1 Συνημμένο(α)
Τάσο και Γιάννη, γεια σας

Ευχαριστώ για την ενασχόληση και τη βοήθειά ασς.
Στο χρόνο που μεσολάβησε έψαξα το θέμα της αρίθμησης των γραμμών των ερωτημάτων (στον ιστό) και βρήκα ότι στο πρότυπο 1999 της SQL περιλαμβάνεται ή συνάρτηση ROW_NUMBER(), που κάνει αυτή τη δουλειά.
Στον SQL server 2005 περιλαμβάνεται, αλλά μήπως έχει υλοποιηθεί και στις νέες εκδόσεις της access;
Το αστείο είναι ότι ενώ νόμιζα ότι η αρίθμηση θα μου λύση το πρόβλημα, διαπίστωσα ότι η λύση που έδωσα έχει αδυναμίες (δεν ανιχνεύει όλες τις περιπτώσεις).
Τελικά σκέφτηκα μία άλλη λύση που χρησιμοποιεί υποερωτήματα και τις συγκεντρωτικές συναρτήσεις min() και max().
Είναι πολύ απλή, μάλον όμως αργή αν υπάρχουν πολλές εγγραφές.
Για ενημέρωση επισυνάπτω την αναβαθμισμένη βάση δεδομένων.
Συμφωνώ ότι ο περιορισμός έπρεπε να υλοποιηθεί πριν από την καταχώρηση των στοιχείων. Δεν έγινε. Πάντως με τη νέα υλοποίηση οι ύποπτες εγγραφές θα εντοπιστούν είτε το λάθος είναι στην ημερομηνία είτε στην κατανάλωση και θα διορθωθούν (υπάρχουν στοιχεία). Φυσικά οι νέες καταχωρήσεις δεν αποθηκεύονται αν παραβιάζουν τον περιορισμό.
Φιλικά/Γιώργος

Tasos 28-06-10 10:49

1 Συνημμένο(α)
Γιώργο καλημέρα!
Δεδομένου του ότι ο έλεγχος τυχόν λαθών πρέπει να γίνει με Access θα σου πρότεινα μια λίγο διαφορετική λύση (βλ.συνημμένο παράδειγμα) με κώδικα VBA όπου μπορεί να προσαρμοστεί πολύ εύκολα αν χρειαστεί.
Ακόμα σου επιτρέπει να επισημάνεις (οπτικά) τα λάθη αλλά και να τα διορθώσεις με τον πιο απλό τρόπο.
Στη φόρμα του συνημμένου αρχείου, πατάς το κουμπί "Εντοπισμός λαθών".
Μπορείς να διορθώσεις τα λάθη που εχουν σημανθει με με κόκκινο και να ξαναπατήσεις
το κουμπί "Εντοπισμός λαθών" για να εκτελέσεις νέο έλεγχο.

Ελπίζω να κατανόησα το πρόβλημα σου!

Φιλικά

Τάσος

kapetang 28-06-10 14:44

Τάσο, Καλησπέρα

Να με συγχωρείς για την ταλαιπωρία.
Τη λύση που προτείνεις τη βρίσκω πολύ καλή και θα προσπαθήσω να την ακολουθήσω.
Χρειάζεται κάποια βελτίωση γιατί δεν εντοπίζει όλες τις ύποπτες εγγραφές.
Συγκεκριμένα οι εγγραφές που παραβιάζουν τον κανόνα (τον διατυπώνω ισοδύναμα αλλά λίγο διαφορετικά ): η ΣυνολικήΚατανάλωση σε κάθε εγγραφή είναι μεγαλύτερη ή ίση από όλες τις ΣυνολικέςΚαταναλώσεις με μικρότερη Ημερομηνία και μικρότερη ή ίση από όλες τις ΣυνολικέςΚαταναλώσεις με μεταγενέστερη Ημερομηνία, είναι 6.
Εκτός της πρώτης όλες οι άλλες είναι ύποπτες (πχ η δεύτερη ΣυνολικήΚατανάλωση=20>18=Συν λικήΚατανάλωση τρίτης).
Διευκρινίζοντας, αν διορθώσουμε μία, οι ύποπτες θα μειωθούν τουλάχιστον κατά μία. Δηλαδή κατά κανόνα οι διορθώσεις θα είναι λιγότερες από τον αριθμό των ύποπτων εγγραφών.

Φιλικά/Γιώργος

Tasos 28-06-10 15:44

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

Το συνημμένο που ανέβασα αποτελεί ένα παράδειγμα και τίποτα παραπάνω.

Όπως προανέφερα, ο κώδικας VBA μπορεί να προσαρμοστεί πολύ εύκολα αν χρειαστεί.

Αρκει να τροποποιήσεις/προσθέσεις τα κριτήρια επικύρωσης ανάμεσα στις γραμμές:
.Edit
και
.Update


πχ.:
Κώδικας:

'.......
 .Edit
DateErr =  Έκφραση1
CounterErr =  Έκφραση2
LastDate = DateField
LastCounter = CounterField
.Update
'........

Τάσος


Η ώρα είναι 20:44.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2