Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > Αποθήκευση εγγραφής - μεταβολών φόρμας

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

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

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 12-03-09, 22:35
Meteora
Guest
 
Μηνύματα: n/a
Προεπιλογή Αποθήκευση εγγραφής - μεταβολών φόρμας

Καλησπέρα σε όλα τα παιδιά

Φίλοι μου, σας παρουσιάζω ένα πακέτο ενεργειών μέσω των οποίων ο χρήστης μια εφαρμογής μπορεί να αποθηκεύει μια έγγραφή ή μεταβολές που έκανε σε μια υπάρχουσα εγγραφή.
Παρακαλώ τους πλέον έμπειρους και γνώστες του αντικειμένου Access & VBA να δουν το πακέτο αυτό και αν ειναι προς τη ...σωστή κατεύθυνση έχει καλώς. Αν δέχεται κάποιες μικρές αλλαγές άς τις προτείνουν. Αν ειναι κακό ας ...το πάρει το ποτάμι. Η δική μου πρόθεση ειναι να βοηθήσω κάποια παιδιά που ψάχνονται στα πρώτα τους βήματα και τ ί π ο τ ε άλλο.
Επιτρέψτε μου μια ερώτηση : Η εντολή-συμβάν Dirty (αλλοίωση) αφορά πεδία πίνακα που η φόρμα παρουσιάζει και όχι πλαίσια λίστας. Πως -με κώδικα - θα γίνει δυνατόν να ανιχνεύεται η αλλαγή που ενδεχομένως γίνει σε κάποιο πλαίσιο λίστας;

(VBA) Έλεγχος της ‘Αποθήκευσης’ εγγραφής

ΒΗΜΑ 1. Σε υπάρχουσα Module της εφαρμογής εισάγω τη γραμμή κώδικα :
Public elegxo As Integer

ΒΗΜΑ 2. Στη φόρμα –της οποίας θέλω να ελέγχω την αποθήκευση γράφω :
Private Sub Form_Current()
elegxo = 0
End Sub



ΒΗΜΑ 3. Στο κουμπί ‘Αποθήκευση’ της φόρμας γράφω :

If IsNull(combo21) Then
MsgBox "Δεν επέλεξες Πρόγραμμα !", vbInformation + vbOKOnly, "ΕΛΕΓΧΟΣ"
combo21.SetFocus (1)
Exit Sub
End If
… κλπ...

If Me.Dirty Then ‘ Έλεγχος αν έγιναν αλλαγές στα πεδία της φόρμας
elegxo = 1
Dim flag As VbMsgBoxResult
flag = MsgBox("Να αποθηκευτούν οι αλλαγές ?", vbYesNo Or vbQuestion, "ΕΛΕΓΧΟΣ")
Select Case flag
Case vbYes
[ID1] = combo21 (2)
DoCmd.RunCommand acCmdSaveRecord
Case vbNo
Me.Undo
If Me.NewRecord = True Then DoCmd.GoToRecord , , acLast (3)
End Select
ΑΣτοχος.SetFocus
Else
MsgBox "Δεν έκανες κάποια αλλαγή !", vbInformation, "ΕΛΕΓΧΟΣ"
End If

ΒΗΜΑ 4. Στο συμβάν της φόρμας Before-Update έχω τον κώδικα :

Private Sub Form_BeforeUpdate(Cancel As Integer)

If Me.Dirty And elegxo = 0 Then (4)
Dim flag As VbMsgBoxResult
flag = MsgBox("Να αποθηκευτούν οι αλλαγές ?", vbYesNo Or vbQuestion, "ΕΛΕΓΧΟΣ")
Select Case flag
Case vbYes
[ID1] = combo21
DoCmd.RunCommand acCmdSaveRecord
Case vbNo
Me.Undo
If Me.NewRecord = True Then DoCmd.GoToRecord , , acLast (5)
End Select
ΑΣτοχος.SetFocus
End If

End Sub


Σχόλια :

