Forum

Forum (https://www.ms-office.gr/forum/)
-   Access - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/)
-   -   Επιλογή φόρμας (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/472-epilogi-formas.html)

pm4698 03-03-10 10:58

Επιλογή φόρμας
 
Καλησπέρα σας!
Έχω το εξής:
Θέλω να πατάω ένα κουμπί και να μου εμφανίζει ένα MsgBox από το οποίο θα έχω 4 επιλογές (το κείμενο και δίπλα σε κάθε κείμενο ένα checkbox). Κάθε επιλογή αντιστοιχεί σε και σε μία φόρμα.
Με το που επιλέγω ένα checkbox τότε θέλω το όνομα της αντίστοιχης φόρμας να αποθηκεύεται σε ένα string για παράδειγμα και έπειτα, αυτό το string να το χρησιμοποιήσω για το άνοιγμα της φόρμας.

Ένα στο περίπου παράδειγμα είναι το εξής:

'public strInput As String 'Καταχώρηση ονόματος
Private button_name_Click()


Dim strInput1 As CheckBox 'Επιλογή 1ης φόρμας
Dim strInput2 As CheckBox 'Επιλογή 2ης φόρμας
Dim strInput3 As CheckBox 'Επιλογή 3ης φόρμας
Dim strInput4 As CheckBox 'Επιλογή 4ης φόρμας
φόρμας
Dim strMsg As String

Beep
strMsg = "Παρακαλώ, επιλέξτε την φόρμα που θέλετε να ανοίξετε"
MsgBox "Φόρμα1" & vbCrLf & vbLf & strInput1 & _
"Φόρμα2" & vbCrLf & vbLf & strInput2 & _
"Φόρμα3" & vbCrLf & vbLf & strInput3 & _
"Φόρμα4" & vbCrLf & vbLf & strInput4 & _
"", _
vbInformation, "Επιλογή φόρμας"

strInput = InputBox(Prompt:=strMsg, title:="Επιλογή φόρμας στοιχείων")

if me.strInput1.value= true then
strInput = "Φόρμα1 & "'"
else if me.strInput2.value= true then
strInput = "Φόρμα2 & "'"
else if me.strInput3.value= true then
strInput = "Φόρμα3 & "'"
else if me.strInput4.value= true then
strInput = "Φόρμα4 & "'"
end if
end if
end if
end if

end sub

Άρα στην μεταβλητή strInput θα αποθηκεύεται κάθε φορά το όνομα της φόρμας που θέλω.
Έπειτα όταν θέλω να την ανοίξω θα γράφω:
DoCmd.OpenForm "strInput", , , , , ,

Γίνεται κάτι τέτοιο?
Αν ναι, η σύνταξη του κώδικα που έχω γράψει είναι σωστή?

Ευχαριστώ εκ των προτέρων

Tasos 03-03-10 12:38

1 Συνημμένο(α)
Γεια σας!

Αγαπητέ φίλε Παντελή,
στο ζητούμενο σου θα σου πρότεινα μια διαφορετική προσέγγιση (βλ. συνημμένο).

Με εκτίμηση

Τάσος

mike04 03-03-10 21:25

1 Συνημμένο(α)
Καλησπέρα σε όλους.

Φίλε Παντελή πιστεύω πως το συνημμένο αρχείο είναι αυτό που ψάχνεις.

Υ.Γ. Θα πρέπει στον πίνακα Switchboard Items στην στήλη Argument να γράψεις το όνομα της φόρμας που θες να ανοίγει πατώντας την επιλογή αυτή.

Φιλικά Μιχάλης.

pm4698 07-03-10 19:40

