![]() |
Καλημέρα στην παρέα Γιάννη είδα το θαυμάσιο κώδικά σου. Νομίζω όμως ότι το πεδίο Fields(0) περιλαμβάνεται στο ερώτημα δύο φορές με παρενέργειες και στο αποτέλεσμα, όταν παραλείπεται το Pattern. Φιλικά/ Γιώργος |
Καλησπέρα Γιώργο και σ' ευχαριστώ για τα καλά σου λόγια! :happy: Με τις χρήσιμες (όπως πάντα) παρατηρήσεις σου, το "τραγούδι", μου βγήκε λίγο ...HEAVY METAL :metalo: όμως ο "στοίχος" του, νομίζω πως έγινε πολύ πιο στιβαρός από τον πρωινό. Ελπίζω να το απολαύσεις...:003: Κώδικας: Function GetFlexQueryEx(TableName As String, _όταν δεν υπάρχει πεδίο με όνομα που να ταιριάζει στο υπόδειγμα (Pattern).:unsure: Νομίζω όμως πως δεν είναι και τόσο σημαντικό μιας και πρόκειται για διαγραφή ερωτήματος και όχι πραγματικών δεδομένων. Φιλικά, Γιάννης |
Καλησπέρα κι από μένα! Επιτρέψτε μου να κάνω μια παρέμβαση που έχει καθαρά τεχνικό χαρακτήρα. 1) Γιατί να χρησιμοποιείται η μέθοδος OpenRecordset για να ανοίξει πίνακα που μπορεί να περιέχει περισσότερα MB δεδομένων (μη παραγωγικό) όταν από τον δεύτερο ζητάμε μόνο τα ονόματα των πεδίων του; Νομίζω ότι το WizHook είναι πιο αποδοτικό. 2) Νομίζω ότι είναι καλύτερα αντί για: Κώδικας: ...Set flds = CurrentDb.TableDefs(TableName).OpenRecordset.Fields...Κώδικας: With CurrentDb.TableDefs(TableName).OpenRecordsetΦιλικά Τάσος |
Καλησπέρα στην παρέα Γιάννη και βέβαια χάρηκα το νέο κώδικα. Είναι πολύ πιο στιβαρός χωρίς να χάνει την αρμονία του. Μια σκέψη, επειδή η συνάρτηση (ανάλογα με τα ορίσματα) δίνει διάφορα αποτελέσματα, αν ο τύπος της ήταν variant, ίσως να μπορούσαμε να χειριστούμε ευκολότερα τις διάφορες περιπτώσεις. Φιλικά/Γιώργος |
Καλησπέρα ξανά στην παρέα Μόλις διάβασα και τις τεχνικές επισημάνσεις του Τάσου. Το πρόβλημα αναφέρεται στη δομή (σχήμα) της βάσης δεδομένων. Γιατί δε χρησιμοποιούνται τα αντικείμενα της βιβλιοθήκης ADOX που έχει δημιουργηθεί για το σκοπό αυτό; Φιλικά/Γιώργος |
Καλησπέρα! Τάσο μου, όσον αφορά την πρώτη παρατήρηση, έχεις εν μέρει δίκιο αλλά το ότι δεν ανοίγουμε εμείς ρητά το Recordset αυτό δεν σημαίνει πως δεν το κάνει και η μέθοδος του WizHook. Αλλά ακόμη κι αν δεν το κάνει, για ποιον λόγο να δώσουμε τον έλεγχο σε μια μη τεκμηριωμένη βιβλιοθήκη και να χρησιμοποιούμε πίνακες από Variants παιδεύοντας τη VBA με τη διαστασιολόγησή τους, όταν μπορούμε να πάρουμε μια μόνο από τις, πιθανώς εκατομμύρια, εγγραφές του πίνακα; Μήπως τελικά είναι πιο απλό και πιο αποδοτικό αν πούμε απλά και μόνο... Κώδικας: Set flds = CurrentDb.OpenRecordset("Select Top 1 * From " & TableName).FieldsΌσο για την δεύτερη, αν και η VBA είναι μια πολύ ελαστική και βολική γλώσσα στο θέμα της δημιουργίας και καταστροφής αντικειμένων, ...έχεις απόλυτο δίκιο. :blushing: Είναι καλό να κλείνουμε και να καταστρέφουμε ρητά τα αντικείμενα που δημιουργούμε όμως αυτή η γλώσσα μας έχει κακομάθει λίγο...:001_rolleyes: Γιώργο, η επιστρεφόμενη τιμή της συνάρτησης καθορίζεται από την εντολή: Κώδικας: Set GetFlexQueryEx = rsΤι ακριβώς εννοείς όμως με το "διάφορα αποτελέσματα" και το "διάφορες περιπτώσεις" και πως φαντάζεσαι πως θα μπορούσαμε να τις χειριστούμε; |
Γιάννη recordset επιστρέφεται μόνο όταν υπάρχει ο πίνακας και τα πεδία του ταιριάζουν με το μοτίβο (pattern). Σε κάθε μία από τις άλλες περιπτώσεις (δεν υπάρχει πίνακας, υπάρχει αλλά δεν έχει ταιριαστά πεδία, βρέθηκε ή όχι το ερώτημα) θα μπορούσε να αντιστοιχιστεί μια άλλη τιμή στη συνάρτηση που θα μας έδινε πληροφορίες και πιθανόν να βοηθούσε και στη διαμόρφωση του κώδικα. |
Καλησπέρα σε όλους!!!! Χαίρομαι που η άγνοιά μου επέφερε μια τοσο σημαντική ανταλαγή απόψεων!!! Εγώ :wall: δεν μπορώ σας παρακολουθήσω! Μπορώ όμως να σας... δυσκολέψω :011:: -Εφτιαξα το flexy ερώτημα με το κώδικα του Τάσου... -Καθόρισα μια σχέση: το ερωτημα με τον πίνακα -Εφτιαξα μια φόρμα: στο πάνω μέρος κάποια πεδία του πίνακα, στο κάτω μέρος τα πεδία του ερωτήματος (μια εγγραφή κάθε φορά) Εδω είναι το πρόβλημα: Οταν αλλάξουν τα πεδία με το νέο τρέξιμο του ερωτήματος, η φόρμα περιμένει τα παλιά πεδία! Υπάρχει δυνατότητα και για auto update της φόρμας ??? ΥΓ: Πραγματικά σας συγχαίρω για την επιμονή σας :handshake: |
Καλησπέρα Γιαννη! Θα σου πρότεινα να κάνεις τα εξής:
Κώδικας: Function Create_Query(TableName As String, QueryName As String, SearchLetters As String)
Κώδικας: Private Sub cmdRefresh_Click()Τάσος |
Παράθεση:
Θέλεις να επιστρέφει τον τύπο του σφάλματος, εξαιτίας του οποίου δεν δημιουργήθηκε το RecordSet. Επειδή όμως οι Variants για τον nisgia είναι ό,τι και για τον διάολο το λιβάνι, θα προτιμούσα αυτή η τιμή να περνάει σε ένα ακόμη όρισμα τύπου Long, περασμένο δια αναφοράς (ByRef) το οποίο θα έπαιρνε την τιμή του Err στο σημείο σφάλματος. Εκεί δηλαδή που τώρα είναι τα μηνύματα ενημέρωσης σφάλματος. Έτσι η διαδικασία που καλεί τη συνάρτηση, θα έχει την ευκαιρία να εξετάσει τον αριθμό σφάλματος όταν η τιμή της συνάρτησης ισούται με Nothing. Ελπίζω να με καταλαβαίνεις... Φίλε Γιάννη, αν μας δώσεις να καταλάβουμε τι προσπαθείς να κάνεις, είμαι σίγουρος πως θα μπορέσουμε να σε βοηθήσουμε να βρεις μια πιο κανονικοποιημένη λύση για το επιχείρημά σου. Είναι φως φανάρι πως πρόκειται για θέμα κακού σχεδιασμού. Καλό ξημέρωμα! Γιάννης |
| Η ώρα είναι 20:08. |
Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.