PDA

Vollständige Version anzeigen : Fehler 3022


sLUmp
10.05.2001, 15:48
On Error GoTo Err_f_m_OK1_Click

If Not IsNull(f_m_Monat) And Not IsNull(f_m_Jahr) Then

zusammenfügen = "01." & Str(f_m_Monat.Column(1)) & "." & Str(f_m_Jahr)

DoCmd.GoToRecord , , acNewRec
Berichtsmonat.Enabled = True
Berichtsmonat.SetFocus
Berichtsmonat.Value = zusammenfügen
f_m_OK1.SetFocus
Berichtsmonat.Enabled = False
Monatsbericht_Speichern_Click
zusammenfügen = ""

Me.Requery
Else
If IsNull(f_m_Monat) Or IsNull(f_m_Jahr) Then
MsgBox "Sie müssen Monat und Jahr erst ausfüllen"
End If
End If

Err_f_m_OK1_Click:
Select Case Err.Number
Case Is = 0
Resume Next
Case Is = 20
Resume Next
case is = 3022
msgbox "Diesen Monatsbericht gibt es schon"
resume next
Case Else
MsgBox "CODE:" & vbNewLine & Err.Source & vbNewLine & vbNewLine & "FEHLERBESCHREIBUNG:" _
& vbNewLine & Err.Description, vbExclamation, "FEHLERNUMMER: " & Err.Number
Exit Sub
End Select

Jedes mal wenn dieser Code ausgeführt wird kommt zuerst eine Fehlermeldung über das "Case Else",
und dann kommt erst meine Msgbox "Diesen Monatsbericht...."

Ich möchte zwei Dinge diese Fehermeldung soll nicht mehr auftauchen und das Formular soll wieder auf den ersten Datensatz der zugrundeliegenden Tabelle springen..

Kann mir da jemand helfen??

Mike
10.05.2001, 16:17
Du solltest erst mal den Fehler untersuchen, der bei 'Case Else' kommt.
Mit Err.Number oder Err.Description.
Mike

Mike
10.05.2001, 16:19
PS: Der Fehler 3022 bedeutet:

Die von Ihnen vorgenommenen Änderungen an der Tabelle konnten nicht vorgenommen werden, da der Index, Primärschlüssel oder die Beziehung mehrfach vorkommende Werte enthalten würde. Ändern Sie die Daten in den Feldern, die gleiche Daten enthalten, entfernen Sie den Index, oder definieren Sie den Index neu, damit doppelte Einträge möglich sind, und versuchen Sie es erneut.

sLUmp
10.05.2001, 17:04
Danke für die Antwort.
Habe das Problem selber schon gelöst
Hier ist der neu Hinzugekommene/veränderte Code:

Private Sub f_m_OK1_Click()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Monatsbericht", dbOpenDynaset)


If Not IsNull([MO-IDNr]) Then
suchkriterium = "[Projekt-ID] =" & Str([MO-IDNr]) & " AND " & "[Berichtsmonat] = " & "#" & Format(zusammenfügen, "mm-dd-yyyy") _
& "#"
rs.FindFirst suchkriterium
If rs.NoMatch = False Then
rs.Close
db.Close
MsgBox "Dieser Monatsbericht existiert schon!", , "Doppelter Monatsbericht"
Exit Sub
End If
End If

rs.Close
db.Close

gibt es eine generelle Regelung wie man eine Fehlerbehandlung durchführen kann, und wo kann man sich die Fehlermeldungen für die Fehlercodes anschauen?

Thx schon im Voraus

Nockenwelle
10.05.2001, 22:12
Hi,


vielleicht klappt es diesmal auch (Ich hatte probs mit der Verbindung zur Site)

zur Anfrage:
mit
Accesserror(1235)

bekommst du die Meldung als Text im Testfenster angezeigt.
In der OH stehen auch die Meldungen und einige Hinweise. Schau mal unter

Fehler-Schlüsselworte
und
Auffangbare Fehler

Um festzustellen, wo ein Fehler aufgetaucht ist, mache mir oft einen Haltepunkt in der Fehlersektion(siehe unten). Die Fehlermeldung hat man da ja schon bekommen. Meistens hängt es dann dann an Kleinigkeiten: Nullwerte nicht abgefangen etc.
Allgemeine Regeln zum Fehlerabfangen kenne ich nicht. Ich habe mir eine Fehlerroutine besorgt, die Fehler zusätzlich in eine Datei schreibt. Ist Praktisch, wenn es zum Anwender geht, und da was passiert(ist vielleicht noch Erweiterungsfähig).


