{"id":55001377,"date":"2022-08-01T00:00:00","date_gmt":"2022-08-04T18:11:37","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1377"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Nummern_fuer_Bestellungen_et_cetera_generieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/","title":{"rendered":"Nummern f&uuml;r Bestellungen et cetera generieren"},"content":{"rendered":"<p><b>In vielen Beispieltabellen, die wir in diesem Magazin vorstellen, verwenden wir einfach das Prim&auml;rschl&uuml;sselfeld als Kundennummer, Bestellnummer und so weiter. In manchen F&auml;llen ist das nicht praktikabel, weil diese Nummern nach bestimmten anderen Regeln erstellt werden m&uuml;ssen. Dann bietet es sich an, dennoch ein Prim&auml;rschl&uuml;sselfeld mit Autowertfunktion zu nutzen, um die Datens&auml;tze eindeutig zu identifizieren und dieses auch f&uuml;r das Herstellen von Beziehungen zu nutzen. Die Kundennummern oder Bestellnummern m&ouml;chte man aber dennoch nicht von Hand eingeben, sondern die Datenbank soll das erledigen. Wie Sie das realisieren k&ouml;nnen, zeigt der vorliegende Beitrag.<\/b><\/p>\n<h2>Individuelle Nummern<\/h2>\n<p>Die Datenbankwelt w&auml;re einfach, wenn man immer ein Prim&auml;rschl&uuml;sselfeld mit Autowert als einziges eindeutiges Merkmal von Datens&auml;tzen nutzen k&ouml;nnte. Aber die Realit&auml;t sieht anders aus. Manchmal gibt schon die Historie einer Anwendung vor, dass Kundennummern, Bestellnummern, Produktnummern und so weiter nach einem bestimmten Format generiert werden m&uuml;ssen, das nicht selten nicht nur Zahlen, sondern auch Buchstaben enth&auml;lt.<\/p>\n<p>Damit ist die Autowert-Funktion, die sich f&uuml;r die Ermittlung der Werte f&uuml;r Prim&auml;rschl&uuml;sselfelder anbietet, &uuml;berfordert &#8211; sie liefert nur Werte der Typen <b>Long Integer <\/b>oder <b>Replikations-ID <\/b>(sprich: GUID), und das im Falle der Zahlenwerte entweder aufsteigend oder zuf&auml;llig.<\/p>\n<p>Oft enthalten die verschiedenen Nummernkreise ein bestimmtes, aus Buchstaben bestehendes K&uuml;rzel, damit man direkt erkennen kann, ob es sich um eine Bestellnummer, eine Kundennummer oder andere Informationen handelt.<\/p>\n<p>Wir sollten also in der Lage sein, mithilfe einer Funktion oder anderen technischen M&ouml;glichkeiten Werte f&uuml;r die gew&uuml;nschten Anforderungen zu ermitteln.<\/p>\n<p>Diese Anforderung k&ouml;nnte beispielsweise lauten, dass wir Werte ben&ouml;tigen, die mit dem Buchstaben <b>A <\/b>beginnen und  danach aus acht Ziffern bestehen. Welche Herausforderungen k&ouml;nnen wir daraus ableiten?<\/p>\n<p>Wir gehen davon aus, dass die Werte m&ouml;glichst aufsteigend sein sollen, das hei&szlig;t, dass der numerische Anteil so ermittelt wird, dass wir den bisher gr&ouml;&szlig;ten Wert herausfinden und diesem <b>1<\/b> hinzuaddieren. Auf <b>A00000001 <\/b>soll also <b>A00000002 <\/b>folgen. Das w&auml;re alles kein Problem, wenn wir es mit einem Zahlenfeld zu tun h&auml;tten &#8211; wir w&uuml;rden dann einfach mit <b>DMax <\/b>den gr&ouml;&szlig;ten bisher vergebenen Wert ermitteln und diesen als Grundlage nutzen.<\/p>\n<p>Ein m&ouml;glicher Weg, dies zu umgehen, ist die Ableitung vom Prim&auml;rschl&uuml;sselwert. Wie gesagt, wollen wir ein Prim&auml;rschl&uuml;sselfeld mit Autowert als erstes eindeutiges Merkmal eines jeden Datensatzes nutzen, die zus&auml;tzliche Nummer (Kundennummer, Bestellnummer, &#8230;) ist nur eine weitere eindeutige Information. Wir k&ouml;nnen unsere Nummer also auch zusammensetzen aus dem Buchstaben <b>A<\/b>, dem Prim&auml;rschl&uuml;sselwert und dazwischen eine Reihe Nullen, sodass wir das gew&uuml;nschte Format von einer L&auml;nge von neun Zeichen erhalten. Beim Prim&auml;rschl&uuml;sselwert <b>123 <\/b>also beispielsweise <b>A <\/b>plus <b>00000 <\/b>plus <b>123 <\/b>gleich <b>A00000123<\/b>.<\/p>\n<p>Wir schauen uns im Folgenden diesen Weg an und gehen von einer Kundennummer im oben genannten Format aus.<\/p>\n<h2>Kundennummer auf Basis des Prim&auml;rschl&uuml;sselwertes<\/h2>\n<p>Im Beispiel verwenden wir eine Tabelle namens <b>tblKunden<\/b>, deren Prim&auml;rschl&uuml;sselfeld namens <b>ID <\/b>als <b>Autowert<\/b>-Feld definiert ist. Das Feld <b>Kundennummer<\/b> haben wir als eindeutiges Feld definiert (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_001.png\" alt=\"Einrichtung der Kundennummer als Feld mit einem eindeutigen Index\" width=\"524,559\" height=\"383,222\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einrichtung der Kundennummer als Feld mit einem eindeutigen Index<\/span><\/b><\/p>\n<p>Nun wollen wir daf&uuml;r sorgen, dass m&ouml;glichst automatisch beim Anlegen eines neuen Datensatzes auch das Feld <b>Kundennummer <\/b>mit einem Wert gef&uuml;llt wird, der das oben beschriebene Format enth&auml;lt.<\/p>\n<p>Unsere erste Idee war, die <b>Format<\/b>-Funktion als Standardwert f&uuml;r das Feld <b>Kundennummer <\/b>zu nutzen. Dort wollten wir einen Eintrag wie den folgenden hinterlegen:<\/p>\n<pre>=Format([ID];\"A00000000\")<\/pre>\n<p>Wie wir schnell herausgefunden haben, funktioniert das nicht, weil man f&uuml;r das Zuweisen von Standardwerten einfach nicht auf die anderen Feldwerte zugreifen kann.<\/p>\n<h2>Kundennummer per Datenmakro<\/h2>\n<p>Also nutzen wir eines der Tabellenereignisse der Tabelle, in diesem Fall zun&auml;chst mit dem Ereignis <b>Vor &Auml;nderung<\/b>. Hier wollten wir pr&uuml;fen, ob der Datensatz soeben angelegt wurde und dann aus dem Wert des Feldes <b>ID<\/b> die gew&uuml;nschte Kundennummer zusammenstellen. Dies zeigte sich als falscher Ansatz, da das Feld <b>ID <\/b>zu diesem Zeitpunkt noch nicht gef&uuml;llt ist.<\/p>\n<p>Um dies herauszufinden, haben wir f&uuml;r das Ereignis <b>Vor &Auml;nderung <\/b>das Datenmakro aus Bild 2 angelegt. Hier pr&uuml;fen wir in einem ersten Schritt, ob es sich bei der &Auml;nderung um das Anlegen eines neuen Datensatzes handelt. In diesem Fall liefert <b>[IstEingefuegt] <\/b>den Wert <b>True <\/b>und die Aktionen innerhalb des <b>Wenn<\/b>-Konstrukts werden ausgef&uuml;hrt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_002.png\" alt=\"Makro, um herauszufinden, ob das Feld ID beim Ereignis Vor &Auml;nderung bereits gef&uuml;llt ist.\" width=\"649,559\" height=\"266,0376\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Makro, um herauszufinden, ob das Feld ID beim Ereignis Vor &Auml;nderung bereits gef&uuml;llt ist.<\/span><\/b><\/p>\n<p>Hier haben wir, um eine Meldung zu generieren, die Aktion <b>Ausl&ouml;senFehler <\/b>missbraucht. Diese soll einen Text ausgeben, der sowohl den Wert des Feldes <b>ID <\/b>als auch den des Feldes <b>Firma<\/b> enth&auml;lt.<\/p>\n<p>Wie das Ergebnis aus Bild 3 zeigt, wird zwar der neue Datensatz referenziert, aber das Feld <b>ID <\/b>ist zu diesem Zeitpunkt noch leer. Mit diesem Datenmakro k&ouml;nnen wir die Aufgabe also nicht l&ouml;sen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_003.png\" alt=\"Ergebnis des Makros Vor &Auml;nderung\" width=\"474,5589\" height=\"212,6987\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ergebnis des Makros Vor &Auml;nderung<\/span><\/b><\/p>\n<p>Da das Makro auch das Speichern des Datensatzes unterbindet, entfernen wir seinen Inhalt wieder.<\/p>\n<p>Anschlie&szlig;end haben wir es mit dem Datenmakro f&uuml;r das Ereignis <b>Nach Einf&uuml;gung <\/b>probiert. Hier haben wir zuerst die Makroaktion <b>NachschlagenDatensatz <\/b>verwendet, um den neuen Datensatz zu referenzieren. Diesen haben wir dann mit der Methode <b>DatensatzBearbeiten <\/b>bearbeitet, indem wir f&uuml;r das Feld <b>Kundennummer<\/b> einen Wert eingestellt haben, der aus dem Buchstaben <b>A <\/b>und dem Wert des Feldes <b>ID <\/b>des neuen Datensatzes besteht (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_004.png\" alt=\"Das Datenmakro f&uuml;r das Ereignis Nach Einf&uuml;gung\" width=\"524,559\" height=\"449,1668\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Datenmakro f&uuml;r das Ereignis Nach Einf&uuml;gung<\/span><\/b><\/p>\n<p>Das Ergebnis entspricht noch nicht ganz unseren Anforderungen, denn wir stellen im Feld <b>Kundennummer <\/b>ja zun&auml;chst nur den Buchstaben <b>A <\/b>mit dem neuen Wert f&uuml;r das Feld <b>ID <\/b>zusammen, also zum Beispiel <b>A1<\/b>, <b>A2 <\/b>und so weiter (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_005.png\" alt=\"Ergebnis des Datenmakros\" width=\"424,5589\" height=\"148,8974\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ergebnis des Datenmakros<\/span><\/b><\/p>\n<p>Wir wollen aber eigentlich die Kundennummer beispielsweise wie <b>A00000001 <\/b>erhalten. Warum haben also nicht einfach die <b>Format<\/b>-Funktion verwendet? Ganz einfach: Die <b>Format<\/b>-Funktion steht in Datenmakros nicht zur Verf&uuml;gung. Hier finden wir nur Eintr&auml;ge wie <b>FormatDatumZeit<\/b>, <b>FormatProzent<\/b>, <b>FormatW&auml;hrung <\/b>und <b>FormatZahl<\/b>.<\/p>\n<p>Also gehen wir einen kleinen Umweg und verwenden f&uuml;r den Parameter <b>Wert <\/b>in der Makroaktion <b>FestlegenFeld <\/b>den folgenden Ausdruck:<\/p>\n<pre>\"A\" & Rechts(\"0000000\" & [rstKunden].[ID];8)<\/pre>\n<p>Dies f&uuml;gt zun&auml;chst eine Zeichenfolge aus sieben Nullen (<b>0000000<\/b>) mit der <b>ID <\/b>zusammen. Wenn die <b>ID <\/b>noch einstellig ist, passt das Ergebnis gem&auml;&szlig; unseren Anforderungen. Sobald sie aber zweistellig ist, erhalten wir eine Zeichenkette aus sieben Nullen und der <b>ID<\/b>, also beispielsweise <b>000000012<\/b>, was in diesem Fall neun Stellen entspricht. Hier schneiden wir die &uuml;berfl&uuml;ssigen Nullen ab, indem wir mit der <b>Rechts<\/b>-Funktion nur die rechten acht Zeichen ermitteln. Stellen wir diesem noch den Buchstaben <b>A <\/b>voran, erhalten wir schlie&szlig;lich das gew&uuml;nschte Format (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_006.png\" alt=\"Kunden mit korrekter Kundennummer\" width=\"424,5589\" height=\"145,1653\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Kunden mit korrekter Kundennummer<\/span><\/b><\/p>\n<h2>Vor- und Nachteile dieser L&ouml;sung<\/h2>\n<p>Mit dieser L&ouml;sung stellen Sie sicher, dass das Feld <b>Kundennummer<\/b> direkt beim Anlegen eines Datensatzes mit einer Kundennummer auf Basis des Prim&auml;rschl&uuml;sselfeldes gef&uuml;llt wird. Dabei spielt es keine Rolle, ob der Benutzer die Datens&auml;tze direkt in der Tabelle anlegt oder diese &uuml;ber ein Formular hinzuf&uuml;gt &#8211; die Datenmakros werden immer ausgef&uuml;hrt. Solange Sie mit einer reinen Access-Datenbank arbeiten, also die Tabellen in einer <b>.accdb<\/b>-Datei liegen, ist diese L&ouml;sung funktional.<\/p>\n<p>Und damit kommen wir zum Nachteil: Sobald Sie die Tabellen in ein anderes System migrieren, zum Beispiel zum SQL Server, werden die Datenmakros nicht mehr ber&uuml;cksichtigt. Sie k&ouml;nnen dann allerdings auf andere technische M&ouml;glichkeiten zur&uuml;ckgreifen, um diese Funktion zu realisieren &#8211; beispielsweise auf Trigger.<\/p>\n<h2>Formularbasierte Erstellung der Kundennummer<\/h2>\n<p>Ob sich der Aufwand lohnt, das Datenmakro anzulegen, h&auml;ngt auch davon ab, an wie vielen Stellen in der Datenbankanwendung der Benutzer neue Datens&auml;tze zur betroffenen Tabelle hinzuf&uuml;gen kann.<\/p>\n<p>Die Alternative ist, die Kundennummer immer beim Anlegen neuer Kundendatens&auml;tze codegesteuert im Formular zu erzeugen. Wenn es nur ein Formular gibt, mit dem Kundendaten erzeugt werden, k&ouml;nnen Sie die Funktion auch gleich im Formular unterbringen.<\/p>\n<p>Mit dem Datenmakro stellen Sie allerdings sicher, dass der Benutzer nicht am Formular vorbei neue Datens&auml;tze ohne Kundennummer zur Kundentabelle hinzuf&uuml;gen kann.<\/p>\n<p>Die formularbasierte L&ouml;sung sieht wie nachfolgend beschrieben aus. Der weiter oben beschriebenen Tabelle <b>tblKunden <\/b>f&uuml;gen wir ein weiteres Feld namens <b>Kundennummer2 <\/b>hinzu, das wir nicht per Datenmakro gleich beim Anlegen des Datensatzes f&uuml;llen, und statten dieses ebenfalls mit einem eindeutigen Index aus (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_007.png\" alt=\"Weiteres Feld zum Experimentieren mit automatisch generierten Kundennummern\" width=\"474,5589\" height=\"341,3205\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Weiteres Feld zum Experimentieren mit automatisch generierten Kundennummern<\/span><\/b><\/p>\n<p>Nun legen wir ein Formular namens <b>frmKundeDetails <\/b>an und weisen diesem die Tabelle <b>tblKunden <\/b>als Datensatzquelle hinzu. Dann ziehen wir die Felder <b>ID<\/b>, <b>Kundennummer<\/b>, <b>Kundennummer2 <\/b>und <b>Firma <\/b>in den Detailbereich des Formularentwurfs. Das Feld <b>Kundennummer <\/b>verwenden wir nur zum Nachweis, dass das Anlegen der Kundennummer &uuml;ber das Datenmakro auch beim Erstellen von Kunden per Formular funktioniert.<\/p>\n<p>Der Formularentwurf sieht anschlie&szlig;end wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_008.png\" alt=\"Formular zum Eingeben von Kundendaten\" width=\"424,5589\" height=\"230,8192\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Formular zum Eingeben von Kundendaten<\/span><\/b><\/p>\n<p>Wir haben nun zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir legen die Kundennummer zum gleichen Zeitpunkt an wie das Datenmakro. Dazu w&uuml;rden wir dann das Formularereignis <b>Vor Aktualisierung <\/b>nutzen.<\/li>\n<li>Au&szlig;erdem muss es noch eine M&ouml;glichkeit geben, das Feld <b>Kundennummer2 <\/b>direkt beim ersten Bearbeiten des Datensatzes zu &auml;ndern &#8211; genau dann, wenn auch das <b>Autowert<\/b>-Feld seinen Wert erh&auml;lt.<\/li>\n<\/ul>\n<h2>Kundennummer in &#8222;Vor Aktualisierung&#8220; ermitteln<\/h2>\n<p>Wir schauen uns beide Varianten an. Die erste erfordert, dass wir f&uuml;r das Ereignis <b>Vor Aktualisierung <\/b>die folgende Ereignisprozedur implementieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!Kundennummer2 = Format(Me!ID, \"A00000000\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies f&uuml;hrt dazu, dass wenn Sie beispielsweise einen Wert f&uuml;r das Feld <b>Firma <\/b>eingetragen haben und den Datensatz mit <b>Strg + S <\/b>speichern, der gew&uuml;nschte Wert wie in Bild 9 in das Feld <b>Kundennummer2 <\/b>eingetragen wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1377_009.png\" alt=\"Anlegen eines neuen Kunden per Formular\" width=\"424,5589\" height=\"230,8192\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Anlegen eines neuen Kunden per Formular<\/span><\/b><\/p>\n<p>Warum nutzen wir das Ereignis <b>Vor Aktualisierung <\/b>&#8211; k&ouml;nnten wir nicht auch <b>Nach Aktualisierung <\/b>verwenden? Theoretisch ja, allerdings w&uuml;rde das &Auml;ndern des Feldes <b>Kundennummer2 <\/b>wieder den Datensatz &auml;ndern und diesen in den Zustand <b>&#8222;Dirty&#8220; <\/b>versetzen. Bei <b>Vor Aktualisierung <\/b>erfolgt die &Auml;nderung vor dem Speichern und wird somit mit in die Tabelle &uuml;bernommen.<\/p>\n<h2>Kundennummer bei Beginn der Bearbeitung<\/h2>\n<p>Wenn Sie im Formular einmal zu einem neuen, leeren Datensatz navigieren und dort den Wert in einem beliebigen Feld &auml;ndern, zeigt das Prim&auml;rschl&uuml;sselfeld direkt den per Autowert ermittelten Wert an. Diesen Zeitpunkt m&uuml;ssten wir nutzen, um den Wert f&uuml;r das Feld <b>Kundennummer2 <\/b>zu ermitteln. Aber welches Ereignis k&ouml;nnen wir dazu nutzen?<\/p>\n<p>Immer, wenn nicht klar ist, welche Ereignisse rund um eine Aktion ausgel&ouml;st werden, f&uuml;ge ich alle in Frage kommenden Ereignisse hinzu und versehe diese mit einer einfachen <b>Debug.Print<\/b>-Anweisung, die nur den Namen des Ereignisses ausgibt &#8211; in diesem Fall zum Beispiel so:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_BeforeInsert(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"BeforeInsert\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"BeforeUpdate\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n...\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Dirty\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dann &ouml;ffne ich das Access-Hauptfenster und den VBA-Editor nebeneinander und f&uuml;hre die betroffene Aktion aus. Im VBA-Editor sehe ich dann schnell, welche Ereignisse dadurch ausgel&ouml;st werden.<\/p>\n<p>In diesem Fall interessiert uns das Eingeben des ersten Zeichens in das Feld <b>Firma <\/b>in einem neuen, leeren Datensatz. Das Ergebnis lautet:<\/p>\n<pre>BeforeInsert\r\nDirty<\/pre>\n<p>Damit k&ouml;nnen wir weitere Untersuchungen anstellen, beispielsweise indem wir pr&uuml;fen, ob das Feld <b>ID <\/b>w&auml;hrend des Aufrufs dieser Prozeduren bereits einen Wert enth&auml;lt. F&uuml;r <b>Form_Dirty <\/b>sieht das beispielsweise wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Dirty\", Me!ID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis lautet allerdings:<\/p>\n<pre>Dirty         Null<\/pre>\n<p>Wir haben also keine Ereignisprozedur, die zu diesem Zeitpunkt Zugriff auf den Autowert des Prim&auml;rschl&uuml;sselfeldes bietet.<\/p>\n<h2>Kundennummer &auml;ndern per Timer<\/h2>\n<p>Access erm&ouml;glicht allerdings fast immer einen Workaround. In diesem Fall nutzen wir das Ereignis <b>Bei Zeitgeber<\/b>. Damit dieses ausgel&ouml;st wird, m&uuml;ssen wir die Eigenschaft <b>Zeitgeberintervall <\/b>mit einem Wert versehen.<\/p>\n<p>Das erledigen wir genau in der Ereignisprozedur <b>Form_Dirty<\/b>, indem wir die VBA-Eigenschaft <b>TimerInterval <\/b>auf <b>100 <\/b>einstellen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me.TimerInterval = 100\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das sorgt daf&uuml;r, dass eine weitere Ereignisprozedur namens <b>Bei Zeitgeber <\/b>100 Millisekunden sp&auml;ter ausgel&ouml;st wird. In diesem stellen wir das Feld <b>Kundennummer2 <\/b>auf den gew&uuml;nschten Wert ein. Anschlie&szlig;end setzen wir <b>TimerInterval <\/b>wieder auf den Wert <b>0<\/b>, was den Zeitgeber deaktiviert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     Me!Kundennummer2 = Format(Me!ID, \"A00000000\")\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Kombination sorgt daf&uuml;r, dass <b>Kundennummer2 <\/b>den gew&uuml;nschten Wert erh&auml;lt. Voraussetzung daf&uuml;r ist, dass das Feld <b>ID <\/b>innerhalb von 100 Millisekunden per <b>Autowert<\/b>-Funktion gef&uuml;llt wurde. Nun kann es aber sein, dass der Benutzer den Kundendatensatz nach dem erstmaligen Anlegen nochmals &auml;ndert, was wieder die gleichen Prozeduren ausl&ouml;st.<\/p>\n<p>Dies f&uuml;hrt dazu, dass der Wert von <b>Kundennummer2<\/b> nochmals gesetzt wird. Was ung&uuml;nstig ist, wenn der Kunde die Kundennummer zwischenzeitlich auf einen anderen Wert eingestellt hat.<\/p>\n<p>Also erweitern wir die Prozedur, die durch das Ereignis <b>Bei Ge&auml;ndert<\/b> ausgel&ouml;st wird, wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         Me.TimerInterval = 100\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dadurch wird der Timer nur gestartet, wenn der Benutzer soeben die Bearbeitung eines neuen, leeren Datensatzes gestartet hat.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>NummernGenerieren.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/1DFFB9D8-49D3-4EB4-ADC0-025BB3B52615\/aiu_1377.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In vielen Beispieltabellen, die wir in diesem Magazin vorstellen, verwenden wir einfach das Prim&auml;rschl&uuml;sselfeld als Kundennummer, Bestellnummer und so weiter. In manchen F&auml;llen ist das nicht praktikabel, weil diese Nummern nach bestimmten anderen Regeln erstellt werden m&uuml;ssen. Dann bietet es sich an, dennoch ein Prim&auml;rschl&uuml;sselfeld mit Autowertfunktion zu nutzen, um die Datens&auml;tze eindeutig zu identifizieren und dieses auch f&uuml;r das Herstellen von Beziehungen zu nutzen. Die Kundennummern oder Bestellnummern m&ouml;chte man aber dennoch nicht von Hand eingeben, sondern die Datenbank soll das erledigen. Wie Sie das realisieren k&ouml;nnen, zeigt der vorliegende Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66042022,44000021],"tags":[],"class_list":["post-55001377","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Nummern f&uuml;r Bestellungen et cetera generieren - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nummern f&uuml;r Bestellungen et cetera generieren\" \/>\n<meta property=\"og:description\" content=\"In vielen Beispieltabellen, die wir in diesem Magazin vorstellen, verwenden wir einfach das Prim&auml;rschl&uuml;sselfeld als Kundennummer, Bestellnummer und so weiter. In manchen F&auml;llen ist das nicht praktikabel, weil diese Nummern nach bestimmten anderen Regeln erstellt werden m&uuml;ssen. Dann bietet es sich an, dennoch ein Prim&auml;rschl&uuml;sselfeld mit Autowertfunktion zu nutzen, um die Datens&auml;tze eindeutig zu identifizieren und dieses auch f&uuml;r das Herstellen von Beziehungen zu nutzen. Die Kundennummern oder Bestellnummern m&ouml;chte man aber dennoch nicht von Hand eingeben, sondern die Datenbank soll das erledigen. Wie Sie das realisieren k&ouml;nnen, zeigt der vorliegende Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T18:11:37+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Nummern f&uuml;r Bestellungen et cetera generieren\",\"datePublished\":\"2022-08-04T18:11:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/\"},\"wordCount\":2258,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"4\\\/2022\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/\",\"name\":\"Nummern f&uuml;r Bestellungen et cetera generieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-04T18:11:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Nummern_fuer_Bestellungen_et_cetera_generieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nummern f&uuml;r Bestellungen et cetera generieren\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nummern f&uuml;r Bestellungen et cetera generieren - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/","og_locale":"de_DE","og_type":"article","og_title":"Nummern f&uuml;r Bestellungen et cetera generieren","og_description":"In vielen Beispieltabellen, die wir in diesem Magazin vorstellen, verwenden wir einfach das Prim&auml;rschl&uuml;sselfeld als Kundennummer, Bestellnummer und so weiter. In manchen F&auml;llen ist das nicht praktikabel, weil diese Nummern nach bestimmten anderen Regeln erstellt werden m&uuml;ssen. Dann bietet es sich an, dennoch ein Prim&auml;rschl&uuml;sselfeld mit Autowertfunktion zu nutzen, um die Datens&auml;tze eindeutig zu identifizieren und dieses auch f&uuml;r das Herstellen von Beziehungen zu nutzen. Die Kundennummern oder Bestellnummern m&ouml;chte man aber dennoch nicht von Hand eingeben, sondern die Datenbank soll das erledigen. Wie Sie das realisieren k&ouml;nnen, zeigt der vorliegende Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-04T18:11:37+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Nummern f&uuml;r Bestellungen et cetera generieren","datePublished":"2022-08-04T18:11:37+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/"},"wordCount":2258,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","4\/2022","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/","url":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/","name":"Nummern f&uuml;r Bestellungen et cetera generieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-04T18:11:37+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Nummern_fuer_Bestellungen_et_cetera_generieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Nummern f&uuml;r Bestellungen et cetera generieren"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001377"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001377\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}