Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

zusammhängende doppelte Eintrage verhindern

Begonnen von Dietmar, November 28, 2014, 10:03:08

⏪ vorheriges - nächstes ⏩

Dietmar

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?
Gruß
Dietmar

MzKlMu

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.
Gruß Klaus

Dietmar

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?
Gruß
Dietmar

MaggieMay

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.
Freundliche Grüße
MaggieMay

Dietmar

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 Sub

Und 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!::)
Gruß
Dietmar

MaggieMay

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.
Freundliche Grüße
MaggieMay

Dietmar

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?
Gruß
Dietmar

DF6GL

Hallo,

statt zu reagieren, wenn es schon zu spät ist, könnte eine vorlaufende Pruefung auf ein vorhandenes Datum im BeforeUpdate-Ereignis stattfinden...

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Dietmar

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
Gruß
Dietmar

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Dietmar

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?

Gruß
Dietmar

ebs17

Das könnte so aussehen:
Man verwendet eine Kalendertabelle, 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.
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
Mit freundlichem Glück Auf!

Eberhard

Dietmar

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?
Gruß
Dietmar

DF6GL

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...