List box population

Συζητήσεις για την τοπική βάση δεδομένων Access της Microsoft

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
kostello
Δημοσιεύσεις: 13
Εγγραφή: 18 Μάιος 2007 21:06

List box population

Δημοσίευση από kostello » 03 Σεπ 2008 13:38

Kalispera se oloys. Exw to eksis problhma.

Exw 2 pinakes: KatigoriesProiontwn kai Proionta
O pinakas KatigoriaProiontwn exei tis ekseis eggrafes: kafedes, anapsiktika, xymoi ktl.
Twra, kathe mia apo autes tis eggrafes einai kai enas pinaka. Diladi:
kafedes: espresso, nes, ellinikos,filtrou
anapsiktika: cocacola, fanta, sprite ktl...

Exw 2 list boxes. To ena list box ginete populated me tis eggrafes tou pinaka KatigoriaProiontwn. Diladi to ena listbox exei: kafedes, anapsiktika, xymoi ktl

Thelw to allo list box na pairnei tis eggrafes tou antistoixou pinaka gia kathe katigoria proiontos pou epilega apo to prwto list box.
Diladi otan kanw klik sto : kafedes na mou emfanizete sto allo list box: espresso, nes, ellinikos ktl.

Thelw auto na ginete eite me ena klik panw se ena item tou listbox1 eite na epilegw ena item kai meta na pataw ena koumpi pou na mou emfanizei auta pou thelw sto listbox2.

Exw psaksei olo to net den vriskw tipota. Kserw oti ginete me tin methodo selectedtem alla mou vgazei error i access.

Logika den prepei na xrisimopoiisw tin eksis logiki?
If listbox1.selecteditem = "kafedes" then
sql query pou na kanei populate to listbox2 me ta values tou pinaka kafedes.

I mipws kalutera na to kanw me case?

Any help would be much appreciated!

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 03 Σεπ 2008 17:46

Φίλε Kostello,

Το listbox γυρίζει ένα index Array με αρχή το 0. Για να γίνω πιο κατανοητός θα πρέπει να δώσεις στην κατηγορία προϊόντων σου και ένα ακόμα πεδίο πχ ListBoxID που θα αρχίζει από το 0.
Δεν γυρίζει το ListBox δηλαδή string ή values εκτός από Index.

To ListBox θα το χρησιμοποιήσεις προφανώς για φιλτράρισμα των εγγραφών σου ή ως Bound πεδίο που θα έχει τιμές ; Το δεύτερο ListBox με βάση το πρώτο και τον αριθμό ListBox μπορεί όντως να φιλτράρεται ως προς το τι θα εμφανίζει (Πάντα με κώδικα VBA αυτό)

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

Φιλικά
kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

List box population

Δημοσίευση από dva_dev » 04 Σεπ 2008 00:04

(Δες στο παράδειγμα που υπάρχει σε rar.)

Φτιάχνεις πρώτα τους πίνακες t1, t2, έχουν οριστεί primary keys και έχει μπεί το σχετικό relation ώστε να μπορούν να συσχετιστούν οι κατηγορίες.

Μετά φτιάχνεις μια φόρμα, και βάζεις δύο listboxes (List4, List2).

Στο List4 δίνεις rowsource τον πίνακα t1 (μορφοποιείς λίγο ώστε να μην εμφανίζει το primary key αλλά μόνο την περιγραφή) και bound column την στήλη 1 (ο αριθμός της στήλης που είναι το id).

Στο List2 δίνεις rowsource "select <όλα τα πεδία ή όποια θέλεις> from t2 where t2.parentid = η επιλεγμένη τιμή από το άλλο listbox" οπότε αλλάζοντας η επιλεγμένη εγγραφή μπορείς να φέρεις τις αντίστοιχες εγγραφές εδώ.
Το rowsource μπορεί να γίνει "SELECT t2.id, t2.parentid, t2.descr FROM t2 WHERE (t2.parentid=Forms!Form1!List4)

Ετσι κάθε φορά που αλλάζει η επιλεγμένη εγγραφή στο list4, το list2 θα μπορεί να ανανεωθεί.
Το μόνο που λείπει είναι να του πούμε ακριβώς αυτό το πράγμα.
Πηγαίνεις στο list4 και στο event After Update πας να γράψεις λίγο κώδικα (ώστε να γίνει κάτι τέτοιο):

