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/1704-anoigma-formas-kai-amesi-metabasi-se-sygkekrimeni-eggrafi.html)

sakis297 06-03-12 11:46

Άνοιγμα φόρμας και άμεση μετάβαση σε συγκεκριμένη εγγραφή.
 
Γεια σας και πάλι!!!
Έχω μία φόρμα που την ονομάζω "pelates" και στην οποία δεν επιτρέπω επεξεργασία δεδομένων. Στη φόρμα αυτή έχω ένα κουμπί με λεζάντα Επεξργασία και το οποίο με παίρνει στη φόρμα "Edit_pelates" στην οποία επιτρέπω την επεξεργασία. Με τον παρακάτω κώδικα που έβαλα, όταν ανοίγει η φόρμα "Edit_pelates" μου εμφανίζει μόνο την εγγραφή στην οποία βρισκόμουν τη στιγμή που πάτησα το κουμπί Επεξεργασία.

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "Edit_Pelates"

stLinkCriteria = "[kwdikos_pelati]=" & Me![kwdikos_pelati]
DoCmd.Close

DoCmd.OpenForm stDocName, , , stLinkCriteria

Όλα μια χαρά μέχρι εδώ.
Όμως στη φόρμα "Edit_pelates" έχω ένα κουμπί με λεζάντα "Πίσω" και το οποίο κλείνει τη φόρμα "Edit_pelates" κι ανοίγει τη φόρμα "Pelates" και μου δείχνει την πρώτη εγγραφή. Εγώ θέλω να βάλω κώδικα που να με παίρνει αμέσως στην εγγραφή την οποία επεξεργαζόμουν στη φόρμα "Edit_pelates". Αν βάλω τον αντίστοιχο παραπάνω κώδικα, ναι μεν θα με πάρει σε αυτήν την εγγραφή, αλλά δε θα μου επιτρέπει να μετακινηθώ στις υπόλοιπες. (γιατί στην ουσία εφαρμόζεται φίλτρο).
Γνωρίζει κανείς τί μπορώ να κάνω;
Επιπλέον θα ήθελα να ξέρω πως γίνεται να πάω αμέσως στην τελειταία εγγραφή της φόρμας "Pelates" βάζοντας κώδικα στο κλικ του κουμπιού Πίσω και όχι στο άνοιγμα ή στη φόρτωση της φόρμας "Pelates", γιατί αυτό νομίζω ότι μπορώ να το καταφέρω με τον παρακάτω κώδικα

On Error GoTo Err_ÅíôïëÞ21_Click


DoCmd.GoToRecord , , acLast

Exit_ÅíôïëÞ21_Click:
Exit Sub

Err_ÅíôïëÞ21_Click:
MsgBox Err.Description
Resume Exit_ÅíôïëÞ21_Click

Tasos 06-03-12 13:36

Καλημέρα Σάκη!

Επειδή δεν γνωρίζω με ποιο τρόπο δεν επιτρέπεις την επεξεργασία δεδομένων στην αρχική σου φόρμα, σου προτείνω ένα πιο γενικευμένο κώδικα:

Κώδικας:

Private Sub cmdOpenEditForm_Click()

    Dim CurrentID As Long
    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim rs As Object
   
    On Error Resume Next
   
    If Me.Dirty Then
        DoCmd.RunCommand acCmdSaveRecord
    End If
    If Err <> 0 Then
        Beep
        MsgBox Err.Description
        Exit Sub
    End If
   
    stDocName = "Edit_Pelates"
    stLinkCriteria = "[kwdikos_pelati]=" & Nz(Me![kwdikos_pelati], "Null")
   
    DoCmd.OpenForm stDocName, acNormal, "", stLinkCriteria, , acDialog

    If Not IsNull(Me![kwdikos_pelati]) Then
        Me.Refresh
        Exit Sub
    Else
        CurrentID = Nz(DMax("[kwdikos_pelati]", Me.RecordSource), 0)
    End If
   
    Me.Requery
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[kwdikos_pelati] = " & CurrentID
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
    rs.Close
   
End Sub

Καλή συνέχεια!

Τάσος

sakis297 06-03-12 16:26

