Καταρχήν σας ευχαριστώ θερμά για την προσπάθεια σας να με βοηθήσετε.
Η βάση δεδομένων που φτιάχνω γίνεται αποκλειστικά στην Access χρησιμοποιώντας VBA (δεν γνωρίζω κάποια άλλη γλώσσα προγραμματισμού έτσι δεν καταλαβαίνω αυτά που ο χρήστης evliatsas αναφέρει).
Γενικώς το περιβάλλον έτσι όπως το έχω σχεδιάσει θέλω να μην δίνει την εντύπωση ότι η Ms Access τρέχει από κάτω. Έτσι σκαρφίζομαι διάφορους τρόπους – ανατρέχοντας φυσικά στη βοήθεια της Access αλλά και στο internet – ώστε να πετύχω τον τελικό μου σκοπό που είναι η βάση δεδομένων να δείχνει περισσότερο σαν ένα ανεξάρτητο πρόγραμμα, αν μπορώ να το θέσω έτσι.
Προκειμένου να αποφύγω τα μηνύματα της Microsoft αποφάσισα να φτιάξω τα δικά μου κουμπιά πλοήγησης όμως κολλάω σ’ ένα σωρό λάθη που συμβαίνουν. Αναζήτησα προσαρμοσμένα κουμπιά πλοήγησης στο internet αλλά δυστυχώς δεν κάνουν τη φόρμα μου να λειτουργεί έτσι όπως θέλω.
Φαντάζομαι πως η όλη διαδικασία θα πρέπει να είναι πιο εύκολη απ’ ότι δείχνει αλλά κάτι παραλείπω ή κάτι αγνοώ ή κάνω τελείως λάθος.
Ενδεικτικά παραθέτω μέρος του κώδικα μήπως και μπορέσετε να βγάλετε άκρη.
Τα λάθη που αποφεύγω μπορεί να μην συμβαίνουν πάντα αλλά κάποτε συνέβησαν και έτσι τα συμπεριλαμβάνω.
Δυστυχώς δεν μπορώ να σας μιλήσω με όρους προγραμματιστή ώστε να μπείτε γρήγορα στο νόημα.
Private blnNewRecord As Boolean
Private blnChangedData As Boolean
Private ctlErrorHandling As Control
Private blnNoDublicatedRecord As Boolean
Private blnChangedIDNumberForExtras As Boolean
Private blnBeforeUpdateStop As Boolean
Private strIDNumber As String
Private strmyOldIDNumberForExtras As String
Private Sub Form_Current()
Call ColorUnActive
If Me.UnActive = False Then
Call Pretty
End If
blnChangedData = False
blnNewRecord = False
blnBeforeUpdateStop = False
Set ctlErrorHandling = Nothing
blnChangedIDNumberForExtras = False
Me.txtCurrentRecord = Me.Form.CurrentRecord
Me.IDNumber.SetFocus
strmyOldIDNumberForExtras = Nz(Me.IDNumber)
strIDNumber = Nz(Me.IDNumber)
End Sub
Private Sub Form_BeforeInsert(Cancel As Integer)
blnNewRecord = True
End Sub
Private Sub Form_Dirty(Cancel As Integer)
blnChangedData = True
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
Me.Field1.SetFocus
If Me.Field1.Text = "" Then
MsgBox "Δεν μπορείτε να συνεχίσετε χωρίς να" & Chr(10) & Chr(13) & _
"να καταχωρήσετε τιμή στο Field1.", vbCritical, "Field1 Xωρίς Τιμή!"
If ctlErrorHandling.Name = "cmbCloseForm" Then
If blnNewRecord = False Then
If MsgBox("Για να σας επιτραπεί να βγείτε από τη φόρμα" & Chr(10) & Chr(13) & _
"πρέπει πρώτα να αναιρέσετε τις αλλαγές." & Chr(10) & Chr(13) & _
"Είστε σίγουροι ότι θέλετε να αναιρέσετε τι αλλαγές;", _
vbCritical + vbYesNo, "Αναίρεση;") = vbYes Then
blnChangedData = False
blnNewRecord = False
DoCmd.RunCommand acCmdUndo
DoCmd.Close
End If
Else
If MsgBox("Για να σας επιτραπεί να βγείτε από τη φόρμα" & Chr(10) & Chr(13) & _
"πρέπει πρώτα να αναιρέσετε τη νέα εγγραφή." & Chr(10) & Chr(13) & _
"Είστε σίγουροι ότι θέλετε να αναιρέσετε τη νέα εγγραφή;", _
vbCritical + vbYesNo, "Αναίρεση;") = vbYes Then
blnChangedData = False
blnNewRecord = False
DoCmd.RunCommand acCmdUndo
DoCmd.Close
End If
End If
End If
Cancel = True
blnBeforeUpdateStop = True
Me.Field1.SetFocus
Else
Dim strField1 As String
Dim strField2 As String
Dim strField3 As String
strField1=Trim(Me.Field1.Text)
Me.Field2.SetFocus
strField2 = Trim(Me.Field2.Text)
Me.Field3.SetFocus
strField3=Trim(Me.Field3.Text)
If strField3<>"" Then
strIDNumber = strField1 & strField2 & strField3
Else
strIDNumber = strField1 & strField2
End If
Call CheckForDublicatedRecord
If blnNoDublicatedRecord = False Then
Cancel = True
MsgBox "Έχετε ήδη καταχωρήσει το συγκεκριμένο IDNumber" & strIDNumber & Chr(10) & Chr(13) & _
"Αλλάξτε το Field1 για να συνεχίσετε.", vbCritical, "Διπλότυπη εγγραφή!"
Me.Field1.SetFocus
Me.Field1.Text=""
blnBeforeUpdateStop = True
Else
Me.IDNumber.SetFocus
Me.IDNumber.Text = strIDNumber
Me.txtHelpMe.SetFocus
If strmyOldIDNumberForExtras <> "" Then
If strmyOldIDNumberForExtras <> strIDNumber Then
blnChangedIDNumberForExtras = True
End If
End If
If blnNewRecord = True Then
If MsgBox("Θέλετε να αποθηκεύσετε τις αλλαγές;", vbQuestion + vbYesNo, _
"Νέα Εγγραφή!") = vbYes Then
DoCmd.RunCommand acCmdSaveRecord
Me.Recalc
Else
DoCmd.RunCommand acCmdUndo
End If
Else
If MsgBox("Θέλετε να αποθηκεύσετε τις αλλαγές;", vbQuestion + vbYesNo, _
"Τα δεδομένα έχουν αλλάξει!") = vbYes Then
DoCmd.RunCommand acCmdSaveRecord
Me.Recalc
Else
DoCmd.RunCommand acCmdUndo
End If
End If
End If
End If
Exit_MyUpdateErrorHandling:
Exit Sub
Err_MyUpdateErrorHandling:
Select Case Err.Number
Case 2115
Resume Next
Case 2046
Resume Next
Case 2467
Resume Next
Case 438
Resume Next
Case Else
MsgBox Err.Description
Resume Exit_MyUpdateErrorHandling
End Select
End Sub
Private Sub Form_AfterUpdate()
On Error GoTo Err_MyAfterUpdateErrorHandling
blnChangedData = False
If blnBeforeUpdateStop = False Then
Call Pretty
Call DefineExtrasList
Call WriteExtrasCount
If blnChangedIDNumberForExtras = True Then
If IsNull(DLookup("IDNumber", "tblExtras", "IDNumber=""" & _
strmyOldIDNumberForExtras & """")) = False Then
Call ChangeIDNumberForExtras
End If
End If
Select Case ctlErrorHandling
Case ctlErrorHandling.Name = "cmbCloseForm"
DoCmd.Close
Case ctlErrorHandling.Name = "cmbOpenExtrasForm"
DoCmd.OpenForm "frmAnalysisExtras", , , "[IDNumber]=""" & Me![IDNumber] & """"
Case ctlErrorHandling.Name="cmbGoToNextRecord"
Dim dbs As Database
Dim rst As Recordset
Dim lngTotalOfRecords As Long
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM tblBasicInfo;")
If rst.BOF = True And rst.EOF = True Then
MsgBox "Δεν υπάρχει επόμενη εγγραφή.", vbInformation, "Πρώτη Εγγραφή!"
rst.Close
Else
If Not rst.BOF Then
rst.MoveFirst
End If
If Not rst.EOF Then
rst.MoveLast
End If
lngTotalOfRecords = rst.RecordCount
Dim lngRecord As Long
lngRecord = Me.Form.CurrentRecord
Select Case lngTotalOfRecords
Case Is > lngRecord
DoCmd.GoToRecord , , acNext
Case lngRecord
DoCmd.GoToRecord , , acNewRec
Case Is < lngRecord
MsgBox "Βρισκόσαστε σε μία νέα εγγραφή. Δεν υπάρχει επόμενη.", vbInformation, "Τέλος Εγγραφών!"
End Select
rst.Close
End If
End Select
End If
Exit_MyAfterUpdateErrorHandling:
Exit Sub
Err_MyAfterUpdateErrorHandling:
Select Case Err.Number
Case 438
Resume Next
Case Else
MsgBox Err.Description
Resume Exit_MyAfterUpdateErrorHandling
End Select
End Sub
Private Sub cmbGoToNextRecord_Click()
On Error GoTo Err_CancelMove_Click
Set ctlErrorHandling = Me.cmbGoToNextRecord
If blnChangedData = True Then
Me.Refresh
Else
Dim dbs As Database
Dim rst As Recordset
Dim lngTotalOfRecords As Long
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM tblBasicInfo;")
If rst.BOF = True And rst.EOF = True Then
MsgBox "Δεν υπάρχει επόμενη εγγραφή.", vbInformation, "Πρώτη Εγγραφή!"
rst.Close
Else
If Not rst.BOF Then
rst.MoveFirst
End If
If Not rst.EOF Then
rst.MoveLast
End If
lngTotalOfRecords = rst.RecordCount
Dim lngRecord As Long
lngRecord = Me.Form.CurrentRecord
Select Case lngTotalOfRecords
Case Is > lngRecord
DoCmd.GoToRecord , , acNext
Case lngRecord
DoCmd.GoToRecord , , acNewRec
Case Is < lngRecord
MsgBox "Βρισκόσαστε σε μία νέα εγγραφή. Δεν υπάρχει επόμενη.", vbInformation, "Τέλος Εγγραφών!"
End Select
rst.Close
End If
End If
Exit_CancelMove_Click:
Exit Sub
Err_CancelMove_Click:
Select Case Err.Number
Case 3426
Resume Next
Case 3021
Resume Next
Case 2465
Resume Next
Case 2046
Resume Next
Case 2501
Resume Next
Case 2115
Resume Next
Case 2105
Resume Next
Case 2499
Resume Next
Case Else
MsgBox Err.Description
Resume Exit_CancelMove_Click
End Select
End Sub
Error 3426
This action was cancelled by an associated object.
Error 3021
No current record.
Error 2465
Η Microsoft Office Access δεν μπορεί να βρει το πεδίο '|' που αναφέρεται μέσα στην έκφρασή σας@Ίσως πληκτρολογήσατε λανθασμένα το όνομα του πεδίου ή το πεδίο έχει μετονομαστεί ή διαγραφεί.@@1@411730@1
Error 2046
Η εντολή ή η ενέργεια '|' δεν είναι διαθέσιμη τώρα.@* Ίσως η βάση δεδομένων είναι μόνο για ανάγνωση ή προηγούμενης έκδοσης της Microsoft Office Access που δεν έχει μετατραπεί.
* Ο τύπος αντικειμένου στον οποίο εφαρμόζεται η ενέργεια δεν έχει επιλεγεί ή δεν υπάρχει στην ενεργό προβολή.@Χρησιμοποιήστε μόνο όσες εντολές και ενέργειες μακροεντολών είναι τώρα διαθέσιμες για αυτή τη βάση δεδομένων.@1@@1
Error 2501
Η ενέργεια | ακυρώθηκε.@Χρησιμοποιήσατε κάποια μέθοδο του αντικειμένου DoCmd, για να εκτελέσετε μια ενέργεια στη Visual Basic, αλλά μετά πατήσατε 'Άκυρο' σε κάποιο παράθυρο διαλόγου.
Για παράδειγμα, χρησιμοποιήσατε τη μέθοδο Close για να κλείσετε μια φόρμα που είχε τροποποιηθεί. Έπειτα, πατήσατε 'Άκυρο' στο παράθυρο διαλόγου που σας
Error 2115
Η μακροεντολή ή η συνάρτηση που έχει οριστεί στην ιδιότητα BeforeUpdate ή ValidationRule για αυτό το πεδίο, εμποδίζει τη Microsoft Office Access να αποθηκεύσει τα δεδομένα στο πεδίο.@* Εάν πρόκειται για μακροεντολή, ανοίξτε τη στο παράθυρο 'Μακροεντολή' και καταργήστε την ενέργεια που προκαλεί την αποθήκευση (για παράδειγμα, 'Μετάβαση σε στοιχείο ελέγχου').
* Εάν η μακροεντολή περιλαμβάνει ενέργεια 'Ορισμός τιμής', ορίστε τη μακροεντολή ως τιμή στην ιδιότητα AfterUpdate του στοιχείου ελέγχου.
* Εάν πρόκειται για μακροεντολή, ορίστε ξανά τη συνάρτηση στο παράθυρο 'Λειτουργική μονάδα'.@@1@@1
Error 2105
Η μακροεντολή ή η συνάρτηση που έχει οριστεί στην ιδιότητα BeforeUpdate ή ValidationRule για αυτό το πεδίο, εμποδίζει τη Microsoft Office Access να αποθηκεύσει τα δεδομένα στο πεδίο.@* Εάν πρόκειται για μακροεντολή, ανοίξτε τη στο παράθυρο 'Μακροεντολή' και καταργήστε την ενέργεια που προκαλεί την αποθήκευση (για παράδειγμα, 'Μετάβαση σε στοιχείο ελέγχου'.
* Εάν η μακροεντολή περιλαμβάνει ενέργεια 'Ορισμός τιμής', ορίστε τη μακροεντολή ως τιμή στην ιδιότητα AfterUpdate του στοιχείου ελέγχου.
* Εάν πρόκειται για μακροεντολή, ορίστε ξανά τη συνάρτηση στο παράθυρο 'Λειτουργική μονάδα'.@@1@@1
Error 2499
Δεν μπορείτε να χρησιμοποιήσετε την ενέργεια ή τη μέθοδο GoToRecord (Μετάβαση σε εγγραφή) για ένα αντικείμενο σε Προβολή σχεδίασης.@Δοκιμάστε κάτι από τα ακόλουθα:
* Για φόρμα, μεταβείτε σε Προβολή φόρμας ή φύλλου δεδομένων.
* Για ερώτημα ή πίνακα, μεταβείτε σε Προβολή φύλλου δεδομένων.
* Εάν εκτελείτε μακροεντολή ή διαδικασία της
Error 2467
Η έκφραση που πληκτρολογήσατε αναφέρεται σε αντικείμενο που είναι κλειστό ή έχει διαγραφεί.@Για παράδειγμα, ίσως έχετε αντιστοιχήσει φόρμα σε μια μεταβλητή αντικειμένου Form, έχετε κλείσει την φόρμα και κατόπιν αναφερθήκατε στη μεταβλητή του αντικειμένου.@@1@@
Error 438
Object doesn't support this property or method
Τέλος και τω θεώ δόξα!!![Big Smile [:D]](/cs/emoticons/emotion-2.gif)