Hi,
bin mal wieder am verzweifeln.
Ich habe eine tblSchicht dort wird das Datum, die schifo_id_f und der sle_id_f erfasst.
Nun möchte ich, wenn das Datum und die schifo_id_f gleich sind, keinen Eintrag zulassen!
Habe das über den Index versucht aber bekomme das nicht hin oder ist das der falsche Weg?
Hallo,
Indexierung ist schon das richtige. Du benötigst einen eindeutigen Index über das Datum und die schifo_id_f. In der Access Hilfe ist das gut beschrieben (>Index) wie das geht.
Überhaupt, sollte man die Access Hilfe nicht unterschätzen, die ist besser als ihr Ruf.
Hi,
danke für den Hinweis der Hilfe die ist besser als alles, was ich hierzu gefunden hatte.
Den Fehler, den ich gemacht hatte war, dass ich für den zweiten Feldnamen einen extra Indexnamen angelegt hatte, unlogisch wo man jetzt weiß, dass der leer bleiben muss.
Kann ich die Fehlermeldungen, die Access dann auswirft, umgestallten oder selbst schreiben?
Hallo Dietmar,
du kannst das Error-Ereignis des Formulars dazu nutzen. Fehlercode abfragen und bei Bedarf eigene Meldung ausgeben. Beachte dabei den zu setzenden Response-Wert.
Hi,
Danke für deine Antwort.
Kannst du mir das einwenig genauer erklären?
Habe in den Formulareigenschaften Bei Fehler gefunden ist, dass das was du meinst?
Private Sub Form_Error(DataErr As Integer, Response As Integer)
End SubUnd was meinst du mit
ZitatBeachte dabei den zu setzenden Response-Wert.
was genau ist zu tun?
Ich mache einige Fortschritte in Sachen Access dank eurer Unterstützung hier, aber so weit bin ich noch nicht!::)
Hallo Dietmar,
ich vermisse etwas mehr Eigeninitiative bei dir. Erläuterungen zum Error-Ereignis und der dazugehörigen Ereignisprozedur lassen sich in der Access-Hilfe finden (Aufruf aus dem VBA-Editor heraus). Da siehst du dann auch, was mit Response-Wert gemeint ist.
Hallo,
so bin nun ein Stück weiter, aber noch nicht am Ziel :-\
Ich habe gelernt das ich mit dem DataErr die Nummer des Fehlers ermitteln kann und das ich mit Response die Access Fehlermeldung unterdrücken kann, mit der Anweisung Response = acDataErrContinue.
Nun habe ich folgenden Code geschrieben
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Select Case DataErr
Case 3022 'Ungültiges Datum und Schichtfolge
MsgBox "Datum mit Schichtfolge existieren schon!"
Response = acDataErrContinue
Case Else
MsgBox DataErr
End Select
End Sub
der funktioniert nur beim Speichern oder schließen der gesamten Datei. Wie kann ich das jetzt mit dem Button Datensatz speichern erreichen?
Hallo,
statt zu reagieren, wenn es schon zu spät ist, könnte eine vorlaufende Pruefung auf ein vorhandenes Datum im BeforeUpdate-Ereignis stattfinden...
Den letzten Hinweis möchte ich dick unterstreichen. Programmsteuerung über Fehler ist regelmäßig unerträglich.
Wenn man gezielt auf einen bestimmten Fehler reagieren kann, kann man auch in den allermeisten Fällen vorher den Zustand, der zum Fehler führen kann, prüfen und somit entsprechende Ausweichstrategien anwenden.
Eine Fehlerbehandlung sollte vorrangig unerwartete Fehler abfangen. Meinen Airbag jedenfalls fahre ich lieber spazieren statt ihn in Anspruch zu nehmen.
Hallo
und danke für die Hinweise. An die Before Update habe ich auch schon gedacht, nur weiß ich nicht wie ich in der If die beiden Werte überprüfen kann könnt ihr mir auf die Sprünge helfen?
Private Sub Form_BeforeUpdate(Cancel As Integer)
If ........................Then
MsgBox Datum mit Schichtfolge bereits vorhanden!"
Cancel = True
End If
End Sub
If DCount("*", "tblSchicht", "Datum = " & Format(Me.txtDatum, "\#yyyy-mm-dd\#") & _
" AND schifo_id_f = " & Me.txt _schifo) > 0 Then ...
Man könnte aber auch benutzerfreundlicher arbeiten, indem man dem User nur noch freie Datum-ID- Varianten zur Auswahl anbietet. Dann muss man nicht mehr mitteilen, dass eine Auswahl falsch + umsonst war.
Hallo Eberhard,
Danke für deine Antwort.
ZitatMan könnte aber auch benutzerfreundlicher arbeiten, indem man dem User nur noch freie Datum-ID- Varianten zur Auswahl anbietet. Dann muss man nicht mehr mitteilen, dass eine Auswahl falsch + umsonst war.
Wie kann ich das denn umsetzen?
Das könnte so aussehen:
Man verwendet eine Kalendertabelle (http://www.ms-office-forum.net/forum/showthread.php?t=298670), kombiniert die Datumswerte mit den möglichen Schichten (=> Kreuzprodukt) und erhält eine vollständige Menge an Kombinationen.
Von dieser vollständigen Menge zieht man die vorhandenen Kombinationen (Inhalt tblSchicht) ab. Mittel dazu wäre eine Inkonsistenzabfrage (http://www.donkarl.com?FAQ3.16).
Diese Abfrage wäre dann die Datenherkunft für eine Auswahl, die man bspw. in einem Listenfeld darstellt.
Die Abfrage etwas frei formuliert:
SELECT
V.Datum,
V.Schicht
FROM
(
SELECT
K.Datum,
S.Schicht
FROM
Kalendertabelle AS K,
Schichttabelle AS S
WHERE
K.Datum BETWEEN Date()
AND
Date() + 7
) AS V
LEFT JOIN tblSchicht AS X
ON V.Datum = X.Datum
AND
V.Schicht = X.Schicht
WHERE
X.Datum IS NULL
Hallo zusammen,
ich trete auf der Stelle die letzte Variante hört sich nicht schlecht an, aber im Moment ein wenig zu kompliziert für mich als Anfänger :-[
So habe jetzt folgenden Code geschrieben
Private Sub Form_BeforeUpdate(Cancel As Integer)
If DCount("*", "tbl_schicht", "schicht_datum = " & Format(Me.schicht_datum, "\#yyyy-mm-dd\#") & _
" AND schifo_id_f = " & Me.Schichtfolge) > 0 Then
MsgBox "Datum mit Schichtfolge bereits vorhanden!"
Cancel = True
End If
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Select Case DataErr
Case 3022
Response = acDataErrContinue
MsgBox "Datum mit Schichfolge existiert bereits!. " _
& "Bitte geben Sie ein neues Datum ein."
Case Else
Response = acDataErrDisplay
End Select
End Sub
Es kommt, wenn ich den Datensatz speicher, richtigerweise die Fehlermeldung "Datum mit Schichtfolge bereits vorhanden!" dann bestätige ich mit OK und es kommt die Meldung "Kein aktueller Datensatz", so wenn ich jetzt auf neuen Datensatz anlegen gehe kommt wieder die Fehlermeldung "Datum mit Schichtfolge bereits vorhanden!" dann bestätige ich mit OK und es kommt die Meldung Sie können nicht zu dem Datensatz springen was kann ich tun, um das sauber abzuwickeln?
Hallo,
kommentiere zunächst den Code in Form_Error aus.
Wenn "Datum mit Schichtfolge bereits vorhanden!" erscheint, gibt es in der Tabelle schon einen Datensatz mit dem schicht_datum aus "Me.schicht_datum" und dem ID-Wert aus "Me.Schichtfolge".
Überprüf das mal...
Hi und danke für die Antwort,
wollte mich nur kurz melden liege nach einem Motorradunfall im Krankenhaus und melde mich wieder sobald ich einigermaßen fit bin. Danke
Hallo zusammen,
bin soweit das ich wieder eine Tastatur bedienen kann ::)
Rolle das Thema noch mal von vorne auf.
Ich habe eine Tabelle tbl_schicht in der ich das Datum die Schichtfolge und den Schichtleiter erfasse.
Über den Index habe ich geregelt, dass ein Datensatz mit gleichem Datum und gleicher Schichtfolge nicht möglich ist.
Das klappt auch!
Das Formular ist so aufgebaut, das ich über einen Button einen neuen Datensatz anlegen kann alle Felder werden geleert und ich kann loslegen. Auch das funktioniert.
Nun gebe ich einen neuen Datensatz ein sollte er kein doppeltes Datum in Verbindung mit der Schichtfolge haben, wird dieser über den Speichebutton gespeichert. Auch das klappt.
Problem:
Sollte ein Datum in Verbindung mit einer Schichtfolge existieren kommt im Normalfall richtigerweise eine Fehlermeldung aus Access die ich mit Response=acDataErrContinue abfange und mit einer MsgBox "Datum mit Schichtfolge existiert schon" als User freundliche Meldung kommentiere.
Wie bekomme ich es hin das meine Eingabefelder nach meiner MsgBox wieder komplett leer sind Me!schicht_datum.Undo oder .Set Focus klappt nicht.
Hier mein aktueller Code:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Response = acDataErrContinue
If DCount("*", "tbl_schicht", "schicht_datum = " & Format(Me.schicht_datum, "\#yyyy-mm-dd\#") & _
" AND schifo_id_f = " & Me.Schichtfolge) > 0 Then
MsgBox "Datum mit Schichtfolge bereits vorhanden!" _
& "Bitte neues Datum eingeben!"
Me!schicht_datum.Undo
Me!Schichtfolge.Undo
Me!Schichtleiter.Undo
Cancel = True
End If
End Sub
Hallo,
versuch mal:
Me.Undo
Me.Undo
Hi DF6GL,
danke das klappt, ich dachte das ich jedes Feld mit Namen ansprechen muss.