Γεια σου Τάσο!!!
Απαγορεύω την επεξεργασία από τις ιδιότητες της φόρμας, καρτέλα δεδομένα και κάνω ¨Οχι τη δυνατότητα επεξεργασίας και διαγραφών.
Έχω μπερδευτεί με τον κώδικα που μου έστειλες. Τι ακριβώς πετυχαίνω με αυτόν; Πού θα πρέπει να τον δοκιμάσω;

Tasos 06-03-12 18:39

Σάκη, βάλε τον κώδικα στο συμβάν Click ενός κουμπιού στην κύρια φόρμα και θα γίνει το ζητούμενο σου.

Τάσος

sakis297 06-03-12 19:43

Τάσο, δοκίμασα τον κώδικα που μου έστειλες, αλλά κάνει ακριβώς το ίδιο πράγμα με το δικό μου κώδικα.
Βασικά εγώ ήθελα από την Edit_Pelates να πηγαίνω στη φόρμα Pelates, οπότε στον κώδικά σου άλλαξα το stDocName = "Edit_Pelates" σε stDocName = "Pelates".
Όταν λοιπόν με τον κώδικά σου πηγαίνω από την Edit_pelates στην Pelates, ναι μεν πηγαίνω αμέσως στη σωστή εγγραφή, αλλά εφαρμόζεται φίλτρο και δεν μπορώ να δω τις υπόλοιπες εγγραφές. Αυτό είναι το πρόβλημα που προσπαθώ να λύσω.
Στην ουσία λοιπόν, εσύ μου έδωσες έναν άλλο τρόπο για να κάνω αυτό που ήδη είχα καταφέρει. Ελπίζω να καταλαβαίνεις το πρόβλημα.
Σε κάθε περίπτωση, σ'ευχαριστώ που ασχολείσαι με το θέμα μου.

dimmag 06-03-12 20:52

Σάκη καλισπέρα
Για δοκίμασε
στο cmdOpenEdit_pelates_Click()
αντι για
DoCmd.Close
Form_pelates.Visible = False

και για την επιστροφή στο cmdPisoStousPelates_Click() της φόρμας Edit_pelates

DoCmd.Close (τη φόρμα Edit_pelates)
Form_pelates.Visible = True

Φιλικά
Δημήτρης

dimmag 06-03-12 21:17

Παράθεση:

Αρχική Δημοσίευση από dimmag (Μήνυμα 9867)
Σάκη καλισπέρα
Για δοκίμασε
στο cmdOpenEdit_pelates_Click()
αντι για
DoCmd.Close
Form_pelates.Visible = False

και για την επιστροφή στο cmdPisoStousPelates_Click() της φόρμας Edit_pelates

DoCmd.Close (τη φόρμα Edit_pelates)
Form_pelates.Visible = True

Φιλικά
Δημήτρης

Για αποφυγή παρανόησης
για την επιστροφή στο cmdPisoStousPelates_Click() της φόρμας Edit_pelates
μετά το
DoCmd.Close (τη φόρμα Edit_pelates)
βάλε
Form_pelates.Visible = True

sakis297 06-03-12 21:44

Χαχά!!! Δημήτρη όταν διάβασα τη σκέψη σου είπα "αποκλείεται να υπάρχει τόσο απλή λύση"...
Και όντως!!! Αυτό που μου πρότεινες κάνει τη δουλειά που θέλω!!! Εναλλακτικός ο τρόπος σκέψης σου!!! Σ' ευχαριστώ πάρα πολύ!!!
Πάντως, αν μάθαινα πως μπορώ βρισκόμενος σε μία φόρμα, να πάω αμέσως στην τελευταία εγγραφή μιας άλλης φόρμας, τότε θα ήμουν 100% καλυμμένος.

kapetang 06-03-12 23:24

Καλησπέρα/Καλημέρα στην παρέα

Πράγματι η λύση που πρότεινε ο Δημήτρης είναι έξυπνη και απλή.

Πιστεύω όμως ότι, αν κάνουμε αλλαγές δεδομένων στη φόρμα Edit_pelates, δε θα εμφανίζονται στη φόρμα pelates, όταν την κάνουμε ορατή.