Αυτό που θέλω είναι, να έχω για παράδειγμα 5 επιλογές. Όταν επιλέγω την πρώτη, να αποθηκεύεται σε ένα Public string η ονομασία της φόρμας που επέλεξα και να μην ανοίγει επιτόπου. Θα ανοίγει όταν την καλώ μέσα σε συνάρτηση με εντολή:
DoCmd.OpenForm "strInput", , , , , ,
όπου strInput Θα είναι η ονομασία της φόρμας που επέλεξα.
Ουσιαστικά χρησιμοποιώ το DoCmd.OpenForm "name_of_form", , , , , ,
Θέλω να μην ανοίγει σταθερά μία φόρμα αλλά να μπορώ να αλλάξω το όνομα της φόρμας ανάλογα με αυτό που θέλω να κάνω κάθε φορά.
Πιστεύω ότι ο κώδικας που έχω στο πρώτο post αντιπροσωπεύει αυτό που θέλω να κάνω.

pm4698 16-03-10 08:09

Δοκίμασα αυτό:

Option Compare Database
Dim strGeneralFormName As String

Private Sub button_Click()

On Error GoTo Err_button_Click

Dim intFormNumber As Integer

MsgBox "Για Δευτέρα πληκτρολογήστε το 1" & vbCrLf & vbLf & strInput1 & _
"Για Τρίτη πληκτρολογήστε το 2" & vbCrLf & vbLf & strInput2 & _
"Για Τετάρτη πληκτρολογήστε το 3" & vbCrLf & vbLf & strInput3 & _
"Για Πέμπτη πληκτρολογήστε το 4" & vbCrLf & vbLf & strInput4 & _
"", _
vbInformation, "Επιλογή φόρμας..."

intFormNumber = InputBox("Παρακαλώ πληκτρολογήστε έγκυρο αριθμό από το 1-4")

Select Case intFormNumber

Case Is = 1
strGeneralFormName = "MON"
Case Is = 2
strGeneralFormName = "TUS"
Case Is = 3
strGeneralFormName = "WED"
Case Is = 4
strGeneralFormName = "THU"
End Select

Exit_button_Click:
Exit Sub

Err_button_Click:
MsgBox Err.Description
Resume Exit_button_Click

End Sub

Επομένως πατώντας το κουμπί, θα αποθηκεύεται στην μεταβλητή strGeneralFormName το όνομα της φόρμας που επέλεξε ο χρήστης. Στη συνέχεια, θέλω η φόρμα που αποθηκεύτηκε σε αυτή τη μεταβλητή να ανοίγει στο after update του combobox από την εντολή:

DoCMD.OpenForm strGeneralFormName, , , , , , Me.Name & ";" & Me.combobox

αλλα μου βγάζει πρόβλημα ότι πρέπει να βάλω το όνομα κάποιας φόρμας στη θέση της μεταβλητής

Σημείωση: Η σύνταξη της τελευταίας γραμμής κώδικα θέλω να παραμείνει.
Δεν μπορώ δηλαδή να χρησιμοποιήσω απλά τον κώδικα:

DoCmd.OpenForm strGeneralFormName

Καμιά ιδέα?

Ευχαριστώ εκ των προτέρων

editolis 16-03-10 14:36

Κατα την γνωμη μου με αυτο τον "δρομο" που εχεις διαλεξει
πρεπει να δημιουργησεις ενα πινακα
που να εχει μεσα ολες τις παραμετρους σου και απο εκει
να ανοιγεις της φορμες σου αναλογως με αυτο που θελεις.

Καλη συνεχεια.

Tasos 16-03-10 17:04

1 Συνημμένο(α)
Καλησπέρα σε όλους!

Αγαπητέ Παντελή,

Δες ακόμα μια πρόταση που κάνει αυτά που περιγράφεις.

Με εκτίμηση

Τάσος

pm4698 17-03-10 11:47

Μου εμφανίζει κάποιο πρόβλημα λάθους σε περαιτέρω κομμάτι κώδικα.

Ο κώδικας είναι του στυλ forms!strFormName.combobox = me.textbox.value και μου βγάζει πρόβλημα ότι θέλει όνομα φόρμας στο forms!strFormName.