(1) Combo21 είναι το όνομα του μοναδικού πλαισίου λίστας που υπάρχει στη φόρμα.
(2) Το πεδίο [ID1] παίρνει τιμή ίδια με αυτή που επιλέγει από το πλαίσιο λίστας.
(3) Μόνο αν είμαστε σε νέα εγγραφή θέλω να γυρίσει πίσω
(4) Έγιναν αλλαγές αλλά δεν πατήθηκε η Αποθήκευση!
(5) Μόνο αν είμαστε σε νέα εγγραφή θέλω να γυρίσει πίσω


Η βασική ιδέα στη παραπάνω ανάλυση είναι η εξής: Όταν ο χρήστης κάνει αλλαγές και δεν πατήσει το πλήκτρο ‘Αποθήκευση’, να υπάρχει κώδικας που θα ζητήσει –από τον χρήστη – την αποδοχή ή όχι των αλλαγών.
Να θυμίσω ότι αποθήκευση έχουμε ΑΥΤΟΜΑΤΑ, όταν πάμε σε άλλη εγγραφή, όταν κλείσουμε τη φόρμα ,…και γενικά όταν το Focus πάει σε αντικείμενο έξω από την τρέχουσα εγγραφή!


Νάχετε ένα καλό βράδυ
O Meteora

Έχω κάποιες δυσκολίες. Κωνσταντίνε τα *.doc δεν επισυνάπτονται ; Πώς επισυνάπτω;
Απάντηση με παράθεση
  #2  
Παλιά 13-03-09, 08:00
Tassos
Guest
 
Μηνύματα: n/a
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

Καλημέρα σε όλους!

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

Κατόπιν θα έφτιαχνα τον κώδικα μου κάπως έτσι:
Κώδικας:
Option Explicit
Dim cboListIndex&, cboValue

Private Sub Form_Load()
    cboListIndex = Combo21.ListIndex
End Sub

Private Sub Form_Current()
    cboListIndex = Combo21.ListIndex
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    With Me
        Select Case MsgBox("Save changes...?", _
                vbQuestion + vbYesNoCancel + vbDefaultButton3, "Save changes...")
            Case vbCancel
                Cancel = True
            Case vbNo
                cboValue = .Combo21.Column(0, IIf(cboListIndex = -1, Null, cboListIndex))
                .Undo
                .Combo21 = cboValue
                If Me.NewRecord Then DoCmd.GoToRecord , , acLast
            Case vbYes
                Me.ID1 = Me.Combo21
        End Select
    End With
End Sub
όπου "+ vbDefaultButton3" είναι το κουμπί του διαλόγου που θα έχει την εστίαση (ίσως χρειαστεί προσαρμογή).

Φιλικά
Απάντηση με παράθεση
  #3  
Παλιά 13-03-09, 09:32
Όνομα: Ηλιάδης Κωνσταντίνος
Έκδοση λογισμικού Office: Ms-Office 2010, Ms-Office 2013
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 13-12-2008
Περιοχή: Chicago
Μηνύματα: 119
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

Αγαπητέ φίλε Meteora, Tassos,

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

Μία εγγραφή για να εντοπίσουμε ότι έχει αλλαγές μπορούμε να ελένξουμε την τιμή την παλιά .oldvalue που είχε με την καινούργια .value σε κάθε αντικείμενο μίας φόρμας που επιδέχεται την ιδιότητα value και oldvalue.

Επομένως πριν αναζητήσουμε για αλλαγές σε όλα τα αντικείμενα της φόρμας ελέγχουμε μόνο τα αντικείμενα να είναι text box ή Combobox ή ListBox ή όποια δέχονται την τιμή value (Και τυχόν μου έχουν ξεφύγει στο εδώ παράδειγμα). Στο παράδειγμα ελέγχω μόνο για textbox και Combobox μπορούμε να προσθέσουμε ότι θέλουμε.

Tονίζω ότι για μένα το ListBox σε αναφορές που έχω κάνει το χρησιμοποιώ και ως bound control (Δηλαδή να αποθηκεύει και αυτό τιμές και μάλιστα να δύναται να έχει και πολλαπλές τιμές)

Το Event της φόρμας είναι το BeforeUpdate πριν δηλαδή γίνει η ενημέρωση.