Για να πάμε στην τελευταία εγγραφή, στο κουμπί που εμφανίζει τη φόρμα pelates, μπορούμε να βάλουμε τον κώδικα: Forms("pelates").Recordset.MoveLast

Φιλικά/Γιώργος

Tasos 07-03-12 01:08

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

Σάκη ο κώδικας που υπάρχει στο μήνυμα σου:
Κλείνει την αρχική φόρμα "Pelates".
Ανοίγει τη φόρμα "Edit_Pelates" με κριτήριο το ID της τρέχουσας εγγραφής της αρχικής
("Pelates") που το έχεις βάλει προηγουμένως στη μεταβλητή stLinkCriteria.

Ο δικός μου κώδικας δεν κάνει ακριβώς τα ίδια με τον δικό σου.

Τι κάνει ο κώδικας αυτός :

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

Αποθηκεύει τυχόν μη αποθηκευμένη εγγραφή για να μπορέσει να την εμφανίσει στη φόρμα "Edit_Pelates".

Ανοίγει τη φόρμα "Edit_Pelates" σε παράθυρο διαλόγου αποκλείοντας έτσι κάθε
ενέργεια σε οποιοδήποτε άλλο σημείο της εφαρμογής εκτός από την ίδια τη φόρμα.

Παράλληλα, επειδή φόρμα "Edit_Pelates" σε παράθυρο διαλόγου, ο κώδικας που την άνοιξε διακόπτεται και θα συνεχίζει να εκτελείται μόνο όταν εκείνη κλείσει.

Στη συνέχεια της εκτέλεσης του κώδικα θα γίνει ανανέωση των δεδομένων της φόρμας "Pelates" και αν έχει δημιουργηθεί νέα εγγραφή θα την επιλέξει.

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

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

Όσο για το φίλτρο που δεν θέλεις να εφαρμόζεται στη φόρμα "Edit_Pelates" θα πρέπει να
τροποποιηθεί ο κώδικας στη φόρμα "Pelates" αλλά και να προστεθεί ο παρακάτω κώδιικας στη φόρμα "Edit_Pelates":

Κώδικας:

Private Sub Form_Load()
    Dim rs As Object, CurrentID As Long
    CurrentID = Nz(Me.OpenArgs)
    If CurrentID = 0 Then
        DoCmd.GoToRecord , , acNewRec
    Else
        Set rs = Me.Recordset.Clone
        rs.FindFirst "[kwdikos_pelati] = " & CurrentID
        If Not rs.EOF Then Me.Bookmark = rs.Bookmark
        rs.Close
    End If
End Sub

Στο συνημμένο μπορείς να δεις ένα παράδειγμα.


Καλή συνέχεια!

Τάσος

sakis297 07-03-12 19:29

Παράθεση:

Αρχική Δημοσίευση από kapetang (Μήνυμα 9870)
Καλησπέρα/Καλημέρα στην παρέα

Πράγματι η λύση που πρότεινε ο Δημήτρης είναι έξυπνη και απλή.

Πιστεύω όμως ότι, αν κάνουμε αλλαγές δεδομένων στη φόρμα Edit_pelates, δε θα εμφανίζονται στη φόρμα pelates, όταν την κάνουμε ορατή.

Για να πάμε στην τελευταία εγγραφή, στο κουμπί που εμφανίζει τη φόρμα pelates, μπορούμε να βάλουμε τον κώδικα: Forms("pelates").Recordset.MoveLast

Φιλικά/Γιώργος

Γιώργο, ακόμα κι αν κάνω αλλαγές στην Edit_pelates, αυτές θα εμφανιστούν στη φόρμα Pelates όταν την εμφανίσω.
Σ' ευχαριστώ για την τελευταία εγγραφή.

sakis297 07-03-12 19:31

Τάσο ήσουν αναλυτικότατος.
Μόλις βρω χρόνο θα μελετήσω όλα αυτά που μου έγραψες. Νομίζω ότι θα μου φανούν χρήσιμα και σε άλλα πράγματα που θέλω να φτιάξω.
Σ'ευχαριστώ πολύ!!!


Η ώρα είναι 17:26.

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


Search Engine Optimization by vBSEO 3.3.2