Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

bei Neueingabe Datensatz Primärschlüsselverletzung vermeiden

Begonnen von hajott, Juni 16, 2023, 18:46:41

⏪ vorheriges - nächstes ⏩

hajott

Hallo Wissende,

ich habe ein Formular, das ich mit eurer Hilfe schon ganz gut hinbekommen habe. Hier suchen die Anwender mittels dem Filter die Datensätze oder fügen neue hinzu. Es gibt einen Primärschlüssel namens "Referenznummer", der bei Update oder (Neu) nicht verletzt werden darf.

Zunächst dachte ich, ich sperre das Feld, damit der Primärschlüssel nicht verändert wird. Das geht aber nicht, denn bei Neuanlage muss der Anwender die Referenznummer eingeben können (sie ist bei einem neuen Vorgang garantiert auch abweichend, aber ich möchte trotzdem den Fehler abfangen). Wenn der Mitarbeiter eine bereits verwendete Referenznummer eingibt, fällt das auch "erst" auf, wenn der Datensatz übernommen wird. Der Fehler sperrt alles. Ich habe eine "halbseidene" Lösung, dass ich bei Aktualisierung den Fehler 3022 abfange, einen Text ausgebe und die Eingabe ausnulle.

Ich finde es aber doof, wenn die Schlüsselfeldverletzung erst beim Hinzufügen auffällt. Meine Überlegung ist nun:

Private Sub txtReferenznummer_AfterUpdate()
   IF txtReferenznummer IN (...?) THEN
      Msgbox "Referenznummer bereits vorhanden!"
      txtReferenzummer = NULL
   END IF
End Sub

Wie formuliere ich das in Klammern am besten? Muss ich da einen neuen Recordset anlegen, mit der Datenbank füllen und durchsuchen, oder geht das auch kürzer? Das Feld Referenznummer ist in aktuellen Recordset ja vorhanden, aber ich weiß grad nicht, wie ich das abfrage.

Vielen Dank!

Hans-Jürgen

     

MzKlMu

Hallo,
Du musst mit DCount nur zählen, ob die Ref.nummer in der Tabelle vorhanden ist.
Wenn die Zählung >0 ergibt ist die Ref.nummer vorhanden.

Es sollte auch das Ereignis "Vor Aktualisierung" verwendet werden, nach Aktualisierung ist zu spät.

Welcher Datentyp ist denn die Referenznummer ?
Gruß Klaus

ebs17

Wie ist die Referenznummer aufgebaut? Welche Regeln gibt es zur Erzeugung?

Statt den User etwas eingeben zu lassen und ihm dann ggf. mitzuteilen, dass das falsch und umsonst war und er von vorne anfangen kann, könnte man dem User helfen und gleich eine richtige Nummer vorbelegen - so wie das in einfachen Fällen ein Autowert tut.
Mit freundlichem Glück Auf!

Eberhard

hajott

Hallo zusammen,

sorry für die verspätete Reaktion, ich war übers Wochenende krank.

Danke MzKiMu, der Dreh zu "DCount" war das, was ich gesucht habe. Ich habe mit diesem Stichwort auch ein Posting von dir gefunden, was ich direkt als Vorlage nehmen konnte:
hier

Für eventuelle Mitleser (und auch mich, falls ich das mal wieder vergesse) hier meine DCount-Zeile, denn im Gegensatz zum verlinkten Post ist das gesuchte Feld bei mir ein String und man muss an den richtigen Stellen Hochkommata und Anführungsstriche streuen: If DCount("*", "tbl1_Akten", "Referenznummer='" & Me!txtReferenznummer & "'") > 0 Then
Viele Grüße und vielen Dank

Hans-Jürgen

MzKlMu

#4
Hallo,

nur als Hinweis :
Ein String ist als PS eher ungeeignet. Außerdem sollte ein PS keine weitere Bedeutung haben. Ein Autowert ist daher als Zahl (Longinteger) der ideale PS.
Da besteht auch von Haus aus keine Möglichkeit doppelten Werte anzulegen.
Auf die Referenznummer legt man dann einen eindeutigen Index.
Gruß Klaus