Σε αυτό καλούμε την ρουτίνα Change δίνοντας τιμές στο FrmName.

Στο Event Before Update της Φόρμας
Κώδικας:
Private Sub Form_BeforeUpdate(Cancel As Integer)
   Dim CurrFrmName As Form
      Set CurrFrmName = Screen.ActiveForm
      Call change(CurrFrmName)
End Sub
Και η ρουτίνα

Κώδικας:
Public Sub Change(FrmName As Form)
Dim response As Integer, blnChanged As Boolean, id As Object
       On Error Resume Next
       blnChanged = False
       If FrmName.NewRecord = False Then
            For Each id In FrmName.Controls
                If id.ControlType = acComboBox Or id.ControlType = acTextBox Then
                    If id.Value <> id.OldValue or IsNull(id.Value <> id.OldValue) Then blnChanged = True
                End If
             Next
                 If blnChanged = True Then response = MsgBox("Έγιναν αλλαγές να καταχωρηθούν ;", vbQuestion + vbDefaultButton2 + vbYesNo, "Τροποποίηση εγγραφής")
                 If response = vbNo Then
                     FrmName.Undo
                 End If
        End If
End Sub
Αυτά και να έχεται ένα καλό Σαββατοκύριακο.

Φιλικά

iliadisk / kon73
Απάντηση με παράθεση
  #4  
Παλιά 13-03-09, 13:50
Όνομα: Ηλιάδης Κωνσταντίνος
Έκδοση λογισμικού Office: Ms-Office 2010, Ms-Office 2013
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 13-12-2008
Περιοχή: Chicago
Μηνύματα: 119
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

Φίλε Meteora

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


Φιλικά

iliadisk / kon73
Απάντηση με παράθεση
  #5  
Παλιά 13-03-09, 13:59
Tassos
Guest
 
Μηνύματα: n/a
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

Και πάλι καλημέρα σας!
Επιτρέψτε μου να προτείνω μια λίγο διαφορετική αλλά προσέγγιση καθώς οι προηγούμενες προτάσεις μας
δεν ανταποκρίνονται σωστά όταν ακυρώνεται μια νέα εγγραφή.
Ο κώδικας όπως και ο προηγούμενος προϋποθέτει βοηθητικό πεδίο στον πίνακα της φόρμας
με το οποίο θα έχει συνδεθεί το "Combo21".
Αν το "Combo21" δεσμευτεί με το πεδίο "ID1" τότε φυσικά δεν θα χρειαστεί το βοηθητικό
αυτό πεδίο και θα πρέπει να ακυρώνουμε την γραμμή του κώδικα : "Case vbYes: ..."
Κώδικας:
Option Explicit
Dim BoolDelete As Boolean

Private Sub Form_AfterUpdate()
    If BoolDelete Then
        BoolDelete = False
        DoCmd.SetWarnings False
        DoCmd.RunCommand acCmdDeleteRecord
        DoCmd.GoToRecord , , acLast
        DoCmd.SetWarnings True
    End If
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Select Case MsgBox("Save changes...?", _
            vbQuestion + vbYesNoCancel + vbDefaultButton3, "Save changes...")
        Case vbCancel: Cancel = True
        Case vbNo: If Me.NewRecord Then BoolDelete = True: Exit Sub: Me.Undo
       Case vbYes: Me.ID1 = Me.Combo21 'Δεν χρειάζεται αν το "Combo21" δεσμευτεί με το πεδίο "ID1" 
    End Select
End Sub
Καλό Σαββατοκύριακο κι από μένα!
Απάντηση με παράθεση
  #6  
Παλιά 13-03-09, 14:55
Όνομα: Ηλιάδης Κωνσταντίνος
Έκδοση λογισμικού Office: Ms-Office 2010, Ms-Office 2013
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 13-12-2008
Περιοχή: Chicago
Μηνύματα: 119
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

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

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

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

Φιλικά

iliadisk / kon73
Απάντηση με παράθεση
  #7  
Παλιά 13-03-09, 19:08
Tassos
Guest
 
Μηνύματα: n/a
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

