Neuigkeiten:

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

Mobiles Hauptmenü

Genaue Rückmeldung bei Duplikateintrag

Begonnen von FenFire, Dezember 15, 2023, 18:54:37

⏪ vorheriges - nächstes ⏩

FenFire

Hallo,
ich habe eine Tabelle Unterricht wie im Anhang ersichtlich. Räume, Lehrer und Klassen dürfen zur gleichen Stunde nicht zwei verschiedene Einträge haben. Das habe ich soweit auch wunderbar mit Indizes (siehe Anhang) hinbekommen - wird eine entsprechende Zeile eingetragen, erscheint eine (allgemeine) Fehlermeldung.
Nun möchte ich aber, dass Access (möglichst direkt bei der Eingabe) eine detailliertere Rückmeldung gibt. Wird z.B. in die Beispieltabelle im Anhang eine Zeile eingetragen mit Tag: Mo, Stunde: 1, Lehrer: RU (nicht vorhanden), Raum: 322, dann sollte eine Meldung "Raumkollision" erscheinen, am besten noch mit dem Datensatz (z.B. Der gewählte Raum kollidiert mit 5a, WU, 322). Wie kann ich das mithilfe eines Makros umsetzen?
Danke im Voraus!

ebs17

#1
ZitatWie kann ich das mithilfe eines Makros umsetzen?
Das ist ein Totschlagargument für Antworten. Nicht sehr viele beschäftigen sich mit den wenigleistenden Makros und haben so nicht die Fähigkeit, einen Vorschlag aus dem Handgelenk zu schütteln.

Im normalen Fall hat man zwei Wege.
1) Beim Speichern gegen einen eindeutigen Index in der Tabelle bekommt man einen Fehler und muss diesen auswerten (Form_Error), z.B. über die gewünschte Meldung - vom System eigenerzeugte Meldungen sind regelmäßig schwer verständlich für User.
2) Man prüft vor dem Speichern in die Tabelle (Form_BeforeUpdate) auf ein ggf. vorhandenes Duplikat und bricht dann fallbedingt das Speichern ab mit Meldung.

In dem, was Du zeigst, sind aber schon eine Menge Problemstellen enthalten.
- Über welche Zeiträume soll Deine DB arbeiten? Dir ist bewusst dass jede neue Woche einen Montag hat und sich daher zwangsläufig Dopplungen nach diesen Kriterien ergeben müssen? Du solltest mit einem Datum arbeiten. Davon lassen sich direkt Formate wie Wochentag und Woche, Monat, Jahr, Quartal u.a. ableiten.
- Es ist schön und interessant, dass Du Dich mit Mehrfelderindizes beschäftigt hast. In der gezeigten Form hast Du aber das wohl Schlechteste ausgewählt. Beispiel Index Raum:
Dieser wirkt in der Reihenfolge Tag, Stunde, Raum. Er wirkt auch bei weniger Feldern, aber immer von vorn, also für die Kombi Tag + Stunde oder nur für Tag. Für die gezielte Nutzung auf das Feld Raum, immerhin namensgebend, ist da nichts geeignetes vorhanden.



Mit freundlichem Glück Auf!

Eberhard

FenFire

Hallo Eberhard,

erstmal vielen Dank für die Antwort.
Ich wusste nicht, dass Makros in Access nervig sind - tatsächlich habe ich noch nicht einmal eine einfache Reaktion hinbekommen. Aber wie könnte ich es sonst machen? Ich habe die in Access 2019 (von mir genutzte Ergebnisse) eng gefassten Vorabereignisse probiert (m.E. im Grund auch nichts anderes als Makro in deutschem Pseudocode), bin aber auch nicht weitergekommen.

Die genannten Probleme sind - denke ich - nicht relevant, denn ...
... es handelt sich um ein Planungsmodul für eine (einzige) Projektwoche, die mit unserem Stundenplan-Programm nicht sinnvoll abbildbar ist. Daher kann das Datum selbst entfallen.
... das mit den Indizes kann ich nicht bestätigen. Ich hab bereits parallele Unterrichte eingetragen (gleicher Tag und gleiche Stunde), ist kein Problem. Kommt jedoch ein gleicher Raum dazu, erscheint die allgemeine Fehlermeldung.

Deine zwei Vorschläge beziehen sich ja auch ein Makro. Kann ich mit dem Vorgehen im Bild etwas anfangen? Wie müsste z.B. die Bedingungen lauten, so dass Access den Datensatz findet, der in Tag, Stunde und Raum mit der Eingabe übereinstimmt?

ebs17

Mit freundlichem Glück Auf!

Eberhard

FenFire

Hallo nochmal,

vielen Dank für die Aufklärung. Ich dachte (um ehrlich zu sein), dass auch VBA-Code ein Makro ist. Sonst hätte ich die Frage gleich anders gestellt.
Habe es mittlerweise selbst gelöst. Hier ist der Code:

Private Sub Raum_BeforeUpdate(Cancel As Integer)
    Dim strSQL As String
    Dim duplicateCount As Integer
    Dim collidingRecord As String

    ' Überprüfen, ob es bereits einen Datensatz mit denselben Werten für Tag, Stunde und Raum gibt
    strSQL = "SELECT * FROM Unterricht " & _
             "WHERE Wochentag = '" & Me.Wochentag & "' AND Stunde = " & Me.Stunde & " AND Raum = '" & Me.Raum & "'" & _
             " AND ID <> " & Me.ID

    Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset(strSQL)

    ' Wenn es bereits einen Datensatz gibt, zeige eine Meldung an und breche die Aktualisierung ab
    If Not rs.EOF Then
        rs.MoveFirst
        collidingRecord = "Raumkollision mit Unterricht von " & vbCrLf & _
                          rs!Lehrer & " in Klasse " & rs!Klasse

        MsgBox collidingRecord, vbExclamation
        Cancel = True
    End If

    rs.Close
    Set rs = Nothing

End Sub