Option Compare Database
Option Explicit

'-- Konstanten zur Programmeinstellung

'--
'--- Trenner für die Argumente bei der Übergabe an Formulare

'hier gehört Pfad und Dateiname hinein. benutze im Netz den UNC-Pfad.
' Ich hatte auch schon Fälle, wo der Errorhändler selbst den Fehler verursacht hatte,
' weil ein Benutzer zum lesen und schreiben keine Berechtigung auf die Datei Error.txt hatte.


Global Const glr_strErrorFile = "c:\temp\Error.txt"
Global Const glr_iastrProcNamesMax = 16

Global Const MB_OK = 0
Global Const MB_ICONEXCLAMATION = 48
Global Const MB_ICONINFORMATION = 64
Global Const MB_DEFBUTTON1 = 0
Global Const MB_APPLMODAL = 0

Global glr_astrProcNames(glr_iastrProcNamesMax) As String
Global glr_iastrProcNames As Integer


Option Compare Database 'Use database order for string comparisons
Option Explicit


Sub glrAssert(ByVal f As Long)
If Not f Then
Call glrErrorOutput(32767, "Unbekannter Fehler")
End If
End Sub

Sub glrEnterProcedure(ByVal strProcName As String)
Call glrAssert(glr_iastrProcNames < glr_iastrProcNamesMax)
glr_iastrProcNames = glr_iastrProcNames + 1
glr_astrProcNames(glr_iastrProcNames) = strProcName
End Sub

Sub glrErrorOutput(ByVal intErr As Integer, ByVal varError As Variant)
Dim db As Database
Dim iastrProcNames As Integer, FMeldung As String

Set db = DBEngine.Workspaces(0).Databases(0)
FMeldung = "In der Anwendung trat ein Fehler auf." & vbCrLf & vbCrLf
Open glr_strErrorFile For Append As #1
Print #1, Format(Now, "dd/mm/yy hh:nn") & " " & db.Name & " " & currentUser() & " Error #" & intErr & " " & varError
FMeldung = FMeldung & "FEHLERBESCHREIBUNG:" & vbCrLf
FMeldung = FMeldung & "Datum: " & Format(Now, "dd/mm/yy hh:nn") & vbCrLf
FMeldung = FMeldung & "FehlerNr.: " & intErr & vbCrLf
FMeldung = FMeldung & "** " & varError
Print #1, "Aufrufe:"
For iastrProcNames = glr_iastrProcNames To 0 Step -1
Print #1, glr_astrProcNames(iastrProcNames)
Next iastrProcNames
Close #1
MsgBox FMeldung, MB_OK Or MB_ICONEXCLAMATION Or MB_DEFBUTTON1 Or MB_APPLMODAL
End Sub

Sub glrExitProcedure(ByVal strProcName As String)
Call glrAssert(strProcName = glr_astrProcNames(glr_iastrProcNames))
Call glrAssert(glr_iastrProcNames > 0)
glr_astrProcNames(glr_iastrProcNames) = ""
glr_iastrProcNames = glr_iastrProcNames - 1
End Sub


So, um mal künstlich einen Fehler zu erzeugen:


Public Function Fehlertest()
Call glrEnterProcedure("Fehlertest")
On Error GoTo Err_Fehlertest
Dim DB As Database
Dim Fehler As Recordset
Set DB = CurrentDb

If 1 = 0 Then
Set Fehler = DB.OpenRecordset("Tabelle")
End If
Fehler.Close
Set DB = Nothing

Exit_Fehlertest:
Call glrExitProcedure("Fehlertest")
Exit Function

Err_Fehlertest:
Call glrErrorOutput(Err, Error$)
Resume Exit_Fehlertest


End Function


Fehler.Close erzeugt einen Fehler, weil das recordset noch gar nicht geöffnet wurde(das war in letzter Zeit einer meiner beliebtesten Klamotten ;-).
Um den Errorhändler zu benutzen, mußt du jeweils das Wort 'Fehlertext' durch deinen Prozedurnamen ersetzen, ansonsten läuft der in die Schleife mit der Meldung 'unbekannter Fehler' hinein.

Cu