Καλησπέρα!
Φίλε μου Κωνσταντίνε,
το ζητούμενο αναφέρεται σε “...ένα πακέτο ενεργειών μέσω των οποίων ο χρήστης μια εφαρμογής
μπορεί να αποθηκεύει μια έγγραφή ή μεταβολές που έκανε σε μια υπάρχουσα εγγραφή“.

Επίσης αναφέρεται : (5) Μόνο αν είμαστε σε νέα εγγραφή θέλω να γυρίσει πίσω.

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

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

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

Τα λέμε...
Απάντηση με παράθεση
  #8  
Παλιά 14-03-09, 00:00
Όνομα: Ηλιάδης Κωνσταντίνος
Έκδοση λογισμικού Office: Ms-Office 2010, Ms-Office 2013
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 13-12-2008
Περιοχή: Chicago
Μηνύματα: 119
Προεπιλογή Re: Αποθήκευση εγγραφής - μεταβολών φόρμας

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

Δεν μπορώ να καταλάβω το λοιπόν γιατί χρησιμοποιούνται μεταβλητές για να λυθεί αυτό που νομίζω πως κατάλαβα ότι ζητάμε αφού η Access μέσω των ιδιότητων το καλύπτει. Για την νέα εγγραφή να ζητά επιβεβαίωση παρουσιάζω ξανά τον κώδικα με μια μικρή τροποποίηση στο If FrmName.NewRecord = false then (Βάζω αν είναι true κώδικα)
Κώδικας:
Public Sub Change(FrmName As Form)
Dim response As Integer, blnChanged As Boolean, id As Object
       On Error Resume Next
       blnChanged = False
       If FrmName.NewRecord = False Then
            For Each id In FrmName.Controls
                If id.ControlType = acComboBox Or id.ControlType = acTextBox Then
                    If id.Value <> id.OldValue or IsNull(id.Value <> id.OldValue) Then blnChanged = True
                End If
             Next
       else
             blnChanged=true
       end if
                 If blnChanged = True Then response = MsgBox("Έγιναν αλλαγές να καταχωρηθούν ;", vbQuestion + vbDefaultButton2 + vbYesNo, "Τροποποίηση εγγραφής")
                 If response = vbNo Then
                     FrmName.Undo
                 End If
End Sub
Αυτό αν κατάλαβα καλά συμπληρώνει τι θέλουμε. Αν πάλι δεν κατάλαβα καλά ας μου γράψετε και μένα το παιδί αναλυτικότερα τι ζητάμε γιατί από αυτά που διάβασα στον κώδικα σας αυτά αντίστοιχα προσπαθώ να συμπληρώσω στον δικό μου. Επίσης γιατί να γυρίζει πίσω η εγγραφή όταν είμαστε σε νέα εγγραφή ; (Δηλαδή να μην μπορούμε να καταχωρούμε νέα εγγραφή ; γιατί τότε βάζουμε me.allowadditions = false). Ο κώδικας επίσης ανιχνεύει και αλλαγές στο σύνθετο πλαίσιο.

Φιλικά

iliadisk / kon73
Απάντηση με παράθεση
Απάντηση στο θέμα


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

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


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

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
Αποθηκευση Απεικόνισης σε πεδιο φορμας concar Access - Ερωτήσεις / Απαντήσεις 0 25-11-16 11:02
Αποθήκευση Εγγραφής από Ερώτημα kostakis123 Access - Ερωτήσεις / Απαντήσεις 1 07-12-15 11:12
Έλεγχος και αποτροπή διπλότυπης εγγραφής και εμφάνιση φόρμας pctechdr Access - Ερωτήσεις / Απαντήσεις 2 11-06-15 16:02
Ενημέρωση Πεδίου Δευτερεύουσας Φόρμας μέσω Βοηθητικής Φόρμας Χρήστος Access - Ερωτήσεις / Απαντήσεις 1 17-04-12 19:18
Εξαγωγή και αποθήκευση δεδομένων φόρμας σε word nasos23 Access - Ερωτήσεις / Απαντήσεις 1 15-03-12 10:10


Η ώρα είναι 19:34.