Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
Αποθήκευση εγγραφής - μεταβολών φόρμας
Καλησπέρα σε όλα τα παιδιά Φίλοι μου, σας παρουσιάζω ένα πακέτο ενεργειών μέσω των οποίων ο χρήστης μια εφαρμογής μπορεί να αποθηκεύει μια έγγραφή ή μεταβολές που έκανε σε μια υπάρχουσα εγγραφή. Παρακαλώ τους πλέον έμπειρους και γνώστες του αντικειμένου 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
| |||
| |||
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 Φιλικά |
#3
| |||
| |||
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
| |||
| |||
Re: Αποθήκευση εγγραφής - μεταβολών φόρμας
Φίλε Meteora Τα αρχεία doc zipαρέ τα, τα έχω στα απογορευμένα σαν προέκταση αρχεία. Αν χρειαστεί τότε πιθανόν πείτε μου να αφαιρέσω αυτήν την απαγόρευση στα doc καθώς και σε άλλων ειδών αρχεία. Φιλικά iliadisk / kon73 |
#5
| |||
| |||
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
| |||
| |||
Re: Αποθήκευση εγγραφής - μεταβολών φόρμας Παράθεση:
Δεν μπορώ να καταλάβω σε τι ακριβώς δεν ανταποκρίνεται ο κώδικας σε μία νέα εγγραφή, καθότι στην νέα εγγραφή ουσιαστικά υπάρχουν τα Event Before Insert και After Insert το Before update δεν ελέγχεται σε νέα εγγραφή. Πες μου λοιπόν που βρίσκεται το πρόβλημα στον κώδικα που προτείνω, καθότι με ενδιαφέρει για να τον διορθώσω. Φιλικά iliadisk / kon73 |
#7
| |||
| |||
Re: Αποθήκευση εγγραφής - μεταβολών φόρμας
Καλησπέρα! Φίλε μου Κωνσταντίνε, το ζητούμενο αναφέρεται σε “...ένα πακέτο ενεργειών μέσω των οποίων ο χρήστης μια εφαρμογής μπορεί να αποθηκεύει μια έγγραφή ή μεταβολές που έκανε σε μια υπάρχουσα εγγραφή“. Επίσης αναφέρεται : (5) Μόνο αν είμαστε σε νέα εγγραφή θέλω να γυρίσει πίσω. Με βάση λοιπόν τις προϋποθέσεις αυτές, παρατηρούμε ότι ο δικός σου κώδικας δεν ελέγχει τις νέες εγγραφές και κατά συνέπεια δεν ειδοποιεί τον χρήστη για αποθήκευση, ενώ ο δικός μου δεν επέτρεπε την επιστροφή στην τελευταία εγγραφή μετά από την αναίρεση νέας εγγραφής ! Βλέποντας λοιπόν τα παραπάνω, αναθεώρησα και ξανάγραψα τον κώδικα με κάποιες απλοποιήσεις ταυτόχρονα. Δεν υπάρχει κάποιο πρόβλημα, απλά πρόκειται για λογικά και όχι για προγραμματιστικά λάθη (άνθρωποι ήμαστε κι εμείς, όχι μόνο προγραμματιστές) που ευτυχώς είμαστε σε θέση να τα δούμε και να τα διορθώσουμε. Τα λέμε... |
#8
| |||
| |||
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 Φιλικά iliadisk / kon73 |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | 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.