Καμιά ιδέα?

Tasos 17-03-10 12:48

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

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

Διαφώτισε μας στο σημείο αυτό.

Φιλικά

Τάσος

pm4698 17-03-10 15:19

Ο τρόπος λειτουργίας είναι αυτός που περιγράφεται στο topic:

http://www.ms-office.gr/forum/access...-se-forma.html

μέχρι και το 5ο reply.

Αυτό που προσπαθώ να κάνω είναι στο
docmd.openform nameform κτλ
αλλά και σε κώδικα του τύπου:
Forms!frm2.text1 = Me.Name.Value
να αναφέρομαι στην φόρμα ως μεταβλητή.

Δηλαδή να επιλέγει ο χρήστης αρχικά το ποια φόρμα θα χρησιμοποιήσει και να χρησιμοποιείται πιο μετά σε σημεία τύπου:

DoCMD.OpenForm "frm2" , , , , , , Me.Name & ";" & Me.cbox1
και
Forms!frm2.text1 = Me.Name.Value

έτσι ώστε εάν θέλω να επιλέξω άλλη φόρμα να ανοίξει να είναι ¨ευέλικτος¨ ο κώδικας και να προσαρμόζεται σε άλλη φόρμα.

Tasos 17-03-10 16:07

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

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

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

Φιλικά
Τάσος

pm4698 18-03-10 08:43

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

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

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

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

Ευχαριστώ για την βοήθεια!

Tasos 18-03-10 13:45

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

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

Φιλικά

Τάσος

pm4698 19-03-10 09:13

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

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

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

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

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

Θα δουλέψει με αυτόν τον τρόπο?

Ευχαριστώ πολύ

Tasos 19-03-10 10:24

Καλημέρα Παντελή!
Στην αρχική φόρμα βάλε το εξής:
Κώδικας:

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

Φιλικά

Τάσος

pm4698 19-03-10 11:51

Απ' ότι κατάλαβα:
Ο κώδικας του 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)
?

Tasos 19-03-10 12: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 = "...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

Τάσος

nisgia 19-03-10 15:52

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

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

Γιάννης

Υ.Γ.
Μια ακόμα καλύτερη-κατά τη γνώμη μου-μέθοδο θα ήταν η δημιουργία διαδικασιών ιδιοτήτων στην αρχική φόρμα
από τις οποίες θα διάβαζαν οι φόρμες/στόχοι τα ορίσματα, ανανεωμένα και οποιαδήποτε στιγμή.

pm4698 19-03-10 17:01

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

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

Tasos 19-03-10 17:52

Καλησπέρα!

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

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


Τάσος

pm4698 20-03-10 10:45

Μου φαίνεται ότι κατάλαβα πλήρως τον τρόπο με τον οποίο δουλεύει.
Πέτυχα και αυτό με την προσθήκη τιμής σε λίστα.

Αν κατάλαβα καλά όμως, οι μεταβλητές περνιούνται στο onload event και απ'ότι διάβασα η φόρμα γίνεται load μόνο όταν ανοίγει. Άρα, πλην της τιμής του πρώτου combobox που περνιέται, οι τιμές των υπολοίπων comboboxes δεν περνιούνται.

Πως μπορώ να κάνω με κάποιον τρόπο κάθε φορά, reload την φόρμα για να περνιούνται οι νέες τιμές?

Tasos 20-03-10 18:45

1 Συνημμένο(α)
Καλησπέρα!

Αγαπητέ Παντελή, δες ένα απλό παράδειγμα στο συνημμένο.

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

Φιλικά

Τάσος

pm4698 20-03-10 21:28

1 Συνημμένο(α)
Αυτό που θέλω περιγράφεται από το δείγμα που βρίσκεται στο συνημμένο.
Στην φόρμα ΣΕΝΤΟΝΙ ο χρήστης επιλέγει αρχικά ή το Καθημερινή ή το Σάββατο.
Ουσιαστικά επιλέγει ποια μέρα θα ανοίξει(Σε πλήρη έκδοση έχει όλες τις μέρες και περισσότερες επιλογές στα combo boxes).

Όταν πάει σε ένα combobox και επιλέξει κάτι, τότε ανοίγει η αντίστοιχη φόρμα και αποθηκεύεται η τιμή που θέλουμε. Αν πάμε όμως να επιλέξουμε για άλλο όνομα μία τιμή στο combobox αυτή η τιμή δεν μεταφέρεται στην φόρμα, γιατί ο κώδικας πίσω από την φόρμα είναι στο onLoad event. Έτσι την πρώτη φορά που φορτώνει περνά την μεταβλητή, αλλά τις επόμενες έχει ήδη φορτώσει και δεν περνάει τίποτα.

Γι' αυτό έλεγα μήπως γινόταν κάπως να γίνεται κάτι σαν reload της φόρμας που ανοίγει

Tasos 20-03-10 22:23

Καλησπέρα και πάλι!
Παντελή απ ότι κατάλαβα, θέλεις να περνάς περισσότερες τιμές στις φόρμες
ΥΠ_ΣΑΒ και ΥΠ_ΚΑΘ που επιλέγεις από την αρχική φόρμα ΣΕΝΤΟΝΙ
ανεξάρτητα από την τρέχουσα κατάσταση τους (ανοιχτές ή κλειστές).

Τότε έτσι:

Κώδικας:

Private Sub Υπηρεσία1_AfterUpdate()
      Dim FormOpemArgs$, TargetTextBoxName$
      If IsNull(Me.OptWeekDays) And Not IsNull(Me.Υπηρεσία1) Then Exit Sub
      Select Case Me.Υπηρεσία1
          Case "ΤΑΜ1"
              TargetTextBoxName = "k1"
          Case "ΤΑΜ2"
              TargetTextBoxName = "k2"
          Case "ΤΑΜ3"
              TargetTextBoxName = "k3"
      End Select
      strForname = Choose(Me.OptWeekDays, "ΥΠ_ΚΑΘ", "ΥΠ_ΣΑΒ")
     
      If IsOpen(strForname) Then
          Forms(strForname).Controls(TargetTextBoxName) = Me.Επώνυμο
          Exit Sub
      Else
          FormOpemArgs = TargetTextBoxName & ";" & Me.Επώνυμο
          DoCmd.OpenForm strForname, , , , , , FormOpemArgs
      End If
    End Sub

Function IsOpen(FormName$) As Boolean
    If SysCmd(10, 2, FormName) <> 0 Then
        If Forms(FormName).CurrentView = 1 Then IsOpen = True
    End If
End Function

Ακολουθώντας την προσέγγιση που επέλεξες, ίσως να ήταν καλύτερα να έχεις τις φόρμες εξαρχής ανοιχτές και να χρησιμοποιήσεις μονο το:

Κώδικας:

Forms(strForname).Controls(TargetTextBoxName) = Me.Επώνυμο
Φιλικά

Τάσος

nisgia 21-03-10 14:28

Κοινοποίηση και σύληψη δημόσιων συμβάντων φόρμας
 
1 Συνημμένο(α)
Καλησπέρα guys!

Ένας ακόμη τρόπος να γίνει το ζητούμενο είναι και η χρήση εξειδικευμένων συμβάντων (events).

Δηλαδή στην ενότητα δηλώσεων της αρχικής φόρμας έχουμε την εξής δήλωση:
Κώδικας:

Option Compare Database
Option Explicit

Public Event CashAfterUpdate(ByVal FormName As String, _
        ByVal ControlName As String, ByVal LastName As String)

Ενώ η διαδικασία συμβάντος Υπηρεσία1_AfterUpdate μετατρέπεται σε:
Κώδικας:

Private Sub Υπηρεσία1_AfterUpdate()

    Dim strFormName As String
    Dim strCtrlName As String
    Dim strLastName As String

    If Not IsNull(Me.OptWeekDays) Then
        If Not IsNull(Me.Υπηρεσία1) Then
            strFormName = Choose(Me.OptWeekDays, "ΥΠ_ΚΑΘ", "ΥΠ_ΣΑΒ")
            strCtrlName = Array("k1", "k2", "k3")(Me.Υπηρεσία1.ListIndex)
            DoCmd.OpenForm strFormName
            RaiseEvent CashAfterUpdate(strFormName, strCtrlName, Me.Επώνυμο)
            Me.SetFocus
        End If
    End If
End Sub

Από την πλευρά των φορμών "ημέρας" έχουμε:
Κώδικας:

Option Compare Database
Option Explicit

Private WithEvents MainForm As Form_ΣΕΝΤΟΝΙ
'
Private Sub Form_Load()
    Set MainForm = Forms("ΣΕΝΤΟΝΙ")
End Sub

Private Sub MainForm_CashAfterUpdate(ByVal FormName As String, _
        ByVal ControlName As String, ByVal LastName As String)

    If Me.Name = FormName Then
        On Error Resume Next
        Me.Controls(ControlName) = LastName
    End If
End Sub
'
'...More code here...
'

Στο συνημμένο θα βρείτε και την πρακτική εφαρμογή της παραπάνω θεωρίας. :021:

Υ.Γ.
Πάντως φίλε Παντελή, αν συνεχίσεις να δίνεις ελληνικά ονόματα στα αντικείμενα της Access,
...δεν θα τα πάμε καθόλου καλά! :hit:

pm4698 21-03-10 19:15

Όσον αφορά τη λύση του Τάσου μου λειτουργεί πολύ καλά!
Απλά για να ξέρουν και οι αναγνώστες στη θέση του
If IsOpen(strForname) Then
χρησιμοποίησα το
If CurrentProject.AllForms(strForname).IsLoaded Then

Κατά τ'άλλα μια χαρά.
Για την προσθήκη ενός Επωνύμου σε λίστα χρησιμοποιώ το:
If TargetTextBoxName = "list1" Or TargetTextBoxName = "list2" Then
Forms(strForname).Controls(TargetTextBoxName).AddI tem Me.Επώνυμο
Else: Forms(strForname).Controls(TargetTextBoxName) = Me.Επώνυμο

Και το αντίστοιχο στο onLoad της φόρμας που ανοίγει.

Θα δοκιμάσω και τον κώδικα του nisgia και θα πω τις εντυπώσεις μου!

Σας ευχαριστώ για τον χρόνο σας!

Tasos 21-03-10 20:26

Παντελή καλησπέρα!
Σε καμία περίπτωση δεν θα δούλευε η IsOpen() αφού (δικό μου λάθος) παρέλειψα να
συμπεριλάβω τη συνάρτηση αυτή στο μήνυμα!

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

Κώδικας:

Function IsOpen(FormName$) As Boolean
      If SysCmd(10, 2, FormName) <> 0 Then
          If Forms(FormName).CurrentView = 1 Then IsOpen = True
      End If
  End Function


pm4698 13-05-10 09:38

Καλημέρα στην κοινότητα! Έχω μία απορία - προέκταση του συγκεκριμένου θέματος.
Θέλω όταν η φόρμα της ημέρας είναι κλειστή, να πατάω ένα κουμπί και να πηγαίνει σε όλες τις εγγραφές του πεδίου Υπηρεσία1 της συνεχούς φόρμας και να κάνει ουσιαστικά requery τον παρακάτω κώδικα.

DoCmd.GoToRecord , , acFirst


Dim FormOpemArgs$, TargetTextBoxName$
If IsNull(Me.OptWeekDays) And Not IsNull(Me.Υπηρεσία1) Then Exit Sub
Select Case Me.Υπηρεσία1
Case "ΤΑΜ1"
TargetTextBoxName = "k1"
Case "ΤΑΜ2"
TargetTextBoxName = "k2"
Case "ΤΑΜ3"
TargetTextBoxName = "k3"
End Select
strForname = Choose(Me.OptWeekDays, "ΥΠ_ΚΑΘ", "ΥΠ_ΣΑΒ")

' Προυπόθεση είναι ότι η φόρμα είναι κλειστή
Forms(strForname).Controls(TargetTextBoxName) = Me.Επώνυμο

'Η φόρμα έχει ήδη ανοίξει από την προηγούμενη γραμμή κώδικα
Do While Me.CurrentRecord - 1 < Me.RecordsetClone.RecordCount
FormOpemArgs = TargetTextBoxName & ";" & Me.Επώνυμο
DoCmd.OpenForm strForname, , , , , , FormOpemArgs
End If

DoCmd.GoToRecord , , acNext
Loop

Επειδή οι εγγραφές που περνούν στην φόρμα που ανοίγει δεν αποθηκεύονται κάπου όταν αυτή κλείνει, σε περίπτωση λάθους που πρέπει να αλλάξει κάτι θέλω με το πάτημα ενός κουμπιού να περνιούνται όλα τα combo boxes Υπηρεσία1 και να εκτελείται ο κώδικας από πίσω τους έτσι ώστε να ανοίγει πρώτα η φόρμα για να περνάει η πρώτη εγγραφή και μετά εφόσον έχει ανοίξει να περνούν και οι υπόλοιπες.

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

DoCmd.GoToRecord , , acNext

Καμιά ιδέα?

Ευχαριστώ

Giorgos 14-05-10 09:56

Dim mnm As Variant
Dim mnma As String
Dim Minas As Integer, Etos As Integer


mnma = "Καταχωρήστε:" & vbCrLf & vbCrLf & _
"1 = Εκτύπωση Φορμα1 " & vbCrLf & vbCrLf & _
"2 = Εκτύπωση Φορμα2" & vbCrLf & vbCrLf & _
"3 = Εκτύπωση Φορμα3" & vbCrLf & vbCrLf & _
"4 = Εκτύπωση Φορμα4" & vbCrLf & vbCrLf & _
"5 = Εκτύπωση Φορμα5" & vbCrLf & vbCrLf & _
"6 = Εκτύπωση Φορμα6"

arxi:

mnm = InputBox(mnma, "Επιλογές")

If mnm = "" Then Exit Sub

If IsNumeric(mnm) = False Then
MsgBox "Εσφαλμένη καταχώρηση", vbInformation, "Σφάλμα"
GoTo arxi
End If

If mnm > 6 Or mnm < 1 Then
MsgBox "Εσφαλμένη καταχώρηση", vbInformation, "Σφάλμα"
GoTo arxi
End If


If mnm = 1 Then DoCmd.OpenForm "Φορμα1", acNormal, "", "", acFormEdit, acWindowNormal
If mnm = 2 Then DoCmd.OpenForm "Φορμα2", acNormal, "", "", acFormEdit, acWindowNormal
If mnm = 3 Then DoCmd.OpenForm "Φορμα3", acNormal, "", "", acFormEdit, acWindowNormal
If mnm = 4 Then DoCmd.OpenForm "Φορμα4", acNormal, "", "", acFormEdit, acWindowNormal
If mnm = 5 Then DoCmd.OpenForm "Φορμα5", acNormal, "", "", acFormEdit, acWindowNormal
If mnm = 6 Then DoCmd.OpenForm "Φορμα6", acNormal, "", "", acFormEdit, acWindowNormal

Δες και αυτό
Γιώργος


Η ώρα είναι 11:46.

Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.


Search Engine Optimization by vBSEO 3.3.2