Κώδικας: Επιλογή όλων

Private Sub List4_AfterUpdate&#40;&#41;
    Me.List2.Requery
    Debug.Print "Selected Value&#58; " & CStr&#40;List4.Value&#41;
End Sub
Η πρώτη γραμμή είναι αυτό που χρειάζεται, η δεύτερη είναι απλώς για debugging και μπορεί να δείξει ποιά είναι η επιλεγμένη τιμή στο Listbox List4.
kon73 έγραψε:Δεν γυρίζει το ListBox δηλαδή string ή values εκτός από Index
Για την επιλεγμένη τιμή μπορείς να χρησιμοποιήσεις το Property Value (π.χ. List4.Value) το οποίο είναι variant και μπορεί να κρατήσει ότι δεδομένα είναι και η bound column στο listbox.
Στο List4 η bound column 1 είναι text (το rowsource είναι το t1 οπότε φέρνει όλα τα πεδία του πίνακα t1 με τη σειρά που είναι δηλωμένα: id:text, descr:text)
Αντίθετα στο List2 η bound column 1 είναι number (το rowsource φέρνει τα πεδία id:number, parentid:text, descr:text)
Συνημμένα
Sample1.rar
(6.82 KiB) Μεταφορτώθηκε 685 φορές

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 04 Σεπ 2008 01:57

Εδώ πρέπει να γίνει μία διευκρίνηση. Ένα ListBox συνήθως χρησιμοποιείται για την δυνατότητα του να μπορείς να επιλέγεις πολλά μαζί ως Simple ή ως Extended στο MultiSelect property εκεί το Bound στο Control Source χάνει την χρησιμότητά του.
Επομένως στην περίπτωση που θέλει κάποιος να επιλέξει περισσότερο από μία επιλογή για να δεις τις τιμές που έχουν επιλεγεί ή για να εμφανίσει στο δεύτερο ListBox όλες τις πολλαπλές επιλογές του πρώτου ListBox θέλεις το Index και το property ItemData εκεί αναφέρομαι ότι το ListBox θέλει indexes.


Το λοιπόν το ερώτημα το είχα καταλάβει ως πολλαπλές επιλογές γι'αυτό και άλλωστε ρωτούσα για bound ή για απλό φιλτράρισμα εγγραφών.
Το σύνηθες για μία και μόνο επιλογή γίνεται με ComboBox εκτός και αν επιλέξουμε το ListBox με none στο Property MultiSelect σε περίπτωση που μας αρέσει περισσότερο το ListBox αντί του ComboBox.

Η Λύση βέβαια που δίνει o dva_dev σίγουρα απαντά στο πρόβλημα του φίλου kostello απλά εγώ σκέφτηκα κάτι πιο πολύπλοκο.
Ειδικά βέβαια όταν θέλουμε στο Bound του ListBox να διατηρεί τις πολλαπλές επιλογές όπου έχουμε κάνει, εκεί το έχω εφαρμόσει με κώδικα που αποθηκεύει τα indexes με κόμμα και τα διαβάζει έχοντας ως διαχωριστικό το κόμμα.

Με την σειρά μου το λοιπόν κάνω το ερώτημα υπάρχει κανένας άλλος τρόπος ώστε να διατηρεί τις πολλαπλές επιλογές που έχουμε κάνει σε ListBox ;

Φιλικά
kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

List box population

Δημοσίευση από dva_dev » 05 Σεπ 2008 14:24

