Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > Σύγκριση σύνθετου πλαισίου και λίστας

Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια!

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 18-02-10, 14:26
Όνομα: Παντελής
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 18-02-2010
Περιοχή: Καβάλα
Μηνύματα: 54
Προεπιλογή Σύγκριση σύνθετου πλαισίου και λίστας

Έχω ένα σύνθετο πλαίσιο το οποίο εμφανίζει τιμές από το πεδίο Επώνυμο του πίνακα ΕΡΓΑΖΟΜΕΝΟΣ. Το ίδιο και η λίστα.

Θέλω να βάλω κώδικα στο 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  
Παλιά 18-02-10, 19:22
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.011
Προεπιλογή

Καλησπέρα σε όλους!

Φίλε Παντελή καλωσόρισες στο φόρουμ!

Για να χρησιμοποιήσεις τις μεθόδους 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  
Παλιά 18-02-10, 19:33
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Καλησπέρα Παντελή!

Αν τα στοιχεία ενός πλαισίου λίστας (Listbox) ή σύνθετου πλαισίου (ComboBox)
προέρχονται από έναν πίνακα ή ερώτημα, δεν μπορείς να διαγράψεις στοιχεία από τη λίστα τους.
Θα πρέπει η προέλευσή τους να είναι τύπου "Λίστα τιμών" (Value List).

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

Καλωσόρισες στο φόρουμ!
Γιάννης

Υ.Γ.
Τάσο, με έφαγες στη στροφή!!!

Τάσος: Αν ήξερα ότι θα απαντούσες, απλά θα καλωσόριζα τον Παντελή!
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!

Τελευταία επεξεργασία από το χρήστη Tasos : 18-02-10 στις 20:23.
Απάντηση με παράθεση
  #4  
Παλιά 18-02-10, 20:30
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

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

Μετά τη πρόταση "End With" στη διαδικασία "Form_Load", προσθέτεις το

Κώδικας:
Me.MyCombo.RowSource = Me.List1.RowSource
και στο συμβάν AfterUpdate του ComboBox κάνεις το εξής:

Κώδικας:
Private Sub MyCombo_AfterUpdate()
    With Me.MyCombo
        Me.List1.RemoveItem (.ListIndex)
        .RowSource = Me.List1.RowSource
        .Value = Null
    End With
End Sub
Οι λίστες των δύο πλαισίων (List1 και MyCombo) διατηρούνται συγχρονισμένες
και έτσι είμαστε σίγουροι ότι διαγράφεται το σωστό στοιχείο από τη λίστα του ListBox
και όχι το πρώτο ταίριασμα.
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #5  
Παλιά 18-02-10, 22:08
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Παράθεση:
Τάσος: Αν ήξερα ότι θα απαντούσες, απλά θα καλωσόριζα τον Παντελή!
Αυτό μην το ξαναπείς Τάσο!
Όσο μιλάς εσύ, εμείς μαθαίνουμε...!

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

Δες τι εννοώ:

Κώδικας:
    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
Update:
Και για περιπτώσεις με πολλές στήλες, αναβαθμίζουμε την έκφραση Replace(.GetString, Chr(13), ";") ως εξής:

Κώδικας:
Replace(Replace(.GetString, Chr(13), ";"), Chr(9), ";")
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!

Τελευταία επεξεργασία από το χρήστη nisgia : 18-02-10 στις 22:48.
Απάντηση με παράθεση
  #6  
Παλιά 19-02-10, 00:23
Όνομα: Ηλιάδης Κωνσταντίνος
Έκδοση λογισμικού Office: Ms-Office 2010, Ms-Office 2013
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 13-12-2008
Περιοχή: Chicago
Μηνύματα: 119
Προεπιλογή

Καλησπέρα,

Μια λύση ακόμα ως συμπλήρωμα σε όλα αυτά που προαναφέρθηκαν είναι στον πίνακα πχ 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  
Παλιά 19-02-10, 09:30
Όνομα: Παντελής
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 18-02-2010
Περιοχή: Καβάλα
Μηνύματα: 54
Προεπιλογή

Πολύ καλημέρα σε όλους!

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

Μπράβο σε όλους όσους στηρίζουν αυτό το forum.

Θα δοκιμάσω αυτά που μου προτείνατε και θα έχετε νεότερά μου το συντομότερο δυνατό.

Σας ευχαριστώ όλους!
Απάντηση με παράθεση
  #8  
Παλιά 19-02-10, 10:02
Όνομα: Παντελής
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 18-02-2010
Περιοχή: Καβάλα
Μηνύματα: 54
Προεπιλογή

Στην περίπτωση που θέλω να επιλέγω για παράδειγμα όλες τις τιμές από το πεδίο 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  
Παλιά 19-02-10, 10:31
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.011
Προεπιλογή

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

Με εκτίμηση

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #10  
Παλιά 19-02-10, 11:14
Όνομα: Παντελής
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 18-02-2010
Περιοχή: Καβάλα
Μηνύματα: 54
Προεπιλογή

Λοιπόν,
Φανταστείτε ότι έχω μία εταιρία, η οποία έχει 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.

Συγνώμη αν μακρυγόρισα αλλά έπρεπε να σας θέσω όλο το σκεπτικό.

Ευχαριστώ για την υπομονή σας
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός 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.