Συνάρτηση DlookUp

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

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

Απάντηση
kostas_poul
Δημοσιεύσεις: 11
Εγγραφή: 14 Δεκ 2008 14:53
Τοποθεσία: Καλαμάτα

Συνάρτηση DlookUp

Δημοσίευση από kostas_poul » 18 Δεκ 2008 19:05

Κατ'αρχήν ήθελα να ζητήσω συγνώμη για τη συνεχή υποβολή αποριών που τελικά έχουν λυθεί σε ήδη συζητημένα θέματα.

Το πρόβλημα που μου παρουσιάστηκε αυτή τη φορά το έψαξα, αλλά δε βρήκα κάτι:

Σε μια φόρμα κάποια πεδία συμπληρώνονται μέσω της συνάρτησης θέματος. Ο πίνακας από όπου αντλούνται τα δεδομένα για τα πεδία αυτά δεν είναι ο πίνακας που αντιστοιχεί στη φόρμα.Τα πεδία όμως που συμπληρώνονται (στη φόρμα) είναι πεδία του πίνακα που αντιστοιχεί στη φόρμα.

Αφού λοιπόν έχουν εισαχθεί τα δεδομένα, σε άλλα πεδία manual σε άλλα μέσω της DlookUp, επιλέγω αποθήκευση εγγραφής. Στον πίνακα, τα πεδία που είχαν τιμές μέσω της DlookUp παραμένουν κενά, σε αντίθεση με αυτά που έθεσα manual.

Κάποια ιδέα;Ευχαριστώ πολύ και ελπίζω να μην καταλήξω σαν το βοσκό με το λύκο :lol:

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

Συνάρτηση DlookUp

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

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

Π.χ. αν έχεις τον πίνακα εργαζόμενοι (table1) με πεδία
id, fname, lname (κωδικός, όνομα, επώνυμο).

και έχεις και έναν άλλο πίνακα μισθοδοσίες (table2) με πεδία
aa, table1ID, ..... (ο Α/Α της εγγραφής, το id του εργαζομένου από τον table1, ... άλλα πεδία)

στη φόρμα σου θα έχεις ένα πεδίο που θα συμπληρώνεις τον κωδικό του εργαζομένου που θέλεις να πληρώσεις. Είναι όμως αδύνατο να θυμάσαι τι κωδικό έχει ο καθένας και για να είσαι σίγουρος ότι δεν έκανες λάθος, μια λύση είναι όταν δίνεις τον κωδικό να συμπληρώνεται αυτόματα στη φόρμα το όνομα και το επώνυμο για να μπορείς να επιβεβαιώσεις ότι δεν έχει γίνει κάποιο λάθος. Εδώ για τα πεδία που θα συμπληρωθούν αυτόματα θα χρησιμοποιήσεις την dlookup.
Στη φόρμα σου στο πεδίο Ονομα εργαζομένου θα βάλεις στο Control Source:

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

=DLookUp("fname";"table1";"table1.id=" & [table1ID])
Αν όμως για τους δικούς σου λόγους θέλεις (παρότι δεν χρειάζεται) να αποθηκεύεις και στον table2 το όνομα και το επώνυμο, τότε θα πρέπει να το κάνεις με κώδικα (πρέπει βέβαια και ο table2 να έχει πεδία π.χ. fnameText, lnameText που θα μπούν το όνομα και το επώνυμο).
Θα πάς στο πεδίο table1ID και στο event AfterUpdate θα πεις να φτιάξει κώδικα και θα γράψεις κάτι του στύλ:

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

Private Sub table1ID_AfterUpdate()
    '                  Είναι σχεδόν το ίδιο με αυτό που είχες στο Control Source
    Me.fnameText.Value = CStr(DLookup("fname", "table1", "table1.id=" & [table1ID]) & "")
    '                  Το αντίστοιχο για το πεδίο lname
    Me.lnameText.Value = CStr(DLookup("lname", "table1", "table1.id=" & [table1ID]) & "")

End Sub
Σε αυτή την περίπτωση δεν θέλεις συνήθως να μπορεί ο χρήστης να πειράξει τα πεδία όνομα, επώνυμο που έχουν συμπληρωθεί με κώδικα, οπότε προτείνεται να πας στα properties και να κάνεις το Locked=True

Προσοχή μόνο γιατί στο παράδειγμα και οι δύο φόρμες γράφουν πάνω στον ίδιο πίνακα (table2), οπότε καλό θα είναι να σβήσεις ότι εγγραφές υπάρχουν όταν κάνεις δοκιμές για να δεις τη διαφορά. Και οι δύο παίρνουν το όνομα και το επώνυμο από τον table1.


[edit]
Δες και το http://support.microsoft.com/kb/208786
[/edit]
Συνημμένα
Database1.zip
(20.01 KiB) Μεταφορτώθηκε 475 φορές

kostas_poul
Δημοσιεύσεις: 11
Εγγραφή: 14 Δεκ 2008 14:53
Τοποθεσία: Καλαμάτα

Συνάρτηση DlookUp

Δημοσίευση από kostas_poul » 20 Δεκ 2008 13:33

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

Όπως είπα, έχω μια φόρμα, όπου το πεδίο Επώνυμο επιλέγεται από τον πίνακα φοιτητές. Στον πίνακα αυτόν, αναφέρεται και το πεδίο Όνομα. Για να μου εμφανίζεται αυτόματα στη φόρμα, που λέγεται καταχώρηση βαθμολογίας, το Όνομα όταν επιλέγω το Επώνυμο από σύνθετο πλαίσιο, στην επιλογή Προέλευση Στοιχείου Ελέγχου του πεδίου Όνομα, έχω εισάγει:

=DLookUp("[Όνομα]";"φοιτητές";"[Επώνυμο]=""" & [Φόρμες]![καταχώρηση βαθμολογίας]![Επώνυμο] & """")

Σύμφωνα με την παραπάνω απάντηση, για να αποθηκεύεται και το εμφανιζόμενο όνομα, έβαλα στην επιλογή Μετά Την Ενημέρωση του πεδίου Επώνυμο τον εξής κώδικα:

Private Sub Επώνυμο_AfterUpdate()

Me.Όνομα.Value = CStr(DLookup("Όνομα", "φοιτητές", "Επώνυμο=" & [Επώνυμο]) & "")

End Sub

Επιλέγοντας αποθήκευση της εγγραφής στον πίνακα προορισμού, δεν αποθηκεύεται το όνομα.

Καμιά ιδέα

Και πάλι ευχαριστώ
[/b]

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

Συνάρτηση DlookUp

Δημοσίευση από dva_dev » 20 Δεκ 2008 14:38

Μάλλον παρανόησες.
Η θα το κάνεις με το προέλευση στοιχείου ελέγχου βάζοντας
=DLookUp("[Όνομα]";"φοιτητές";"[Επώνυμο]=""" & [Φόρμες]![καταχώρηση βαθμολογίας]![Επώνυμο] & """")

ή θα το κάνεις με κώδικα αφήνοντας το προέλευση στοιχείου ελέγχου όπως είναι (να έχει το όνομα του πεδίου του πίνακα).

Οχι και τα δύο. Δες στο mdb που ανέβασα και σύγκρινε τα fnameText, lnametext στις δύο φόρμες.

kostas_poul
Δημοσιεύσεις: 11
Εγγραφή: 14 Δεκ 2008 14:53
Τοποθεσία: Καλαμάτα

Συνάρτηση DlookUp

Δημοσίευση από kostas_poul » 21 Δεκ 2008 13:16

Έψαξα λίγο αυτό που λές με τη βδ που ανέβασες. Κανονικά, θα έπρεπε όταν τρέχω τη φόρμα table 2 with code, και επιλέγω ένα οποιοδήποτε table1ID να μη μου βγάζει στη φόρμα τα αντίστοιχα fnameText, InameText, αλλά με την αποθήκευση εγγραφής να τα αποθηκεύει στον πίνακα table 2. Αυτό όμως δεν το κάνει.Το αφήνει κενό...

Το έχω καταλάβει σωστά;

Ελπίζω να μη σε έχω πρήξει...

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

Συνάρτηση DlookUp

Δημοσίευση από kon73 » 22 Δεκ 2008 11:02

Καλημέρα,

Να προτείνω αν είναι και εγώ μία λύση έτσι παρουσιάζω ένα παράδειγμα.

Έχουμε την φόρμα FrmStudents που βλέπει στον Πίνακα TblStudents με πεδία ID, Lname,Fname όπου ID ο κωδικός, Lname το επίθετο και Fname το Όνομα.

Στην Φόρμα Καταχώρηση Βαθμολογίας που θα βλέπει στο Πίνακα Degrees και έχει διάφορα πεδία αυτός ο πίνακας, έχει και το ID που είναι ο κωδικός του μαθητή.

Έτσι στην φόρμα έχουμε πεδίο Επώνυμο και είναι σύνθετο πλαίσιο το οποίο έχει 2 στήλες ID και Επώνυμο με συνδεδεμένη στήλη και κρυφή την πρώτη στήλη. Το Control Source του σύνθετου πλαισίου θα είναι το ID.

Το ίδιο και στο πεδίο Όνομα που είναι σύνθετο πλαίσιο και αυτό, όπου το Control Source θα είναι το ID. (Δύο πεδία δηλαδή που θα έχουν το ίδιο Control Source) και θα έχει 2 στήλες ID και Όνομα.

Τι γίνεται δηλαδή επειδή και τα δύο πεδία είναι με ID συνδεδεμένα, μόλις αλλάξουμε σε ένα από τα δύο το ID φυσικά αλλάζει και στο άλλο πεδίο. Μόνο που επειδή και τα δύο πεδία είναι σύνθετα πλαίσια το ένα θα δείχνει Επώνυμο και το άλλο Όνομα.

Αν κατάλαβα λοιπόν καλά , αυτό είναι που θέλαμε να πετύχουμε.

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

Φιλικά

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

Απάντηση

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

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

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