Εμφάνιση ενός μόνο μηνύματος
  #1  
Παλιά 12-03-09, 21: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 δεν επισυνάπτονται ; Πώς επισυνάπτω;
Απάντηση με παράθεση