Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#11
| ||||
| ||||
Στο παράδειγμα μου, οι φόρμες ανοίγουν με τη γραμμή: DoCmd.OpenForm strForname, , , , , , FormOpemArgs Η μεταβλητή FormOpemArgs αντιστοιχεί στο .OpenArgs της φόρμας που ανοίγει κάθε φορά. Με την ιδιότητα .OpenArgs μπορείς να περάσεις όποια πληροφορία θέλεις στη φόρμα που θέλεις να ανοίξεις. Σε κάθε μια από τις φόρμες του παραδείγματος, υπάρχει στο συμβάν Form_Load() o παρακάτω κώδικας που επεξεργάζεται (στην περίπτωση σου τη διασπά στα 2 συστατικά που της έχεις ορίσει) τη μεταβλητή FormOpemArgs και περνά τις τιμές στα πεδία απλά και μόνο για να γίνει κατανοητό το παράδειγμα: Κώδικας: Private Sub Form_Load() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then MyValues = Split(Me.OpenArgs, ";") Me.txtArgs1 = MyValues(0) Me.txtArgs2 = MyValues(1) End If End Sub Φιλικά Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών Τελευταία επεξεργασία από το χρήστη Tasos : 17-03-10 στις 19:48. |
#12
| |||
| |||
Στο συνημμένο αρχείο είναι ένα δείγμα της εφαρμογής μου. Στην φόρμα "ΣΕΝΤΟΝΙ" στο after update του σύνθετου πλαισίου έχω δείγμα του κώδικα που χρησιμοποιούσα πριν, σε μορφή σχολίων και ο καινούργιος είναι από πάνω. Δεν μπορώ να καταλάβω πως θα μπορούσα να εφαρμόσω το .openArgs στο παράδειγμά μου. Είναι σαν να πρέπει να μεταφέρω όλο τον κώδικα από το after update του σύνθετου πλαισίου στο on load event της φόρμας που ανοίγει - κάτι που δεν βολεύει γιατί έχω πολλά σύνθετα πλαίσια. Συγχωρέστε με αν η λύση που μου πρότεινε ο Τάσος μου κάνει και δεν το κατάλαβα - αλλά δεν είμαι ειδικός στην VBA Ευχαριστώ για την βοήθεια! |
#13
| ||||
| ||||
Καλημέρα Παντελή, DoCmd.OpenForm strForname, , , , , , FormOpemArgs Στη μεταβλητή FormOpemArgs την έχουμε περάσει σε προηγούμενη γραμμή του κώδικα με τις τιμές: Me.Επώνυμο & ";" & Me.Υπηρεσία1 (μετ. "ΜΠΟΥΔΑΛΑΚΗΣ;ΤΑΜ2") Δες τη βοήθεια της VBA στην Access σχετικά με το DoCmd.OpenForm Method (στον VBE κάνε κλικ πάνω στη λέξη "OpenForm" και πάτησε F1): Με άλλα λόγια, μπορούμε στο τελευταίο όρισμα της .OpenForm, το OpenArgs να περάσουμε τις πληροφορίες πού θέλουμε στη φόρμα που θα ανοιχτεί. Οι πληροφορίες αυτές με το άνοιγμα της φόρμας υπάρχουν ήδη εκεί στην ιδιότητα OpenArgs. Στην περίπτωση σου οι πληροφορίες αυτές αποστέλλονται στη φόρμα που θέλεις να ανοίξεις πχ. ΥΠ_ΣΑΒ και σε περιμένουν να τις επεξεργαστείς! Πως; Αυτό που πρέπει να κάνεις είναι να περάσεις τις πληροφορίες που έστειλες με τη μεταβλητή FormOpemArgs (μετ. "ΜΠΟΥΔΑΛΑΚΗΣ;ΤΑΜ2") στα πεδία της φόρμας ΥΠ_ΣΑΒ κατά το άνοιγμα της περνώντας της τον παρακάτω κώδικα: Κώδικας: Private Sub Form_Open() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then MyValues = Split(Me.OpenArgs, ";") Me.txtArgs1 = MyValues(0) 'όπου Me.txtArgs1 = το πεδίο που θα πάρει την πρώτη τιμή Me.txtArgs2 = MyValues(1) 'όπου Me.txtArgs2 = το πεδίο που θα πάρει τη δεύτερη τιμή End If End Sub Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών Τελευταία επεξεργασία από το χρήστη Tasos : 18-03-10 στις 20:19. |
#14
| |||
| |||
Τάσο καλημέρα, Μου έδωσες να καταλάβω πολύ καλά πως δουλεύει η μεταβλητή του παραδείγματος! Συνειδητοποίησα ότι δεν χρειάζεται τελικά να περάσω δύο μεταβλητές στην φόρμα που ανοίγω αλλά μία - μόνο το Επώνυμο. Δηλαδή, θα έχω Docmd.openform form's_name, , , , , , Me.Επώνυμο & ";" Ουσιαστικά οι τιμές του σύνθετου πλαισίου της αρχικής φόρμας(ΣΕΝΤΟΝΙ) δεν συνδέονται με κάποιο στοιχείο της φόρμας που θα ανοίγει κάθε φορά. Στο afterupdate του σύνθετου πλαισίου της αρχικής φόρμας έχω πολλά if. Δηλαδή, εάν επιλεγεί μία συγκεκριμένη τιμή από το σύνθετο πλαίσιο, τότε το Επώνυμο της συγκεκριμένης εγγραφής θα περνάει σε διαφορετικό κάθε φορά textbox της φόρμας που ανοίγει. Άρα για να δουλέψει με τον συγκεκριμένο τρόπο, φαντάζομαι δεν θα χρειαστεί να κάνω split την OpemArgs, δηλαδή θα έχω Private Sub Form_Load() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then Me.txtArgs1 = MyValues(0) End If End Sub Στην περίπτωσή μου όμως το txtArgs1 δεν είναι το ίδιο κάθε φορά. Όσες επιλογές έχω στο σύνθετο πλαίσιο της αρχικής φόρμας, τόσα text boxes έχω στην φόρμα που ανοίγει και όπως ανέφερα η μεταφορά γίνεται με if γιατί δεν υπάρχει διασύνδεση textboxes με τις τιμές του σύνθετου πλαισίου. Συνεπώς, δεν θα δουλέψει το onLoad event γιατί θα ανοίγει αρχικά η εκάστοτε φόρμα αλλά θα περνάνε συνέχεια τιμές και μετά την φόρτωση. Άρα, φαντάζομαι θα χρησιμοποιήσω afterupdate event για την φόρμα που ανοίγει και θα βάλω εκεί μέσα τα if. Δηλαδή, Private Sub Form_After_Update() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then if forms!arxikh_forma.combobox_arxikhs_formas = ΤΑΜ1 then Me.k1= MyValues(0) End If else if forms!arxikh_forma.combobox_arxikhs_formas = ΤΑΜ2 then Me.k2= MyValues(0) End If κτλ End Sub Θα δουλέψει με αυτόν τον τρόπο? Ευχαριστώ πολύ |
#15
| ||||
| ||||
Καλημέρα Παντελή! Στην αρχική φόρμα βάλε το εξής: Κώδικας: Private Sub Combo_AfterUpdate() Dim FormOpemArgs$, TargetTextBoxName$ If IsNull(Me.OptWeekDays) And Not IsNull(Me.Combo) Then Exit Sub Select Case Me.Combo Case "ΤΑΜ1" TargetTextBoxName = "k1" Case "ΤΑΜ2" TargetTextBoxName = "k2" Case "ΤΑΜ3" TargetTextBoxName = "k3" Case "ΤΑΜ4" TargetTextBoxName = "k4" 'κοκ...... 'Case Else 'TargetTextBoxName = "...κάτι άλλο" End Select FormOpemArgs = Me.Eponymo & ";" & TargetTextBoxName & ";" & Me.Combo strForname = Choose(Me.OptWeekDays, "MON", "TUS", "WED", "THU") DoCmd.OpenForm strForname, , , , , , FormOpemArgs End Sub Κώδικας: Private Sub Form_Load() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then MyValues = Split(Me.OpenArgs, ";") 'Me.Eponymo & ";" & TargetTextBoxName & ";" & Me.Combo Me.eponymo = MyValues(0) Me.Controls(MyValues(1)) = MyValues(2) End If End Sub Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#16
| |||
| |||
Απ' ότι κατάλαβα: Ο κώδικας του after_update στο combobox της αρχικής φόρμας αποθηκεύει στην μεταβλητή FormOpemArgs: - την τρέχουσα τιμή στο Επώνυμο, -την τιμή που αντιστοιχεί στην επιλογή του combobox, η οποία τιμή είναι ουσιαστικά το όνομα του textbox της φόρμας που ανοίγει, στο οποίο θέλω να μπει το Επώνυμο και -την τιμή του combobox.(Αν και δεν νομίζω να χρειάζεται). Στο onLoad της φόρμας που ανοίγει, διαχωρίζουμε τις τιμές της FormOpemArgs μέσω του κώδικα: MyValues = Split(Me.OpenArgs, ";") Το πεδίο eponymo του κώδικα: Me.eponymo = MyValues(0) δεν υπάρχει κάπου στην φόρμα που ανοίγει και δεν κατάλαβα πως λειτουργεί το me.controls ως εξής: Me.Controls(MyValues(1)) = MyValues(2) Η επιλογή που θα κάνω στο combobox δεν σχετίζεται με κάποιο δεδομένο. Απλά θέλω όταν επιλέξω πχ ΤΑΜ1 από το combobox στην αρχική φόρμα, να ανοίξει η φόρμα που είναι να ανοίξει και το τρέχον επώνυμο της αρχικής φόρμας να μπει στο textbox k1 της νέας φόρμας. Για ΤΑΜ2 αντιστοίχως στο k2 κτλ. Επομένως, έχουμε πχ στην φόρμα MON 4 textboxes με ονομασιές k1, k2, k3 και k4. Σε αυτά τα textboxes θα μπει στο καθένα ένα επώνυμο. Στην αρχική φόρμα, έχουμε βάλει για παράδειγμα όταν επιλέξω από το combo την τιμή ΤΑΜ1, να αποθηκευτούν στην FormOpemArgs πχ το Επώνυμο ΖΑΖΑΡΙΑΔΗΣ και το όνομα του textbox στο οποίο πρέπει να μπει - δηλαδή το k1. Όταν ανοίγει η φόρμα MON, θα πρέπει να γράψω για παράδειγμα MyValues = Split(Me.OpenArgs, ";") και μετά να ανιχνευτεί το που βρίσκεται το k1 στη νέα φόρμα και να περαστεί το Επώνυμο ΖΑΖΑΡΙΑΔΗΣ σε αυτό το πεδίο. Συνεπώς, μήπως έπρεπε να αποθηκεύω σε μία μεταβλητή το όνομα του textbox που μεταφέρω στην μεταβλητή myValues(1) και να το βάλω ίσο με το myValues(0) που είναι το επώνυμο? Δηλαδή dim strCombobx as string strCombobx = myValues(1) me.strCombobx = myValues(0) ? |
#17
| ||||
| ||||
Παντελή, αν κατάλαβα καλά τότε στην αρχική φόρμα βάζεις: Κώδικας: Private Sub Combo_AfterUpdate() Dim FormOpemArgs$, TargetTextBoxName$ If IsNull(Me.OptWeekDays) And Not IsNull(Me.Combo) Then Exit Sub Select Case Me.Combo Case "ΤΑΜ1" TargetTextBoxName = "k1" Case "ΤΑΜ2" TargetTextBoxName = "k2" Case "ΤΑΜ3" TargetTextBoxName = "k3" Case "ΤΑΜ4" TargetTextBoxName = "k4" 'κοκ...... Case Else TargetTextBoxName = "...KapoioAlloPedio" End Select FormOpemArgs = TargetTextBoxName & ";" & Me.eponymo strForname = Choose(Me.OptWeekDays, "MON", "TUS", "WED", "THU") DoCmd.OpenForm strForname, , , , , , FormOpemArgs End Sub Κώδικας: Private Sub Form_Load() Dim MyValues() As String If Not IsNull(Me.OpenArgs) Then MyValues = Split(Me.OpenArgs, ";") 'TargetTextBoxName & ";" & Me.eponymo Me.Controls(MyValues(0)) = MyValues(1) End If End Sub και MyValues(1) = Eponymo Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
#18
| ||||
| ||||
Νομίζω πως είναι πιο ευέλικτο να διαχειρίζεται η ίδια η φόρμα/στόχος τα χειριστήριά της και όχι η αρχική. Στο παράδειγμα που ανεβάζω, η αρχική φόρμα περνάει στην OpenArgs της φόρμας/στόχος το ListIndex του Combobox και το επώνυμο Κώδικας: Private Sub cmbCash_AfterUpdate() Dim strArgs As String With Me If Not IsNull(.cmbDay) Then If Not IsNull(.cmbCash) Then strArgs = CStr(.cmbCash.ListIndex) & ";" & .cmbLName DoCmd.OpenForm .cmbDay, , , , , , strArgs End If End If End With End Sub Για παράδειγμα, ο κώδικας της φόρμας της Δευτέρας έχει ως εξής: Κώδικας: Private Sub Form_Load() Dim astrArgs() As String Dim strCtrl As String If Not IsNull(Me.OpenArgs) Then astrArgs() = Split(Me.OpenArgs, ";") On Error Resume Next strCtrl = Array("Mon1", "Mon2", "Mon3", "Mon4")(astrArgs(0)) Me.Controls(strCtrl) = astrArgs(1) End If End Sub Κώδικας: strCtrl = Array("Tus1", "Tus2", "Tus3", "Tus4")(astrArgs(0)) Γιάννης Υ.Γ. Μια ακόμα καλύτερη-κατά τη γνώμη μου-μέθοδο θα ήταν η δημιουργία διαδικασιών ιδιοτήτων στην αρχική φόρμα από τις οποίες θα διάβαζαν οι φόρμες/στόχοι τα ορίσματα, ανανεωμένα και οποιαδήποτε στιγμή.
__________________ Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...! ----------------------------------------------- Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης. Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά! |
#19
| |||
| |||
Λειτουργεί μια χαρά σύμφωνα με την προ-τελευταία απάντηση, αλλά λειτουργεί μόνο για την πρώτη τιμή - δηλαδή μόνο για το πρώτο afterupdate. Για το update που κάνω στο επόμενο combobox δεν περνάει η τιμή. Υποθέτω ότι φταίει το ότι ο κώδικας είναι στο onLoad event της φόρμας. Περνάει την πρώτη τιμή στη φόρτωση αλλά μετά έχει ήδη φορτώσει και δεν περνάει τις επόμενες. Καμιά πρόταση για να τοποθετηθεί ο κώδικας σε άλλο event της φόρμας? Και μία άλλη ερώτηση.. Μερικές τιμές από την αρχική φόρμα θέλω να τις κάνω add item σε μερικές λίστες. Πως θα μπορούσα να δουλέψω με αυτή την περίπτωση? Θα μπορούσα ας πούμε να βάλω: Case "TAM5" TargetTextBoxName = "k5" & "." & "AddItem" ? Τελευταία επεξεργασία από το χρήστη pm4698 : 19-03-10 στις 18:20. |
#20
| ||||
| ||||
Καλησπέρα! Η αρχή λειτουργίας είναι απλή. Περνάς όσες τιμές θέλεις στην OpenArgs και κατόπιν αφου τις περάσεις στο Array MyValues() στη φόρμα προορισμού, μπορείς να τις κατανείμεις στα πεδία που θέλεις. Τάσος
__________________ Ms-Office Development Team Ανάπτυξη επαγγελματικών εφαρμογών |
Ετικέτες |
events, openargs, raiseevent, withevents, ορίσματα, συμβάντα |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
[ Φόρμες ] Αντιγραφή αντικειμένου φόρμας σε αντικείμενο άλλης φόρμας | zinocrotale | Access - Ερωτήσεις / Απαντήσεις | 3 | 18-04-13 18:35 |
Ενημέρωση Πεδίου Δευτερεύουσας Φόρμας μέσω Βοηθητικής Φόρμας | Χρήστος | Access - Ερωτήσεις / Απαντήσεις | 1 | 17-04-12 19:18 |
Επιλογή "άκυρο" σε μήνυμα με το κλείσιμο της φόρμας Βackup | alex | Access - Ερωτήσεις / Απαντήσεις | 3 | 14-03-12 11:52 |
[Συναρτήσεις] Επιλογή αριθμών | gpentez | Excel - Ερωτήσεις / Απαντήσεις | 2 | 10-03-12 08:56 |
[ Active X Controls ] Επιλογή ημερομηνίας από Active X και αυτόματη ενημέρωση φόρμας | Χρήστος | Access - Ερωτήσεις / Απαντήσεις | 14 | 31-12-10 17:06 |
Η ώρα είναι 20:02.