kon73 έγραψε:...υπάρχει κανένας άλλος τρόπος ώστε να διατηρεί τις πολλαπλές επιλογές που έχουμε κάνει σε ListBox ;
Πρίν 1-2 χρόνια που είχα χρειαστεί κάτι αντίστοιχο με πολλαπλές επιλογές είχα αποφύγει να αποθηκεύω τις επιλογές σε string (σαν comma separated values - csv) γιατί είναι πολύ δύστροπα, αφού απαιτούσαν μεγάλη προσοχή στη διαχείριση τους, αλλά κυρίως επειδή είναι ευαίσθητα στον τύπο των δεδομένων. Με τα νούμερα τα πάνε σχετικά καλά, αλλά με string values; Αν περιέχουν "περίεργους χαρακτήρες" όπως εισαγωγικά, τελείες, κόμματα, αλλαγές γραμμών&#8230; Αστα να πάνε, άμα είναι να σου βγάλουν την πίστη, να μένει το βύσινο!
Και στο κάτω κάτω γιατί να κάθομα εγώ και να αγχώνομαι για το πως πρέπει να γίνει η αποθήκευση/αναζήτηση/... αφού όλα αυτά υπάρχουν έτοιμα, και σίγουρα αυτός που τα έφτιαξε μάλλον τα κάνει καλύτερα από εμένα;

Οπότε μια απάντηση που μου φαίνεται προφανής, αφού για μία (1) εγγραφή μπορείς να έχεις πολλές (Ν) επιλογές:
Αντί να τα αποθηκεύεις σε ένα πεδίο σαν string, ας κάνεις τον κόπο να φτιάξεις έναν ακόμα πίνακα συνδεδεμένο πρός τον πρώτο με σχέση 1-Ν. Ετσι γλυτώνεις αρκετούς ελέγχους, δεν περιορίζεσαι στον τύπο δεδομένων, δεν περιορίζεσαι προς το περιεχόμενο, δεν περιορίζεσαι προς τον αριθμό των επιλογών (μπορεί να είναι 1 ή 10 ή 1000000), έχεις κώδικα δοκιμασμένο, και το κυριότερο... αν δεν δουλεύει έχεις κάποιον άλλο υποψήφιο να κατηγορήσεις!

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 05 Σεπ 2008 15:38

Με τα νούμερα τα πάνε σχετικά καλά, αλλά με string values;
Αγαπητέ μου Φίλε dva_dev. Η καταχώρηση ενός ListBox δεν θα καταχωρεί τα δεδομένα αυτούσια. πχ έχεις δεδομένα Strings στο ListBox . Αυτό που καταχωρείς στο μοναδικό πεδίο bound είναι το Index του ListBox. Δηλαδή έχουμε ένα ListBox ("Καφέδες","Αναψυκτικά","Ποτά").
Εδώ δεν καταχωρούμε τα Strings στο String πεδίο αλλά τα Indexes δηλαδή 0,1,2 κοκ.
Αν περιέχουν "περίεργους χαρακτήρες" όπως εισαγωγικά, τελείες, κόμματα, αλλαγές γραμμών&#8230; Άστα να πάνε, άμα είναι να σου βγάλουν την πίστη, να μένει το βύσινο!
Και στο κάτω κάτω γιατί να κάθομα εγώ και να αγχώνομαι για το πως πρέπει να γίνει η αποθήκευση/αναζήτηση/... αφού όλα αυτά υπάρχουν έτοιμα, και σίγουρα αυτός που τα έφτιαξε μάλλον τα κάνει καλύτερα από εμένα;
Επομένως εδώ δεν έχουμε καταχώρηση περιέργων χαρακτήρων αφού καταχωρώ το Index.
Έτσι οποιοδήποτε και να είναι το Αλφαρηθμιτικό που έχει το ListBox ή αριθμός με οποιοδήποτε τύπο εγώ καταχωρώ το Index του στο ListBox. Απλά τα δεδομένα θα πρέπει να διαβάζονται από έναν πίνακα που θα έχει 2 στήλες ένα το Πεδίο που θα εμφανίζεται στο ListBox και μία στήλη που θα είναι το ID του Index.
Οπότε μια απάντηση που μου φαίνεται προφανής, αφού για μία (1) εγγραφή μπορείς να έχεις πολλές (Ν) επιλογές:
Αντί να τα αποθηκεύεις σε ένα πεδίο σαν string, ας κάνεις τον κόπο να φτιάξεις έναν ακόμα πίνακα συνδεδεμένο πρός τον πρώτο με σχέση 1-Ν. Ετσι γλυτώνεις αρκετούς ελέγχους, δεν περιορίζεσαι στον τύπο δεδομένων, δεν περιορίζεσαι προς το περιεχόμενο, δεν περιορίζεσαι προς τον αριθμό των επιλογών (μπορεί να είναι 1 ή 10 ή 1000000), έχεις κώδικα δοκιμασμένο, και το κυριότερο... αν δεν δουλεύει έχεις κάποιον άλλο υποψήφιο να κατηγορήσεις!
Η αποθήκευση που μου αναφέρεις σε 2 πίνακες δηλαδή την αντιλαμβάνομαι ως εξής. Ένας πίνακας που θα έχει ένα πεδίο ID της εγγραφής και θα είναι συνδεδεμένο με ένα πίνακα με 2 στήλες, ένα ID και ένα που θα έχει τις επιλογές που επιλέχθηκαν από το ListBox.

