Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
Σύγκριση σύνθετου πλαισίου και λίστας
Έχω ένα σύνθετο πλαίσιο το οποίο εμφανίζει τιμές από το πεδίο Επώνυμο του πίνακα ΕΡΓΑΖΟΜΕΝΟΣ. Το ίδιο και η λίστα. Θέλω να βάλω κώδικα στο after update του σύνθετου πλαισίου, το οποίο θα συγκρίνει τις τιμές της λίστας και αν μία συμπίπτει με την τιμή που επιλέχθηκε στο σύνθετο πλαίσιο θα αφαιρείται από την λίστα(δηλαδή θέλω το επώνυμο που επιλέγω από το σύνθετο πλαίσιο, να αφαιρείται από την λίστα με αυτόν ακριβώς τον τρόπο). Δοκίμασα το παρακάτω αλλά δεν δουλεύει Dim lnI As Integer For lnI = 0 To listbox_name.ListCount - 1 If listbox_name.ListIndex(lnI) = combobox_name.Value Then listbox_name.RemoveItem (lnI) End If Next lnI |
#2
| ||||
| ||||
Καλησπέρα σε όλους! Φίλε Παντελή καλωσόρισες στο φόρουμ! Για να χρησιμοποιήσεις τις μεθόδους RemoveItem και AddItem, θα χρειαστεί να ορίσεις την ιδιότητα του ListBox "RowsourceType" (Τύπος προέλευσης γραμμής) στην τιμή "Λίστα τιμών". Κατόπιν, θα πρέπει να δημιουργήσεις μια ρουτίνα με τη μέθοδο AddItem που θα γεμίσει τη λίστα με τα δεδομένα που σ ενδιαφέρουν. Μόνο έτσι θα μπορέσεις να αφαιρέσεις δεδομένα με τη μέθοδο RemoveItem Κάπως έτσι για παράδειγμα: Κώδικας: Option Compare Database Option Explicit Private Sub Form_Load() Dim strSQL$, xField As DAO.Field strSQL = "SELECT [Table1].[Field1] FROM [Table1] WHERE Not [Table1]." _ & "[Field1] Is Null ORDER BY [Table1].[Field1]" With CurrentDb.OpenRecordset(strSQL) If .RecordCount > 0 Then Set xField = .Fields("Field1") .MoveFirst Do Me.list1.AddItem xField .MoveNext Loop While Not .EOF End If .Close End With End Sub Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#3
| ||||
| ||||
Καλησπέρα Παντελή! Αν τα στοιχεία ενός πλαισίου λίστας (Listbox) ή σύνθετου πλαισίου (ComboBox) προέρχονται από έναν πίνακα ή ερώτημα, δεν μπορείς να διαγράψεις στοιχεία από τη λίστα τους. Θα πρέπει η προέλευσή τους να είναι τύπου "Λίστα τιμών" (Value List). Αν θέλεις να διαγράφεται η εγγραφή από τον πίνακα προέλευσης, χρειάζεσαι άλλη τεχνική. Αν χρειαστείς βοήθεια, εδώ είμαστε... Καλωσόρισες στο φόρουμ! Γιάννης Υ.Γ. Τάσο, με έφαγες στη στροφή!!! Τάσος: Αν ήξερα ότι θα απαντούσες, απλά θα καλωσόριζα τον Παντελή!
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! Τελευταία επεξεργασία από το χρήστη Tasos : 18-02-10 στις 20:23. |
#4
| ||||
| ||||
Και αφού ο Τάσος μας έλυσε με περίτεχνο τρόπο το πρόβλημα του τύπου προέλευσης φίλε Παντελή, προχωράς στη διαγραφή των στοιχείων με τον παρακάτω τρόπο: Μετά τη πρόταση "End With" στη διαδικασία "Form_Load", προσθέτεις το Κώδικας: Me.MyCombo.RowSource = Me.List1.RowSource Κώδικας: Private Sub MyCombo_AfterUpdate() With Me.MyCombo Me.List1.RemoveItem (.ListIndex) .RowSource = Me.List1.RowSource .Value = Null End With End Sub και έτσι είμαστε σίγουροι ότι διαγράφεται το σωστό στοιχείο από τη λίστα του ListBox και όχι το πρώτο ταίριασμα.
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
#5
| ||||
| ||||
Παράθεση:
Όσο μιλάς εσύ, εμείς μαθαίνουμε...! Για παράδειγμα, αν δεν έδινες την παραπάνω λύση για το γέμισμα της λίστας δεν θα έμπαινα στον κόπο να τη ψάξω για λύση χωρίς τη χρήση βρόχου. Δες τι εννοώ: Κώδικας: Dim rs As New ADODB.Recordset With rs .Open "SELECT Field1 FROM Table1 WHERE Not Table1." _ & "Field1 Is Null ORDER BY Field1", CurrentProject.Connection If Not (.EOF And .BOF) Then Me.List1.RowSource = Replace(.GetString, Chr(13), ";") End If .Close End With Set rs = Nothing Και για περιπτώσεις με πολλές στήλες, αναβαθμίζουμε την έκφραση Replace(.GetString, Chr(13), ";") ως εξής: Κώδικας: Replace(Replace(.GetString, Chr(13), ";"), Chr(9), ";")
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! Τελευταία επεξεργασία από το χρήστη nisgia : 18-02-10 στις 22:48. |
#6
| |||
| |||
Καλησπέρα, Μια λύση ακόμα ως συμπλήρωμα σε όλα αυτά που προαναφέρθηκαν είναι στον πίνακα πχ Table1 να προστεθεί ένα ακόμα πεδίο το VisibleΙnListBox ως Boolean. Τι θα κάνει αυτό είναι να εμφανίζει ή όχι την τιμή στο ListBox. Δηλαδή με το φόρτωμα της φόρμας θα γεμίζει το ListBox μόνο με τις τιμές που το πεδίο VisibleInListBox θα είναι True. Για διαγραφή από την λίστα απλά ένα άλλο SQL Ερώτημα Update θα αλλάζει την τιμή στο πεδίο VisibleInListBox σε False με Where φυσικά το ID της λίστας για να αλλάζει συγκεκριμένη τιμή. Δηλαδή στο ListBox η νέα λίστα τιμών του ListBox θα διατηρείται και μετά το κλείσιμο και το άνοιγμα της φόρμας. ΠΡΟΣΟΧΗ Αυτό που θα πρέπει να προσέξεις είναι πως το RowSourceType θα είναι Table/Query και το RowSource θα είναι φυσικά το SQL Ερώτημα πχ "Select * From Table1 Where VisibleInListBox=True" Για να ξαναγεμίσει η βάση θα πρέπει να κάνεις απλά ένα "UPDATE Table1 Set VisibleInListBox=true" Όλα τα προαναφερόμενα γίνονται με παράδειγμα φυσικά. Αν θέλεις φίλε Παντελή αποστέλνεις την βάση και εφαρμόζουμε και αυτό τον τρόπο. |
#7
| |||
| |||
Πολύ καλημέρα σε όλους! Πραγματικά έχω μείνει άφωνος απόο την ανταπόκριση και την αμεσότητα απάντησης στο μήνυμά μου. Μπράβο σε όλους όσους στηρίζουν αυτό το forum. Θα δοκιμάσω αυτά που μου προτείνατε και θα έχετε νεότερά μου το συντομότερο δυνατό. Σας ευχαριστώ όλους! |
#8
| |||
| |||
Στην περίπτωση που θέλω να επιλέγω για παράδειγμα όλες τις τιμές από το πεδίο field1 για τις οποίες το field2 (το οποίο το έχω δηλώσει στον πίνακα ως σύνθδετο πλαίσιο να παίρνει δύο τιμές, τις οποίες τις όρισα στον πίνακα) παίρνει την τιμή "TWO" θα πρέπει να βάλω: strSQL = "SELECT [Table1].[Field1] FROM [Table1] WHERE Not [Table1]." _ & "[Field1] Is Null & "[Field2] = "TWO" ORDER BY [Table1].[Field1]" ? Με αυτή τη λογική (ότι για την λίστα πρέπει να συμπεριλάβω και άλλο πεδίο), δεν θα μπορώ να χρησιμοποιήσω τον κώδικα Me.MyCombo.RowSource = Me.List1.RowSource γιατί τα rowsource του σύνθετου πλαισίου και της λίστας πρέπει να είναι διαφορετικά. Θα επηρεάσει αυτό, τη σύγκριση των τιμών? |
#9
| ||||
| ||||
Καλημέρα Παντελή, Πες μας, περίγραψε μας τι θέλεις να κάνεις δηλ. ποιος είναι ο στόχος σου σχετικά με τη διαδικασία σύγκρισης, χωρίς να λάβεις υπ΄οψη σου τις προσεγγίσεις που έχεις επιλέξει ή αυτές που ήδη έχουμε αναφέρει. Αν γνωρίζουμε τι συμβαίνει στο παρασκήνιο, ίσως να μπορούσαμε να προτείνουμε κάτι διαφορετικό πιο αποδοτικό. Με εκτίμηση Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#10
| |||
| |||
Λοιπόν, Φανταστείτε ότι έχω μία εταιρία, η οποία έχει 40 πόστα εργασίας και ότι έχω 80 εργαζόμενους για παράδειγμα. Θέλω μία φόρμα μέσω της οποίας θα συμπληρώνω κάθε μέρα τα πόστα της εταιρίας. Οι υπόλοιποι εργαζόμενοι θα φεύγουν από την εταιρία και θα επιστρέφουν την επόμενη μέρα, αλλά αυτοί που θα φεύγουν χωρίζονται σε δύο ομάδες: Μία ομάδα επιφυλακής και μία κανονική. Το σε ποια ομάδα ανήκει ο καθένας το ορίζω από ένα πεδίο του πίνακα Εργαζόμενος το οποίο ονομάζεται Κατάσταση_Επιφυλακής και το έχω ορίσει από τον πίνακα ως σύνθετο πλαίσιο με λίστα τιμών: Επιφυλακή;Κανονική. Επίσης, δεν μπορούν όλοι οι εργαζόμενοι να είναι σε όλα τα πόστα, γιατί υπάρχουν μερικά πόστα που είναι μόνο για μερικούς. Έτσι στον πίνακα Εργαζόμενος έχω βάλει για αυτά τα πόστα (που είναι μόνο για μερικούς), τα πόστα ως checkbox. Έτσι, όταν καταχωρείς έναν εργαζόμενο μπορείς να επιλέξεις με ένα τικ, αν μπορει΄να ασχοληθεί με κάποιο από τα συγκεκριμένα πόστα. Έχω φτιάξει μία φόρμα λοιπόν με ετικέτες για το κάθε πόστο. Δίπλα σε κάθε ετικέτα είναι ένα σύνθετο πλαίσιο από το οποίο επιλέγει κάποιος ένα Επώνυμο από την λίστα των εργαζομένων. Υπάρχουν και δύο λίστες. Η μία λίστα είναι για αυτούς που θα βγουν έξω αλλά θα έιναι σε επιφυλακή και η άλλη για τους άλλους που δεν είναι σε επιφυλακή. Σε κάθε σύνθετο πλαίσιο έχω βάλει κώδικα στο rowsource του στυλ: SELECT Εργαζόμενος.Επώνυμο FROM Εργαζόμενος WHERE (((Εργαζόμενος.Επώνυμο) Not In (nz([Forms]![όνομα_φόρμας]![σύνθετο_πλαίσιο1]),nz([Forms]![ΥΠ_ΚΑΘ]![σύνθετο_πλαίσιο2]), κτλ Το ίδιο γίνεται και με το rowsource των δύο λιστών. Απλά στην μία λίστα προσθέτω τον κώδικα WHERE Εργαζόμενος.Κατάσταση_Επιφ υλακής = Επιφυλακή και στην άλλη το ίδιο αλλά αντί για Επιφυλακή βάζω το Κανονική Αν το πόσο είναι ένα από τα συγκεκριμένα(μόνο για μερικούς) τότε συμπληρώνω στο τέλος με ένα WHERE Εργαζόμενος.πόστο1 is TRUE. Τέλος, σε όλα τα σύνθετα πλαίσια στο after update κάνω requery όλα τα σύνθετα πλαίσια και τις λίστες. Με αυτή την οργάνωση, στην αρχή της φόρμας έχω όλους τους εργαζόμενους σε αυτές τις λίστες - ανάλογα με το αν είναι σε επιφυλακή ή όχι. Όταν αρχίζω να επιλέγω Επώνυμα στα σύνθετα πλαίσια, τότε αυτά τα επώνυμα φεύγουν από την λίστα στην οποία ανήκουν αλλά και από τα υπόλοιπα σύνθετα πλαίσια. Έτσι, αποφεύγεται ο κίνδυνος επιλογής ενός εργαζομένου σε δύο πόστα αλλά και στο τέλος μένουν στην λίστα όσοι δεν έχουν ανατεθεί σε κάποιο πόστο και είμαστε έτοιμοι. το πρόβλημά μου είναι ότι επειδή έχω πολλά σύνθετα πλαίσια στον κώδικα που βάζω στο rowsource κάθε σύνθετου πλαισίου και στις λίστες, από ένα σημείο και μετά έχω μήνυμα ότι υπερβαίνω το όριο των 1024 χαρακτήρων στο ερώτημα. Έτσι, σκέφτηκα, για να μην αλλάξω όλο το σκεπτικό (αν είναι δύσκολο) τα σύνθετα πλαίσια που δεν χωράνε στον κώδικα λόγω υπέρβασης του ορίου, να τα χειρίζομαι με τον τρόπο που ξεκίνησα το post. Συγνώμη αν μακρυγόρισα αλλά έπρεπε να σας θέσω όλο το σκεπτικό. Ευχαριστώ για την υπομονή σας |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
Σύγκριση σύνθετου πλαισίου και λίστας | area51 | Access - Ερωτήσεις / Απαντήσεις | 5 | 17-07-10 14:37 |
Ανανέωση περιεχομένου σύνθετου πλαισίου | stavros2244 | Access - Ερωτήσεις / Απαντήσεις | 8 | 03-05-10 21:14 |
Δημιουργία σύνθετου πλαισίου | periman | Access - Ερωτήσεις / Απαντήσεις | 5 | 29-01-10 11:58 |
Καταστροφή σύνθετου πλαισίου | sgsiemekis | Access - Ερωτήσεις / Απαντήσεις | 2 | 25-02-09 22:15 |
Τεχνικές ComboBox - Σύνθετου Πλαισίου. | kon73 | Access - Ερωτήσεις / Απαντήσεις | 0 | 19-01-09 11:38 |
Η ώρα είναι 19:47.