Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#21
| |||
| |||
Γιώργο (mistirios), Είδα την επισήμανσή σου και... στενοχωρήθηκα. Ξανακοίταξα λοιπόν τον κώδικά μου, και βεβαιώθηκα ότι αλγοριθμικά είναι σωστός. Το πρόβλημα που αναφέρεις οφείλεται στο ότι το άθροισμα των ποσοστών του πίνακα από τον οποίο παίρνω τα ονόματα δεν κάνει 100%. Ανεβάζω λοιπόν ξανά τη λύση που είχα δώσει, με πίνακα που τα ποσοστά εμφάνισης των ονομάτων αθροίζονται στο 100%, ελαφρώς βελτιωμένη και με αρκετά χαρακτηριστικά (που έφτιαξα για να ελέγξω την ορθότητα του αποτελέσματος). Θα δεις τώρα ότι σε μεγάλα δείγματα (π.χ. 1000), τα ονόματα αναπαράγονται με σωστές συχνότητες. Μάλλον είναι λοιπόν ώρα να εξηγήσω το πως δουλεύει η κατανομή. Έχουμε και λέμε: Σε κάθε όνομα αντιστοιχεί ένα ποσοστό εμφάνισης στον πληθυσμό, δηλαδή ένας πραγματικός αριθμός από το 0 μέχρι το 1 (π.χ. ποσοστό 0,12 = 12%). Ο κώδικας λοιπόν: 1) επιλέγει τυχαία μια εγγραφή 2) παράγει έναν τυχαίο αριθμό από το 0 μέχρι το 1 -με την rnd- (π.χ. τυχαίος αριθμός 0,05) 3) συγκρίνει το ποσοστό εμφάνισης της επιλεγμένης εγγραφής με τον τυχαίο αριθμό και... 4) αν το ποσοστό αυτό είναι μεγαλύτερο από τον τυχαίο αριθμό, τότε προσθέτει την εγγραφή, αλλιώς ξαναπάει στο βήμα 1 Η διαδικασία επαναλαμβάνεται μέχρι να συγκεντρωθρί ο απαιτούμενος αριθμός εγγραφών. Το παραπάνω (πιστεύω) βγάζει σωστά αποτελέσματα εξ' αιτίας του βήματος 3. Όσο δηλαδή πιο μεγάλο είναι ένα ποσοστό, τόσο περισσότερες πιθανότητες έχει να είναι μεγαλύτερο από έναν τυχαίο αριθμό, άρα και να προστεθεί στο νέο πίνακα. Γιώργο (kapetang), Το σκεπτικό σου για την κατανομή, νομίζω πως είναι ολόσωστο. Όπως είπες όμως κι εσύ, χρειάζεται να δημιουργήσει, έστω και προσωρινά, μια τεράστια λίστα για να επιλέξει εγγραφές μέσα από αυτή. Επίσης, έχεις δίκιο για τη λίστα με τα ονόματα. Παρατήρησα κι εγώ τις διπλοεγγραφές. Είδα ακόμα κάποια μικρολαθάκια (π.χ. κάποια ονόματα όπως το "Άδωνις" δεν είχαν τόνο, 1-2 είχαν καταχωρηθεί σε λάθος φύλο κλπ). Την ανεβάζω ξανά με τις διορθώσεις (μπορεί βέβαια να έχει και άλλα λάθη). Όπως και να 'χει πάντως, η λίστα είναι εξαιρετική. Γιώργο (mistirios), -υποθέτω και εκ μέρους πολλών άλλων- ευχαριστούμε. ΥΓ. Όταν προσπαθώ να δημιουργήσω πίνακα ονομάτων με πάρα πολλές εγγραφές (π.χ. 10.000), το progress bar που έχω φτιάξει, μπορεί να κολλήσει (στο repaint που κάνει). Έχει κανείς καμμιά ιδέα γιατί συμβαίνει αυτό, αν και πώς μπορώ να το αποφύγω; |
#22
| ||||
| ||||
Καλησπέρα στη παρέα! Φίλε Γιώργο (mistirios), ο σκοπός σου μου φαίνεται πολύ καλός και όπως βλέπεις έχεις δίπλα σου αρκετούς φίλους με διάθεση για βοήθεια. Προσωπικά σε θαυμάζω για το κουράγιο σου στη συλλογή των δεδομένων και ειδικά για την χειροκίνητη εισαγωγή του φύλου ονομάτων. Να ξέρεις πάντως πως τα κριτήρια LIKE "!ιίς" και NOT LIKE "!ιίς" για τους άνδρες και τις γυναίκες αντίστοιχα, δουλεύουν τέλεια εκτός της περίπτωσης των ανδρικών ονομάτων που καταλήγουν σε "ιίς". (σπάνιες πιστεύω περιπτώσεις... ) Στο θέμα των συχνοτήτων τώρα... Το δικό μου σκεπτικό από την αρχή ήταν πολύ κοντά στο σκεπτικό του Γιώργου (kapetang) όμως εκείνο που με φόβιζε δεν ήταν ο τεράστιος κέρσορας των απαιτούμενων εγγραφών αλλά οι πολλές επαναλήψεις (Loops) διότι απαιτείται ξεχωριστή επεξεργασία για το κάθε διαθέσιμο όνομα του επιλεγμένου φύλου. Φυσικά στο απλοϊκό παράδειγμα που επισυνάπτω χρησιμοποιώ πολύ λίγα ονόματα (8 και μόνο ανδρικά) αλλά αναρωτιέμαι πως θα τα πάει με 800+ ή τα 1710; (1695 για την ακρίβεια διότι τα 15 είναι διπλά ) Η τεχνική που ακολούθησα χρησιμοποιεί έναν βοηθητικό πίνακα με 100.000 ...μηδενικά! Από αυτόν "τραβάω" n εγγραφές και μέσω εξωτερικής ένωσης, με ένα ερώτημα επιλογής που τρέχει μια φορά για κάθε όνομα ξεχωριστά, επιλέγω το κάθε όνομα για n φορές. Τέλος, επιλέγω με έναν όρο TOP PERCENT από το παραπάνω αποτέλεσμα τον αριθμό των εγγραφών που προκύπτει από τη σχέση n*(συχνότητα ονόματος) και τις προσαρτώ σε έναν πίνακα ονόματι tblSamble. Όπου n ο συνολικός αριθμός του τελικού δείγματος. Παράδειγμα: Δείγμα με 1000 ονόματα. Αν για παράδειγμα το όνομα Γιώργος έχει συχνότητα 20% επιλέγουμε το "Γιώργος" 1000 φορές και από αυτές επιλέγουμε το 20% (200) και τις προσαρτούμε στον πίνακα δείγματος συνεχίζοντας την ίδια διαδικασία με όλα τα διαθέσιμα ονόματα ξεχωριστά. Αυτά με τη θεωρία. Τα υπόλοιπα στο συνημμένο αρχείο. OffTopic: @kapetang Να' σαι καλά φίλε Γιώργο! Η ευχαρίστηση δική μου! Όσο για τις ημερομηνίες, καλύτερα να τις αντιμετωπίζουμε ως έχουν: Ως σειριακούς αριθμούς. Όταν ξεφεύγεις απ' την επαναληπτικότητα του ημερολογίου, όχι μόνο οι συναρτήσεις, αλλά ακόμη και η ίδια σου η κοσμοθεωρία βελτιώνεται! @schizo Φίλε Μάριε, μην στενοχωριέσαι ποτέ με τις παρατηρήσεις. Ακόμη και οι άδικες, αν δεν είναι κακόβουλες, σου βγαίνουν πάντα σε καλό. Να 'στε όλοι καλά και σας ευχαριστώ που επιμένετε να "καίγεστε" στο ms-office.gr καλοκαιριάτικα! Γιάννης Υ.Γ. Όσον αφορά τις ημερομηνίες, θα ήθελα να πως πως σε κάποιο κομμάτι της "SelectRandomNames" του "RandomNames2" φάνηκα και εγώ αρκετά φλύαρος με τις παρακάτω εκφρασεις: Κώδικας: ... lngLDate = DateSerial(Year(Date) - intUAge, Month(Date), Day(Date)) lngUDate = DateSerial(Year(Date) - intLAge, Month(Date), Day(Date)) ... η πολύ χρήσιμη συνάρτηση DateAdd(). Με την DateAdd() λοιπόν, οι παραπάνω εκφράσεις γίνονται: Κώδικας: ... lngLDate = DateAdd("yyyy",-intUAge,Date) lngUDate = DateAdd("yyyy",-intLAge,Date) ...
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! Τελευταία επεξεργασία από το χρήστη nisgia : 08-07-10 στις 22:14. |
#23
| |||
| |||
Καλημέρα στην παρέα Για τη λύση του φίλου Μάριου, που κοίταξα, σημειώνω τα εξής: 1. Το πρόβλημα σε μεγάλες τιμές του δείγματος οφείλεται στη δήλωση κάποιων μεταβλητών. Οι i και intAsked να δηλωθούν Long και αντί της Cint() να χρησιμοποιηθεί η Clng(). 2. Ο αλγόριθμος μου φαίνεται λογικός, αλλά όταν ζήτησα δείγμα 50.000 ονομάτων, έβγαλε περίεργα αποτελέσματα. Πάντως την ιδέα τη βρίσκω πολύ έξυπνη, ίσως ομως έχει κάποιο πρόβλημα που δε γίνεται εύκολα αντιληπτό. 3. Η ταχύτητα μάλλον θα μπορούσε να βελτιωθεί , αν αντί της συνάρτησης DlookUP() , χρησιμοποιούνταν ένα RecordSet, μιας εγγραφής, με κριτήριο [onomaID] = randRecord. Φιλικά/Γιώργος |
#24
| |||
| |||
Φίλε Μάριε δεν γνωρίζω τι λάθος έκανα σε μια δοκιμή με δείγμα 50000 ονόματα και βγήκε ένα δείγμα με 50.000 Γιώργους (συνονόματους). Επειδή μου φάνηκε παράλογο το ξανακοίταξα και είδα ότι τα αποτελέσματα είναι φυσιολογικά. Γιώργος |
#25
| |||
| |||
Γιώργο (kapetang), Πράγματι, αν θέλουμε πολλές εγγραφές καλό είναι να αλλάξουμε τον τύπο των μεταβλητών σε long. Αυτό που με προβληματίζει όμως, είναι πως συνέβη και σε εμένα να γεμίσει ένας πίνακας με Γιώργηδες. Μειώνοντας δραστικά τον επιθυμητό αριθμό εγγραφών συνέχισε να εμφανίζει μόνο το όνομα Γιώργος. Έκανα compact & repair και δεν ξαναεμφανίστηκε. Θεώρησα τότε πως ενδεχομένως να είναι κάποιο εσωτερικό "μπέρδεμα" με τους πίνακες και δεν ασχολήθηκα. Εφ' όσον όμως συνέβη και σε εσένα, ενδεχομένως να έχω κάνει κάποιο λάθος, οπότε θα προσπαθήσω να το αναπαράγω. Υπάρχει βέβαια και η περίπτωση να ήταν όντως "μπέρδεμα" που είχε δημιουργήθεί ήδη στο αρχείο που ανέβασα. Αν είναι έτσι, το να δημιουργήσει και στους δυο μας προβλήματα είναι αναμενόμενο. off topic ΥΓ. Επειδή τα γραπτά μπορεί καμιά φορά να παρερμηνεύονται κατά λάθος, όταν είπα πιο πάνω ότι στενοχωρήθηκα, δεν εννοούσα την παρατήρηση, αλλά ότι είχα χαρεί πολύ όταν σκέφτηκα τον αλγόριθμο, και το να βρεθεί λάθος, μου έκοψε αυτή τη χαρά (αυτό ήταν όλο κι όλο). Ίσα ίσα, με τιμά που κάποιος κάθησε και ασχολήθηκε με την προσπάθειά μου. Τελευταία επεξεργασία από το χρήστη schizo : 09-07-10 στις 16:10. |
#26
| |||
| |||
Γουάου, το θέμα έχει πάρει φωτιά! Φίλε schizo χαίρομαι που επανήλθες με εξηγήσεις και νέα αντιμετώπιση και μου άρεσε πολύ και το εφέ που πρόσθεσες! (η μπάρα). Θέλω να μου πείτε για τις διπλοεγγραφές τι είδους ήταν γιατί ένα ερώτημα που έτρεξα δεν βρήκε. Επίσης μέσα στον κατάλογο υπάρχουν παραλλαγές του ίδιου ονόματος επίτηδες (γιάννης, γιαννακός π.χ). Στα ορθογραφικά πάσο. Να ξέρετε επίσης ότι έχω και άλλους πίνακες με πολλά στοιχεία οπότε ετοιμαστείτε!
__________________ My opinions may have changed but not the fact that i am right... |
#27
| ||||
| ||||
Καλησπέρα στα κομάντα του ms-office! Μάριε, ασχολήθηκα λίγο με την εφαρμογή σου και θα συμφωνήσω με τους Γιώργους ότι η ιδέα σου αξίζει συγχαρητήρια! Την πιο μεγάλη ευθύνη στο θέμα της ταχύτητας πάντως, τη φέρει η έκφραση: Κώδικας: ... If pithanotita >= Rnd Then ... Το μεγαλύτερο ποσοστό του πίνακα ονομάτων είναι αυτό του Γιώργου(0,1221). Όμως η Rnd() επιστρέφει μια τιμή μεταξύ 0 και 1. Φανταστείτε λοιπόν πόσες "λούπες" πάνε χαμένες..! (Δοκίμασα την προσθήκη 10000 ονομάτων και ...μ' έστειλε για τσιγάρο!) Η λύση σε αυτό είναι να αναγκαστεί η Rnd() κάθε φορά να επιστρέφει μια τιμή μεταξύ 0 και 0,1221. Αν έχετε ακόμη όρεξη, αντικαταστήστε την cmdAppendNames_Click() με αυτή: Κώδικας: Private Sub cmdAppendNames_Click() Dim i As Long Dim lngAsked As Long Dim strSQL As String Dim sngMaxFreq As Single i = 0 lngAsked = CLng(Me.txtNamesCount) If lngAsked Then With CurrentDb.TableDefs("tblNames").OpenRecordset(4) If .RecordCount Then DoCmd.Hourglass True SysCmd acSysCmdInitMeter, "Append names...", lngAsked .MoveLast mintCount = .RecordCount .FindFirst ("[pososto] < 1") sngMaxFreq = !pososto strSQL = "INSERT INTO tblRandomOnomata (onoma) SELECT """ Do While i < lngAsked Randomize .FindFirst ("[onomaID] = " & Int((mintCount * Rnd) + 1)) If !pososto >= (Rnd * sngMaxFreq) Then CurrentDb.Execute strSQL & !onoma & """ AS onoma;" i = i + 1 SysCmd acSysCmdUpdateMeter, i End If Loop End If DoCmd.Hourglass False SysCmd acSysCmdRemoveMeter End With End If End Sub αλλά έχω την εντύπωση πως βελτιώθηκε και λίγο η απόκλιση. Οφείλω όμως να σου ζητήσω συγγνώμη Μάριε που αφαίρεσα την progress bar. Το αισθητικό αποτέλεσμα ήταν τέλειο αλλά η progress bar της Access είναι ταχύτερη και στην ταχύτητα πονάει λίγο η διαδικασία. (Εδώ που τα λέμε θα μπορούσε να βελτιωθεί πολύ και διαδικασία ενημέρωσης αλλά...) OffTopic: Επίσης, να σου ζητήσω συγγνώμη που σε παρεξήγησα πριν αλλά όπως είπες και εσύ για όλα φταίει ο γραπτός λόγος που στερείται ύφους. Γιαυτό όμως τα έχουμε τα σκασμένα τα emoticons! Βάλτε και κανένα και μην φοβάστε, δεν σας τα χρεώνουμε. Παράθεση:
Δε μασάμε εμείς...!
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
#28
| ||||
| ||||
Εύρεση διπλοεγγραφών Παράθεση:
Κώδικας: SELECT fldName, Count(fldName) AS CountOffldName FROM tblNames GROUP BY fldName HAVING (((Count(fldName)))>1); Και μια σχετική και πολύ χρήσιμη (όπως αρχικά φαίνεται) σελίδα: Ελληνικά Ονόματα Ελλήνων και Ελληνίδων, Στατιστική Συχνότητα Πάντως Γιώργο, από αριθμό ονομάτων ...του ρίχνεις στα αυτιά του foundali..!
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
#29
| |||
| |||
Καλημέρα στην παρέα Προκειμένου να δοκιμαστούν τα προγράμματα που δημιούργησε η παρέα, σε πραγματικές συνθήκες, χρησιμοποίησα ένα πίνακα 1693 διαφορετικών ονομάτων. Οι συχνότητες (πιθανότητες) των ονομάτων είναι τυχαίες και έχουν άθροισμα 1 (100%). 1. Το RandomNamesMarios2.mdb είναι το πρόγραμμα που δημιούργησε ο Μάριος. Λειτουργεί κανονικά, αλλά είναι αργό. 2. Το RandomNamesMarios3.mdb (επισυνάπτεται) είναι το πρόγραμμα του Μάριου, όπως τροποποιήθηκε από το Γιάννη. Έχει βελτιωθεί στην ταχύτητα και λειτουργεί κανονικά. 3. Το NameFrequency.mdb (δεν επισυνάπτεται) είναι το πρόγραμμα του Γιάννη. Είναι ταχύτατο αλλά σε πραγματικές συνθήκες εμφανίζει λάθος χρόνου εκτέλεσης. Επίσης και με τον πίνακα των περιορισμένων ονομάτων αν ζητήσουμε μικρό δείγμα, πχ 12 εγγραφών θα δημιουργήσει δείγμα των 17 εγγραφών. Στα παραπάνω προγράμματα οι αλγόριθμοι είναι πρωτότυποι, ευφυείς και λογικοί, αλλά δημιουργούν και κάποιες υπόνοιες για την ορθότητά τους. 4. Στο RandomNamesGorge.mdb (επισυνάπτεται) , προκειμένου να γίνει σύγκριση με τα προηγούμενα, χρησιμοποιώ μια κλασική μέθοδο δειγματοληψίας. Δημιουργείται μια κληρωτίδα ονομάτων, στην οποία η αναλογία κάθε ονόματος (πλήθος εμφάνισης προς συνολικό πλήθος) ισούται με την πιθανότητα του ονόματος και ακολούθως λαμβάνεται τυχαία το δείγμα. Χρησιμοποιεί μια τροποποίηση του περιβάλλοντος χρήστη και του μαγικού (σφαιράτου) κώδικα του Γιάννη. Φαίνεται να λειτουργεί καλά, αλλά χρειάζεται να δοκιμαστεί. Συμπέρασμα: Στο ζόρικο πρόβλημα που έβαλε ο Γιώργος (mistirios); έγινε σημαντική δουλειά, αλλά, κατά τη γνώμη μου, δεν παρουσιάστηκε ακόμα η άριστη λύση. Φιλικά/Γιώργος |
#30
| |||
| |||
Παράθεση:
|
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
Δημιουργία, αρχείων με αύξοντα αριθμό πρωτοκόλλου. | Spirosgr | Word samples - Χρήσιμα αρχεία & παραδείγματα | 0 | 21-09-15 20:55 |
[Συναρτήσεις] πως βρίσκουμε από συγκεκριμένο πίνακα αριθμό ή γράμμα που απουσιάζει | geronik | Excel - Ερωτήσεις / Απαντήσεις | 11 | 01-12-14 20:36 |
[ Ασφάλεια] Κλείδωμα μετά από συγκεκριμένο αριθμό χρήσεων | parara | Access - Ερωτήσεις / Απαντήσεις | 0 | 31-12-12 13:06 |
[Γενικά] Εμφάνιση δεδομένων των στηλών που περιέχουν συγκεκριμένο αριθμό στην τελευταία γραμμή | Lefteris | Excel - Ερωτήσεις / Απαντήσεις | 20 | 23-10-12 18:44 |
[ Πίνακες ] Διόρθωση εγγραφών σε συγκεκριμένο πεδίο | marpapa | Access - Ερωτήσεις / Απαντήσεις | 10 | 15-05-12 20:58 |
Η ώρα είναι 06:00.