Το ListBox θα είναι ουσιαστικά bound στον πίνακα τον δεύτερο με σύνδεση όμως με το ID του πρώτου πίνακα ώστε να εμφανίζει τις επιλογές που έχουν γίνει σε κάθε εγγραφή.

Λοιπόν θα το εφαρμόσω σε ένα sample mdb και θα το ανεβάσω στο site μου. Όμως θα πρέπει να ελέγξω την ταχύτητα διαβάσματος και εγγραφής και με τους δύο τρόπους ώστε να δω ποιος είναι ο βέλτιστος.

Πληροφοριακά η λύση με indexes και comma είναι μία προτεινόμενη λύση εκτός από μένα και από Microsoft απλά με διαφορετική προσέγγιση στην υλοποίηση του κώδικα και χωρίς να έχουν σκεφτεί την καταχώρηση του Index αλλά την κάθε αυτού αποθήκευση της τιμής του ListBox.

Φιλικά

Kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

List box population

Δημοσίευση από dva_dev » 05 Σεπ 2008 20:41

Το αν είναι δύσχρηστα τα csv strings ή όχι μπορείς να το διαπιστώσεις όταν προσπαθήσεις να αποθηκεύσεις τιμές που δεν είναι ακέραιες (πραγματικοί ή κείμενα). Εμένα πάντως μου φάνηκαν, και επιπλέον δεν υπήρχε λόγος να κάτσω να παιδευτώ αφού υπήρχε άλλη λύση εγγυημένη που δουλεύει με κάθε τύπο δεδομένων ανεξαρτήτως πλήθους. Αυτή τη λύση είναι που ανέφερα σαν εναλακτική στο ερώτημα "...υπάρχει κανένας άλλος τρόπος ώστε να διατηρεί τις πολλαπλές επιλογές...".

Δεν θα πω να μην χρησιμοποιείς comma separated values (csv) strings αφού έχεις βρεί κάποιον βολικό τρόπο να τα χρησιμοποιείς και κάνουν τη δουλειά που θέλεις, απλώς θα αναφέρω ότι είναι λάθος να αποθηκεύεις τον index στο csv string. Αυτό που πρέπει να αποθηκευτεί είναι η τιμή της bound στήλης.

» Δημιούργησε για παράδειγμα έναν πίνακα με όσες τιμές θέλεις (βάλε τουλάχιστον 3-4 εγγραφές).
» φτιάξε μια φόρμα με ένα listbox που το query του να φορτώνει τις εγγραφές αυτές με αύξουσα ταξινόμηση και να αποθηκεύει (και να φορτώνει αντίστοιχα) τους indexes από τις επιλεγμένες τιμές σε ένα comma separated string.
» φτιάξε μία ακριβώς ίδια με listbox που όμως το query του να φορτώνει τις εγγραφές με φθίνουσα ταξινόμηση.
» Επέλεξε την πρώτη και την δεύτερη εγγραφή στην πρώτη φόρμα, αποθήκευσε το string που θα δημιουργήσεις (φαντάζομαι θα είναι το "0,1") και κλείσε τη φόρμα.
» Ξαναάνοιξε την πρώτη φόρμα (θα φορτωθεί το "0,1") και επιβεβαίωσε ότι το listbox δείχνει τις τιμές που είχες επιλέξει.
Ολα καλά μέχρι εδώ.
» Ανοιξε τώρα τη δεύτερη φόρμα (θα φορτωθεί το "0,1") και επιβεβαίωσε κατά πόσο η δεύτερη φόρμα που φορτώνει τις ίδιες τιμές με την πρώτη δείχνει τα ίδια πράγματα επιλεγμένα.

