Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#11
| |||
| |||
Καλησπέρα Γιώργο Αυτά που λές είναι σωστά είναι ένας τρόπος και αυτός. Εγώ θέλω να αποφύγω τις πολλές καταχωρήσεις. Ένα αν βρώ τέλειωσα. Το έχω λύσει το θέμα αρκετά καλά, κοίτα στο συνημμένο omoia_5. Θα προσπαθήσω να σου αναλύσω τι ακριβώς έψαχνα, αν υπάρχει, αλλά δεν το βρήκα. Το θέμα αφορά τη μεταβατική ιδιότητα δηλαδή αν α=β , β=γ τότε α=β=γ άμεσες σχέσεις α=β , β=γ και αντιμεταθέτωντας β=α, γ=β έμμεσες σχέσεις α=γ Θα σου πω τι ακριβώς ψάχνω έστω και σε παράδειγμα θα το προσαρμόσω. Έχουμε τον πίνακα με δύο γραμμές και δύο στήλες η col2 είναι πολλαπλών τιμών col1 colb2 row1 α (α,β) row2 β (β,γ,δ) row3 γ (γ,β) που μας δίνει τις άμεσες σχέσεις και μας λέει το row1 το α είναι ίσο με τον εαυτό του και το β δηλ σύνολο ίσων του (α,β) row2 το β είναι ίσο με τον εαυτό του και τα γ,δ δηλ σύνολο ίσων του (β,γ,δ) ...... Εγώ θέλω έναν τρόπο (κώδικα) ώστε όταν στην col2 υπάρχει κοινό στοιχείο (εδώ το β) να συμπληρώνεται η ως εξής: col1 col2 col3 row1 α (α,β) - (α,β,β,γ,γ,β) row2 β (β,γ) (β,γ,δ,α,β,γ,β) row3 γ (γ,β) (γ,β,α,β,β,γ) ενώνει δηλαδή στην col3 τα πεδία της col2 όσων έχουν κοινό στοιχείο μετά στην col4 διώχνω τα διπλότυπα της col3 και έχω col1 col2 col3 col4 row1 α (α,β) (α,β,β,γ,γ,β) (α,β,γ) row2 β (β,γ,δ) (β,γ,δ,α,β,γ,β) (α,β,γ) row3 γ (γ,β) (γ,β,α,β,β,γ) (α,β,γ) μετά διώχνω και τον εαυτό του και έχω την col5 που είναι το ζητούμενο col1 col2 col3 col4 col5 row1 α (α,β) (α,β,β,γ,γ,β) (α,β,γ) (β,γ) row2 β (β,γ,δ) (β,γ,δ,α,β (α,β,γ) (α,γ) row3 γ (γ,β) (γ,β,α,β,β,γ) (α,β,γ) (α,β) Κοίτα το παράδειγμα που σου επισυνάπτω κάνε προσθήκες και διαγραφές Η φόρμα που κάνεις προσθήκες και διαγραφές παρουσιάζει μόνο τις άμεσες σχέσεις. Στον πίνακα όμοια κάνω διπλές καταχωρήσεις-διαγραφές (κακώς οι δεύτερες προκύπτουν από ερώτημα) δηλ α=β και β=α. Το έκανα από την αρχή και μετά το άφησα. Ελπίζω να έγινα κατανοητός. Με εκτίμηση Δημήτρης |
#12
| |||
| |||
Δημήτρη, Καλημέρα Παρακάτω εκφράζω κάποιες σκέψεις για τη μαθηματική προσέγγιση του θέματος. Με βάση τις ιδιότητες τις ομοιότητας (ανακλαστική α~α, αντιμεταθετική α~β => β~α, μεταβατική α~β, β~γ =>α~γ και α~γ, β~γ => α~β) καταλήγουμε στο εξής: Αν τα σύνολα Α και Β απαρτίζονται από όμοια στοιχεία και έχουν κοινό στοιχείο (η τομή τους δεν είναι το κενό σύνολο) τότε τα στοιχεία της ένωσης των συνόλων θα είναι όμοια. Υποθέτουμε ότι ο πίνακας στον οποίο θέλουμε να προσδιορίσουμε τα όμοια έχει n γραμμές και μία στήλη του περιέχει την τιμή Α(i) που είναι ένα σύνολο όμοιων στοιχείων. Συνοπτικά για να προσδιορίσουμε όλα τα όμοια θα μπορούσαμε να εφαρμόσουμε τον ακόλουθο αλγόριθμο: Κώδικας: 1. Για i=1 έως n-1 Για j=i+1 έως n Αν Α(i) τομή A(j) μη κενό σύνολο Θέσε Α(i)= Α(i) ένωση Α(j) και Α(j)= με το νέο Α(i) 3. Αφαίρεση από τα σύνολα Α(i) του ανακλαστικού (ταυτοτικού) στοιχείου. Το πλήθος των επαναλήψεων στους δύο βρόχους ισούται με τους συνδυασμούς των n ανά 2 και αυξάνει ραγδαία. Κατά προσέγγιση είναι n^2/2 (για 100 εγγραφές είναι 5.000 και για 1000 500.000) Αν συνυπολογίσουμε τις επαναλήψεις που προκαλούν τα βήματα 2 και 3 και τις επαναλήψεις που απαιτούνται για να εξακριβώσουμε αν η τομή των συνόλων είναι κενή έχω τη γνώμη ότι θα καταλήξουμε σε μία εφαρμογή χωρίς προοπτικές (μόλις υπερβούμε κάποιο πλήθος εγγραφών θα αρχίσει να σέρνεται). Σημειώνω τέλος ότι πιστεύω με μια σωστή σχεδίαση της βάσης σου θα απέφευγες όλους τους παραπάνω υπολογισμούς χωρίς να αυξηθεί ο χρόνος πληκτρολόγησης. Φυσικά εσύ ξέρεις τις απαιτήσεις της βάσης και εσύ αποφασίζεις. Φιλικά/Γιώργος |
#13
| |||
| |||
Καλημέρα σε όλους Κάποτε στο πανεπιστήμιο ένας φοιτητής ρώτησε έναν καθηγητή κάτι απλό, εκείνος του απάντησε μα είναι προφανές. Ο φοιτητής τον ρώτησε γιατί είναι προφανές. Ο καθγητής σάστισε και αφού πήγε το γραφείο του ασχολήθηκε για ώρες γύρισε και απάντησε, τελικά ήταν όντως προφανές. Στο θέμα μας πάθαμε το ίδιο περίπου δεν είδαμε το προφανές και εξηγώ αν έχω ένα πίκακα tbl με πεδία Α και Β και έχω παράδειγμα στήλες Α-Β α-β γ-β σε ερώτημα με tbl και tbl_1 σύνδεση στο Πεδίο Β και Α.tbl, Α.tbl_1 as B θα πάρω A-B α-γ άρα παίρνω με ερώτημα q_0 και συμμετρικά δηλ Α-Β α-β γ-β β-α β-γ άρα για να τα πάρω όλα α) Δημιουργώ ερώτημα q_1 με q_0 και q_0_1 σύνδεση στο Πεδίο Β και Α.q_0, Α.q_0_1 as B β) Δημιουργώ ερώτημα q_all με q_0 union all με q_1 γ) Παίρνω μοναδικά ζεύγη Τόσο απλό!! Στο συνημμένο έχω παράδειγμα για το τι ακριβώς εννοώ Όσο για το σχεδιασμό μια από τις βασικές αρχές είναι δεν καταχωρούμε ποτέ δεδομένα που μπορούμε να ανακτήσουμε με ερωτήματα. Φιλικά Δημήτρης |
#14
| |||
| |||
Καλησπέρα Φίλε Δημήτρη, αν ψάξεις τα μηνύματά μου στο φόρουμ θα δεις ότι σε πάρα πολλά προτρέπω τα μέλη να μη έχουν ίδια πεδία σε πολλούς πίνακες (πληκτρολογούν πολλές φορές τα ίδια στοιχεία) και να μη αποθηκεύουν τιμές που μπορούν να υπολογιστούν. Συμφωνώ συνεπώς απόλυτα με τη φράση σου «Όσο για το σχεδιασμό μια από τις βασικές αρχές είναι δεν καταχωρούμε ποτέ δεδομένα που μπορούμε να ανακτήσουμε με ερωτήματα» και τη θεωρώ πλεονασμό. Για να ξεκαθαρίσω κάπως τις θέσεις μου, για το θέμα της ομοιότητας που έθεσες: 1) Θα πρέπει να σχεδιάζουμε τις βάσεις δεδομένων ώστε η ομοιότητα να υλοποιείται με μία μόνο ιδιότητα την: α~χ και β~χ και γ~χ => α, β, γ όμοια. Τέτοια παραδείγματα έδωσα στις ΒΔ που ανέβασα στα προηγούμενα μηνύματά μου:
Στη θέση τους αν πληκτρολογούσαμε άλλα εφαρμόζοντας την ιδιότητα που περιγράφω στην παράγραφο 1, χωρίς επιπλέον πληκτρολογήσεις, θα είχαμε απαλλαγεί από τα ερωτήματα και τον κώδικα. 3) Τα παραπάνω εφαρμόζονται στις νέες ΒΔ που σχεδιάζουμε. Τι θα γίνει με μία υπάρχουσα στη οποία για να βρούμε τα «όμοια» θα πρέπει να εφαρμόσουμε όλες τις ιδιότητες της ομοιότητας; Θα πρέπει να ψάξουμε ('οπως κάνεις) για να βρούμε λύση. Το πρόβλημα αυτό το θεωρώ δύσκολο και στη γενική του μορφή άλυτο (απαιτεί άπειρο χρόνο για να λυθεί). Χαίρομαι που λες ότι βρήκες λύση, αλλά έχω ενδοιασμούς για την πληρότητά της. Στον πίνακα t_ΟΜΟΙΑ έχω προσθέσει την εγγραφή 113-25. Αν ανοίξουμε το ερώτημα q_ΣΥΝΟΛΟ_ΟΜΟΙΩΝ στο 7 δεν υπάρχουν όλα τα όμοια του 25 που είναι όμοιο του 113 (μεταβατική ιδιότητα). Δυσκολεύτηκα να κατανοήσω το κείμενό σου, επειδή, σε αντίθεση με όσα ισχύουν στην access, πρώτα αναγράφεται το πεδίο και μετά το όνομα του πίνακα ή του ερωτήματος. 4) Επειδή το θέμα έχει πάρει ειδικό χαρακτήρα και εκτός από μας δεν ασχολείται κανένας άλλος, αν θέλεις να το συνεχίσουμε στείλε προσωπικό μήνυμα. Φιλικά/Γιώργος |
#15
| |||
| |||
Καλημέρα Φίλε Δημήτρη, αν και έχω πολλά χρόνια να ασχοληθώ, με επιφύλαξη, ανεβάζω αρχείο που με vba κάνει αναζήτηση ομοίων εγγράφων έως 10000 δες κώδικα ορισμός πινάκων, για να τρέξει θα πρέπει να διορθώσεις την διαδρομή .."ο κώδικας στο πλαίσιο same της 1ης φόρμας , τα λέμε Θανάσης |
#16
| |||
| |||
Καλημέρα Φίλε Γιώργο έχεις δίκιο για το omoia_6 δεν είναι σωστό, απ' ότι φαίνεται δεν υπάρχει απλή λύση. Μόνο με Multi Value Fields είναι σίγουρο. Φίλε Θανάση ευχαριστώ που ασχολήθηκες θα το μελετήσω. Φιλικά Δημήτρης |
#17
| |||
| |||
Καλημέρα Το ξαναστέλνω με μικρή διόρθωση, ο τρόπος υπολογισμού γίνεται ως εξής 1ον αριθμητική ταξινόμιση στην 1η στήλη 2ο με βάση την στήλη αυτή βγαίνουν οι ομάδες με τους ίδιους αριθμούς 3ο με βάση τα δύο αριθμούς του εγγράφου εντοπίζονται σε ποιες ομάδες βρίσκονται 4ο εν συνεχεία βγαίνουν οι μοναδικοί αριθμοί 5ο ξανά οι μοναδικοί αριθμοί εντοπίζονται σε ποιες ομάδες είναι από την προηγούμενη σάρωση και 6ο από τις νέες ομάδες βγαίνουν οι οριστικοί αριθμοί. θανάσης |
#18
| |||
| |||
Καλημέρα Το ξαναστέλνω διορθωμένο, η εγγραφή αναζήτησης να μην περιλαμβάνετε στη λίστα Θανάσης |
#19
| |||
| |||
Καλησπέρα Θανάση πολύ καλό δουλευει μια χαρά. Το είχα διορθώσει αυτό με το τρέχον. Διόρθωσα και την παύλα στο τέλος. Const strSeparator = " - " Dim lngLen As Long x = x & neo(i) & strSeparator και στο τέλος πριν από το Me.Same = x lngLen = Len(x) - Len(strSeparator) If lngLen > 0 Then x = Left(x, lngLen) End If Οι φόρμες δεν χρειάζονται καν σύνδεση. Είναι και γρήγορο γιατί ψάχνει το τρέχον κάθε φορά, με ένα πεδίο στον πίκανα t_AITHMATA γράφεις το νούμερο που βρήκες και η αναζήτηση γίνεται σε ένα ερώτημα και με δεξί κλικ στη κύρια φόρμα βλέπεις όλα τα όμοια. Δεν χρειάζεται καν ο πίνακας t_ΟΜΟΙΑ. Τελικά για όλα υπάρχουν λύσεις. Ευχαριστώπολύ για το χρόνο σου. Με εκτίμηση Δημήτρης |
#20
| |||
| |||
Δημήτρη, με την σειρά μου σ'ευχαριστώ,(όντως ασχολήθηκα αρκετό χρόνο,γιατί προσπάθησα να βρω την λύση με αλγόριθμο οπισθοδρόμησης αλλά μάτην. Καλή συνέχεια. Θανάσης |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Η ώρα είναι 20:46.