Ανανέωση ιστοσελίδας

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

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

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #11  
Παλιά 17-03-10, 17:07
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.011
Προεπιλογή

Στο παράδειγμα μου, οι φόρμες ανοίγουν με τη γραμμή:

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

Στο συνημμένο αρχείο είναι ένα δείγμα της εφαρμογής μου.

Στην φόρμα "ΣΕΝΤΟΝΙ" στο after update του σύνθετου πλαισίου έχω δείγμα του κώδικα που χρησιμοποιούσα πριν, σε μορφή σχολίων και ο καινούργιος είναι από πάνω.

Δεν μπορώ να καταλάβω πως θα μπορούσα να εφαρμόσω το .openArgs στο παράδειγμά μου.
Είναι σαν να πρέπει να μεταφέρω όλο τον κώδικα από το after update του σύνθετου πλαισίου στο on load event της φόρμας που ανοίγει - κάτι που δεν βολεύει γιατί έχω πολλά σύνθετα πλαίσια.

Συγχωρέστε με αν η λύση που μου πρότεινε ο Τάσος μου κάνει και δεν το κατάλαβα - αλλά δεν είμαι ειδικός στην VBA

Ευχαριστώ για την βοήθεια!
Συνημμένα Αρχεία
Τύπος Αρχείου: zip Δοκιμαστικό.zip (460,2 KB, 19 εμφανίσεις)
Απάντηση με παράθεση
  #13  
Παλιά 18-03-10, 14:45
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.011
Προεπιλογή

Καλημέρα Παντελή,

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

Τάσο καλημέρα,

Μου έδωσες να καταλάβω πολύ καλά πως δουλεύει η μεταβλητή του παραδείγματος!

Συνειδητοποίησα ότι δεν χρειάζεται τελικά να περάσω δύο μεταβλητές στην φόρμα που ανοίγω αλλά μία - μόνο το Επώνυμο.

Δηλαδή, θα έχω

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

Καλημέρα Παντελή!
Στην αρχική φόρμα βάλε το εξής:
Κώδικας:
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
Και στο OnLoad των φορμών που θέλεις να ανοίξεις βάλε:

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

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

Παντελή, αν κατάλαβα καλά τότε στην αρχική φόρμα βάζεις:

Κώδικας:
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(0) ) = πχ. K1
και MyValues(1) = Eponymo

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #18  
Παλιά 19-03-10, 16:52
Το avatar του χρήστη nisgia
Super Moderator
Όνομα: Γιάννης
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 12-10-2009
Περιοχή: Ηγουμενίτσα
Μηνύματα: 161
Προεπιλογή

Νομίζω πως είναι πιο ευέλικτο να διαχειρίζεται η ίδια η φόρμα/στόχος τα χειριστήριά της και όχι η αρχική.

Στο παράδειγμα που ανεβάζω, η αρχική φόρμα περνάει στην 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))
Δείτε και το αποτέλεσμα στο συνημμένο και τα ξαναλέμε...

Γιάννης

Υ.Γ.
Μια ακόμα καλύτερη-κατά τη γνώμη μου-μέθοδο θα ήταν η δημιουργία διαδικασιών ιδιοτήτων στην αρχική φόρμα
από τις οποίες θα διάβαζαν οι φόρμες/στόχοι τα ορίσματα, ανανεωμένα και οποιαδήποτε στιγμή.
Συνημμένα Αρχεία
Τύπος Αρχείου: zip OpenForms.zip (20,4 KB, 24 εμφανίσεις)
__________________
Αν δεν το ρωτούσες, δεν θα το μαθαίναμε ποτέ...!
-----------------------------------------------
Τελικά η γνώση, αντίθετα με ό,τι μέχρι σήμερα πίστευα, είναι η φυλακή της σκέψης.
Όταν η αφετηρία είναι η ελεύθερη σκέψη, δεν χρειάζεται πλέον να φτάσεις πουθενά!
Απάντηση με παράθεση
  #19  
Παλιά 19-03-10, 18:01
Όνομα: Παντελής
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 18-02-2010
Περιοχή: Καβάλα
Μηνύματα: 54
Προεπιλογή

Λειτουργεί μια χαρά σύμφωνα με την προ-τελευταία απάντηση, αλλά λειτουργεί μόνο για την πρώτη τιμή - δηλαδή μόνο για το πρώτο afterupdate.
Για το update που κάνω στο επόμενο combobox δεν περνάει η τιμή.
Υποθέτω ότι φταίει το ότι ο κώδικας είναι στο onLoad event της φόρμας. Περνάει την πρώτη τιμή στη φόρτωση αλλά μετά έχει ήδη φορτώσει και δεν περνάει τις επόμενες.
Καμιά πρόταση για να τοποθετηθεί ο κώδικας σε άλλο event της φόρμας?

Και μία άλλη ερώτηση..
Μερικές τιμές από την αρχική φόρμα θέλω να τις κάνω add item σε μερικές λίστες. Πως θα μπορούσα να δουλέψω με αυτή την περίπτωση?
Θα μπορούσα ας πούμε να βάλω:
Case "TAM5"
TargetTextBoxName = "k5" & "." & "AddItem" ?

Τελευταία επεξεργασία από το χρήστη pm4698 : 19-03-10 στις 18:20.
Απάντηση με παράθεση
  #20  
Παλιά 19-03-10, 18:52
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.011
Προεπιλογή

Καλησπέρα!

Η αρχή λειτουργίας είναι απλή.

Περνάς όσες τιμές θέλεις στην OpenArgs και κατόπιν αφου τις περάσεις στο Array MyValues() στη φόρμα προορισμού, μπορείς να τις κατανείμεις στα πεδία που θέλεις.


Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
Απάντηση στο θέμα

Ετικέτες
events, openargs, raiseevent, withevents, ορίσματα, συμβάντα


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

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


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

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