Ενα άλλο παράδειγμα γιατί είναι λάθος να αποθηκεύονται οι indexes βρίσκεται εδώ και αντιγράφω:
Η ουσία του post δεν είναι τόσο το που αποθηκεύονται οι επιλογές, αν είναι css, πίνακας, blog object, ή οτιδήποτε άλλο, αλλά το τι είναι αυτό που θα αποθηκεύσεις.
Εστω ότι έχουμε τον πίνακα t1(id: text primary key, descr: text) με τιμές:

"ΚΑ", "ΚΑΦΕΔΕΣ"
"ΑΝ", "ΑΝΑΨΥΚΤΙΚΑ"
"ΧΥ", "ΧΥΜΟΙ"

Τα εμφανίζουμε στο listbox, (φέρνουμε τα δεδομένα από τη βάση μας χωρίς να ορίσουμε κάποια ταξινόμηση, οπότε χρησιμοποιείται το id που είναι primary key). Το αποτέλεσμα είναι κάτι τέτοιο:

"ΑΝΑΨΥΚΤΙΚΑ"
"ΚΑΦΕΔΕΣ"
"ΧΥΜΟΙ"

Επιλέγουμε τα δύο τελευταία (οπότε θα δημιουργηθεί το string "1,2&#8243; που περιέχει τους indexes των δύο επιλογών) και το αποθηκεύουμε σε ένα csv string.
Κλέινουμε τη φόρμα, την ξανανοίγουμε, διαβάζουμε το csv και επιλέγονται τα items με indexes 1 και 2 οπότε φαίνονται στο listbox επιλεγμένα και τα δύο! Το αποτέλεσμα είναι κάτι τέτοιο:

"ΑΝΑΨΥΚΤΙΚΑ"
"ΚΑΦΕΔΕΣ" (επιλεγμένο)
"ΧΥΜΟΙ" (επιλεγμένο)

Κλείνουμε τη φόρμα και προσθέτουμε στον πίνακα t1 και τις εγγραφές:

"ΒΟ", "ΒΟΥΤΗΜΑΤΑ"
"ΝΕ", "ΝΕΡΑ"
"ΠΟ", "ΠΟΤΑ"
"ΦΑ", "ΦΑΓΗΤΑ"
"ΓΛ", "ΓΛΥΚΑ"

Ανοίγουμε τη φόρμα, διαβάζουμε το csv και επιλέγονται τα items με indexes 1 και 2, και βλέπουμε τα εξής στο listbox:

"ΑΝΑΨΥΚΤΙΚΑ"
"ΒΟΥΤΗΜΑΤΑ" (επιλεγμένο)
"ΓΛΥΚΑ" (επιλεγμένο)
"ΚΑΦΕΔΕΣ"
"ΝΕΡΑ"
"ΠΟΤΑ"
"ΦΑΓΗΤΑ"
"ΧΥΜΟΙ"

Ωπα! Κάτι πήγε στραβά! Είχαμε επιλέξει "ΚΑΦΕΔΕΣ" και "ΧΥΜΟΙ" (και που να το θυμόμαστε ειδικά μετά από καιρό), αλλά εμφανίζεται ΒΟΥΤΗΜΑΤΑ και ΓΛΥΚΑ, γιατί εξαρτόμαστε από τη σειρά εμφάνισης (η οποία δεν μας εγγυάται κανένας ότι δεν θα αλλάξει) και όχι από τις τιμές.

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 05 Σεπ 2008 21:15

Φίλε μου dva_dev,

Στο παράδειγμα που αναφέρεις για να μην χάνονται και να εμφανίζονται πάντα σωστά μετά από προσθήκη νέων τιμών στο Listbox τα Indexes ξεχνάς κάτι βασικό που έχω αναφέρει.

Υπάρχει πίνακας 2 στηλών. Η πρώτη στήλη είναι το ID που έχει τιμή 0,1,2,3 κοκ και όταν προσθέτεις νέες τιμές έχει το 4 μετά το 5 κλπ και δεν υπάρχει κάποια ταξινόμηση αλφαβητική στο ListBox παρά μόνο ταξινόμηση με το ID. Κάνεις μία συσχέτιση του Index του ListBox με το ID.

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

Και τέλος δεν μου αναφέρεις αν η σύλληψη σχετικά με τις σχέσεις των πινάκων αντί αυτού της αποθήκευσης σε έναν πεδίο και μόνο με διαχωριστικό το κόμμα είναι αυτό που εννοούσες ;


Φιλικά

kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

kostello
Δημοσιεύσεις: 13
Εγγραφή: 18 Μάιος 2007 21:06

List box population

Δημοσίευση από kostello » 06 Σεπ 2008 12:18

Sas eyxaristw polu gia tis apantiseis sas.
Pisteuw me vothisate arketa.

Dystyxws den vrika akoma ton xrono(logw douleias) gia na doulepsw me tin vasi.
Tha koitaksw na efarmosw auta pou mou eipate asap.
Pisteuw oti i lusi tou filou dva_dev einai i pio eukoli kai pio katanoiti.
Allwste ithela akrivws auto pou mou leei.

H epilogi apo to listbox 1 kathe fora tha einai moni.
Den prokeite na epileksw 2 proionta pote. THelw na epilegw mia katigoria kai to allo listbox na mou vgazei ta proionta pou exei i katigoria auti.

Tha sas enimerwsw suntoma gia to apotelesma.

Euxaristv para poly

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 06 Σεπ 2008 21:24

Ομολογουμένως ο dva_dev απάντησε στο ερώτημα σου και μπορώ να πω ότι ήταν σαφείς.

Μου έδωσε να πω την αφορμή να το ψάξω καλύτερα και να πειραματιστώ και με άλλους τρόπους.

Η αλήθεια είναι όπως και ο ίδιος αναφέρει στο blog του ότι οι ερωτήσεις που γίνονται σε αυτό το Forum έχουν ως συνέπεια τον προβληματισμό μας.

Φιλικά

Kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

kostello
Δημοσιεύσεις: 13
Εγγραφή: 18 Μάιος 2007 21:06

List box population

Δημοσίευση από kostello » 08 Σεπ 2008 13:13

Eyxaristw para polu gia tin voitheia.

Elusa to provlima mou opws mou eipate.

Twra thelw , afou epileksw ena proion apo to deutero listbox, na exw ena koumpi pou na kane add kai delete proionta apo ton antistoixo pinaka.

Sunexizw tin vasi mou...

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 08 Σεπ 2008 14:46

Να ρωτήσω τα ίσως αυτονόητα για να μην σε μπερδέψω.

Λοιπόν το Κουμπί θα διαγράφει το επιλεγμένο στοιχείο του δεύτερου ListBox πχ.

Καφέδες
Αναψυκτικά
Φαγητά

Φωτισμένο/επιλεγμένο είναι πχ το Αναψυκτικά και το κουμπί να το διαγράφει σωστά ;
Για να προσθέσει το κουμπί κάποια τιμή πχ Ποτά κάπου πρέπει να ξέρει το πρόγραμμα πια τιμή θέλεις να εισαχθεί σε αυτό σωστά ;

Λοιπόν προτείνω να τροποποιήσω το παράδειγμα του Dva_dev ή μου στέλνεις την βάση σου για να μην κάνεις Copy-Paste από το Demo και πατώντας με δεξί κλικ του ποντικιού να έχουμε 2 επιλογές που θα είναι Διαγραφή και Προσθήκη.

Όταν πατάς διαγραφή θα εμφανίζει και μήνυμα επιβεβαίωσης και όταν πατάς προσθήκη θα εμφανίζεται Παράθυρο (χρησιμοποιώντας τακτική InputBox, ή νέας φόρμας ή Unbound txtBox στην ίδια φόρμα) στο οποίο θα πρέπει να εισάγεις την νέα τιμή του προϊόντος.

Πες μου αν έγινα κατ'αρχάς κατανοητός και κατά δεύτερον αν είναι να το δουλέψω στο Demo.

Φιλικά

Kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 08 Σεπ 2008 15:33

Βάζω το SampleOk όπου είναι βασισμένο στο Demo του DVA_Den

Υπάρχει κώδικας που είναι στα Modules και θα πρέπει να Πας στο ShortCutMenus Toolbars και να αλλάξεις την κλήση των δύο Συναρτήσεων για να διαβάζει από τους δικούς σου πίνακες. Στον κώδικα θα πρέπει να αλλάξεις το Forms!Form1!List4 στο δικό σου το όνομα φόρμας και όνομα πρώτου Listbox .

Mε δεξί κλικ στο δεύτερο ListBox έχεις τις επιλογές που θέλεις (Διαγραφή - Εισαγωγή).



Για οτιδήποτε εδώ είμαστε πάλι

Φιλικά

Kon73
Συνημμένα
sampleok.rar
Οκ
(22.78 KiB) Μεταφορτώθηκε 473 φορές
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

kostello
Δημοσιεύσεις: 13
Εγγραφή: 18 Μάιος 2007 21:06

List box population

Δημοσίευση από kostello » 08 Σεπ 2008 16:50

Se euxaristw polu gia ton xrono sou.

Katalaves polu swsta.
To koumpi tha kanei delete to epilegmeno proion apo to listbox2.
Oso gia tin prosthiki neou proiontos auto to exw idi kanei.
Twra douleuw gia to delete.
Einai polu aplo alla afou valw to sql query mou leei oti 0 rows will be deleted. are you sure?

Exw to eksis:
DoCmd.RunSQL ("DELETE FROM "table name" WHERE "value to be deleted" = '" &listbox & "'")

Exw episis dokimasei
DoCmd.RunSQL ("DELETE FROM "table name" WHERE "value to be deleted" = listbox.Value)

Den mou dinei kanena error alla den svinei to row apo ton pinaka.

Polu kali i idea sou me to deksi click. Tha koitaksw to sample sou kai tha apofasisw. Episis isws vrw kai lusi sto delete query mou,

Na eisai kala

Άβαταρ μέλους
kon73
Script Master
Δημοσιεύσεις: 224
Εγγραφή: 13 Απρ 2008 23:47
Επικοινωνία:

List box population

Δημοσίευση από kon73 » 08 Σεπ 2008 17:27

Φίλε Kostello,

Το SQL string σου έχει το κείμενο

DoCmd.RunSQL ("DELETE FROM "table name" WHERE "value to be deleted" = listbox.Value)

Να υποθέσω ότι το table name και το Value to be Deleted είναι το όνομα του πίνακα και το όνομα του πεδίου που φιλτράρει για να διαγράψει την εγγραφή και φυσικά δεν θα μείνουν έτσι στο SQLstring σου.

Λοιπόν Ας πάρω 2 παραδείγματα (Ένα με τύπο πεδίου που φιλτράρει να είναι αριθμός, και ένα κείμενο)

Πίνακας : Items2
Πεδίο : Items2ID

O πίνακας items2 είναι ο πίνακας που έχει τις εγγραφές του ListBox2 και το πεδίου αυτού του πίνακα είναι Items2ID που θα είναι το κλειδί πεδίο για τον φιλτράρισμα σου.

Το Item2ID ας υποθέσουμε ότι είναι κείμενο

DoCmd.RunSQL ("DELETE items2.* FROM items2 WHERE items2ID ='"& listbox.Value &"'" )

το τελευταίο είναι " ' " χωρίς κενά βέβαια. Θέλει δηλαδή το κείμενο να είναι μέσα σε ΄
To Listbox.Value φυσικά επιστρέφει κείμενο

Για αριθμό

Το Item2ID ας υποθέσουμε ότι είναι κείμενο

DoCmd.RunSQL ("DELETE items2.* FROM items2 WHERE items2ID ="& listbox.Value )

To Listbox.Value φυσικά επιστρέφει αριθμό

Για ημερομηνία αν δηλαδή έχεις ημερομηνία στο πεδίο φιλτραρίσματος βάζεις

"#" & Format(Listbox.value,"mm/dd/yy") &"#"

Όπου του δίνεις Format αμερικάνικο καθότι έτσι δουλεύει σωστά το SQLString

Αυτά

Φιλικά kon73
My New Site http://www.MsAccess.gr
Free Access (VBA Code,Tutorials, Mdbs, Eclass, Eshop)
Εικόνα

Απάντηση

Επιστροφή στο “MS Access”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης