Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: PeteTheBeat am Juni 23, 2026, 08:10:04

Titel: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 23, 2026, 08:10:04
Moin ,

Ich möchte gerne ein Formular, zur Auftragsannahme, erstellen, indem eine Laufende generiert wird.
Ich habe folgendes Video gefunden.
https://www.youtube.com/watch?v=2ARUBZxtMcE

Ich möchte aber aus einem Menü "Auftragsannahme" anklicken und ein Formular öffnen und nicht in einem bestehenden Formular einen neuen Datensatz anfügen.

Ich hoffe es wird deutlich was ich möchte   :-[
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Knobbi38 am Juni 23, 2026, 09:40:55
Zitat von: PeteTheBeat am Juni 23, 2026, 08:10:04Ich möchte aber aus einem Menü "Auftragsannahme" anklicken und ein Formular öffnen und nicht in einem bestehenden Formular einen neuen Datensatz anfügen.
Hört sich ein bißchen widersprüchlich an. Was soll denn mit dem geöffneten Formular passieren, wenn kein neuer DS angefügt werden soll?

Für eine lfd. Nummern kannst du ein Feld in einer Tabelle heranziehen, welches dann ausgelesen, geändert und wieder zurückgeschrieben wird.

Knobbi38
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Bitsqueezer am Juni 23, 2026, 09:47:52
Hallo,

Du kannst ein Formular so aufrufen:
docmd.OpenForm "frmAuftrag",DataMode:=acFormAdd
Das Formular setzt Du auf die Datenquelle, wie üblich. Mit "acFormAdd" wird das Formular zur Eingabe eines neuen Datensatzes geöffnet.

Die laufende Nummer solltest Du erst beim Speichern vergeben, also in Form_BeforeUpdate, weil das unmittelbar vor dem Speichern aufgerufen wird. Wenn Du die Nummer schon beim Öffnen des Formulares generierst, könnte ein 2. User die gleiche Nummer bekommen, wenn er das macht, bevor Du Deinen Datensatz gespeichert hast.

Gruß

Christian
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 23, 2026, 11:48:41
Zitat von: Bitsqueezer am Juni 23, 2026, 09:47:52Hallo,

Du kannst ein Formular so aufrufen:
docmd.OpenForm "frmAuftrag",DataMode:=acFormAdd
Das Formular setzt Du auf die Datenquelle, wie üblich. Mit "acFormAdd" wird das Formular zur Eingabe eines neuen Datensatzes geöffnet.

Die laufende Nummer solltest Du erst beim Speichern vergeben, also in Form_BeforeUpdate, weil das unmittelbar vor dem Speichern aufgerufen wird. Wenn Du die Nummer schon beim Öffnen des Formulares generierst, könnte ein 2. User die gleiche Nummer bekommen, wenn er das macht, bevor Du Deinen Datensatz gespeichert hast.

Gruß

Christian


Vielen Dank für deine ausführliche Antwort.
Wo setze ich "acFormAdd" ein ?

Dein Tipp des mit der Vergabe beim Speichern ist einleuchtend.
Sicherlich muss ich alles in VBA lösen oder?
Wie generiere ich denn das Hochzählen der Auftragsnummer ?

Späten möchten wir, optional, die Möglichkeit haben, mit dem Speichern des Austrags diesen Auszudrucken. 
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Beaker s.a. am Juni 23, 2026, 12:14:43
ZitatWie generiere ich denn das Hochzählen der Auftragsnummer ?
DMax("AuftragsNr", "Auftragstabelle") + 1
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Bitsqueezer am Juni 23, 2026, 13:31:44
Hallo,

Du hast doch von "Aufruf über ein Menü" gesprochen. Da gehe ich davon aus, daß Du weißt, wie man ein Menü programmiert und wie man eine Aktion bei Auswahl eines Menüeintrags ausführt.

Und dann gibt es nur die oben gezeigte Codezeile zu verwenden. Und ja, wenn unsereiner von "Programmieren" spricht, geht es immer um VBA.

Wie öffnest Du denn sonst Formulare über Menüs?

Gruß

Christian
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 24, 2026, 13:35:40
Zitat von: Beaker s.a. am Juni 23, 2026, 12:14:43
ZitatWie generiere ich denn das Hochzählen der Auftragsnummer ?
DMax("AuftragsNr", "Auftragstabelle") + 1

Ich habe es folgendermaßen angelegt.
DMax "Laufendenr", "tbl_Abholungen_Main" = "Laufendenr", "tbl_Abholungen_Main" + 1
Leider bekomme ich einen Fehler
Laufzeitfehler 13
Typen unverträglich

Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 24, 2026, 13:51:01
Zitat von: Bitsqueezer am Juni 23, 2026, 13:31:44Hallo,

Du hast doch von "Aufruf über ein Menü" gesprochen. Da gehe ich davon aus, daß Du weißt, wie man ein Menü programmiert und wie man eine Aktion bei Auswahl eines Menüeintrags ausführt.

Und dann gibt es nur die oben gezeigte Codezeile zu verwenden. Und ja, wenn unsereiner von "Programmieren" spricht, geht es immer um VBA.





Wie öffnest Du denn sonst Formulare über Menüs?

Gruß

Christian


Ich habe jetzt ein Schaltfläche angelegt, die das Formular öffnet.
Klappt .

Private Sub Befehl0_Click()

DoCmd.OpenForm "frm_Auftragserfassung", DataMode:=acFormAdd

DMax "Laufendenr", "tbl_Abholungen_Main" = "Laufendenr", "tbl_Abholungen_Main" + 1
End Sub

Leider bekomme ich einen Fehler
Laufzeitfehler 13, Typen unverträglich

Wie ist der Schritt die "neue" Laufendenr im Formular anzeigen zu lassen und dann beim Speichern erst zu vergeben, um das von dir angesprochenen Problem der 2 User zu vermeiden.
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Bitsqueezer am Juni 24, 2026, 16:59:02
Hallo,

DMax ist keine Anweisung, sondern eine Funktion, die Dir einen Wert zurückliefert.
Beaker hat Dir oben ja bereits die korrekte Syntax gezeigt (wobei dann noch die Zuweisung des Ergebnisses an das betreffende Feld fehlt).

Das wäre dann:
Me.LaufendeNr = DMax("LaufendeNr", "tbl_Abholungen_Main") + 1
Wobei "LaufendeNr" das Control (z.B. Textbox) ist, die i.d.R. anders heißen sollte als das Feld, also etwa "ctl_LaufendeNr" und entsprechend beim "Me." anzupassen.

Angezeigt wird die Nummer nicht, wenn Du das, wie beschrieben, in Form_BeforeUpdate so zuweist.
Erst, wenn der Datensatz gespeichert wird, aber nicht zum Zeitpunkt, wo der User das Formular aufruft und befüllt.
Aber genau so soll es ja auch sein und für den User ist die laufende Nummer zum Ausfüllen des Formulares ohnehin bedeutungslos.

Die Zuweisung mit DMax erfolgt also im aufgerufenen Formular "frm_Auftragserfassung" in Form_BeforeUpdate, im Button-Click hat sie nichts zu suchen.

Gruß

Christian
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 30, 2026, 07:17:16
Moin,

ich habe das jetzt so gelöst.. da ist sicherlich noch spiel nach oben oder ?
Es wäre sehr schön, wenn jemand raufschauen könnte.


Die laufende Nummer solltest Du erst beim Speichern vergeben, also in Form_BeforeUpdate, weil das unmittelbar vor dem Speichern aufgerufen wird. Wenn Du die Nummer schon beim Öffnen des Formulares generierst, könnte ein 2. User die gleiche Nummer bekommen, wenn er das macht, bevor Du Deinen Datensatz gespeichert hast.

Habe ich nicht hinbekommen  :(
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Bitsqueezer am Juni 30, 2026, 08:55:07
Hallo,

Du hattest es doch schon fast. Nur nicht in Form_Current, sondern in Form_BeforeUpdate.

Ersetze den vorhandenen Code gegen:


Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord Then
        Me.Ctr_Laufendenr = DMax("Laufendenr", "tbl_Abholungen_Main") + 1
        Me.Datum_Annahme = Date
    End If
End Sub


Gruß

Christian
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juni 30, 2026, 14:11:16
Moin Christian,
suuuuuuuper vielen Dank . Ich werde alles, was du geschrieben hast, versuchen umzusetzen.

Hier weiß ich nicht was du meinst

Das ist mit dem Code von oben so umgesetzt, oder ?

Ich überlege die Felder komplett rauszunehmen, die kommen ja dann beim Druck oder bei der Bearbeitung zu tragen

Ups , natürlich ja  :D


An dem Layout bzw dem Menue arbeite ich noch


[/quote]

Ich habe noch einige Fragen.

Aufrufen der Formulare:
als einzelne Formulare oder als Unterformulare?

Ich möchte dem Speichern des Auftrags die Option mit oder ohne Drucken des Auftrags haben.
Ist hierfür eine Checkbox die richtige Wahl? (Bei der Auftragserfassung)

Evtl. hast du gesehen, dass ich die "Erledigung des Auftrags" als Checkbox angelegt habe.
Ist das ratsam, wenn ich später alle offen Aufträge , oder alle erledigten Aufträge eines Monats Filtern will ?
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Knobbi38 am Juni 30, 2026, 16:00:35
Hallo PeteTheBeat!

kleiner Tip am Rande:
Bevor du dir über die UI der Anwendung Gedanken machst, sollte zunächst das Datenmodell fertiggestellt werden. Erst danach beschäftigt man sich mit der Oberfläche. Entsprechend dieser Vorgehensweise werden die Daten von der Anwendung getrennt, d. h., es gibt eine Datenbank mit Tabellen, das sogenannte Backend (BE), und eine Access-Datenbank mit Formularen/Berichten, das sogenannte Frontend (FE).

Knobbi38
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: PeteTheBeat am Juli 01, 2026, 06:08:35
Moin Knobbi38

du hast vollkommen recht. Die Infos / Tipps benötige aber auch so .
Titel: Re: Formular öffnen und dabei Laufende-Nummer generieren
Beitrag von: Bitsqueezer am Juli 01, 2026, 09:48:58
Hallo,

Zitat
Zitatwenn Du einen Default-Wert setzen willst, verwende die Eigenschaft "DefaultValue" des Controls. Das ist dann mit dem Wert vorbelegt und wenn der User nichts anderes eingibt, wird der DefaultValue im Datensatz gespeichert - aber erst zum Zeitpunkt des Speicherns.
Hier weiß ich nicht was du meinst

Jedes Control (Textbox, Kombobox usw.) hat eine Eigenschaft "DefaultValue". Die kannst Du in den Eigenschaften im Design fest einstellen oder dynamisch per VBA z.B. in Form_Load.
Wenn Du auf einen neuen Datensatz springst, steht der Wert bereits im Feld. Da es aber nur der DefaultValue ist, trifft das nur auf neue Datensätze zu, bestehende werden nicht geändert. Im Gegensatz zu "Value", wenn Du das änderst, änderst Du (bei gebundenen Controls) den Datensatz, was Du am Stiftsymbol des Record Selectors (grauer Balken links) erkennst. Beim Verlassen des Datensatzes (z.B. durch Blättern) wird die Änderung gespeichert. Somit veränderst Du (in Form_Current) JEDEN Datensatz, den Du Dir mit dem Formular anschaust. Ohne auf den Inhalt des Controls zu schauen, überschreibst Du gar den bereits vorhandenen Wert.
DefaultValue dagegen ändert nie etwas, ist nur ein Vorschlagswert, der nur übernommen wird, wenn der Datensatz gespeichert wird und der User nichts Anderes hier eingegeben hat.

ZitatIch überlege die Felder komplett rauszunehmen, die kommen ja dann beim Druck oder bei der Bearbeitung zu tragen
Es ist durchaus sinnvoll, sie drin zu lassen, weil es dem Anwender Informationen gibt. Z.B. die laufende Nummer: Beim Speichern wird sie danach angezeigt und so weiß der User "aha, habe gerade die Nummer 127 angelegt", womit er bei Bedarf schnell wieder dahinspringen kann. Wenn das Feld Enabled ist, kann er es auch mit STRG-F zum Suchen nach einer Nummer verwenden, usw.

ZitatAufrufen der Formulare:
als einzelne Formulare oder als Unterformulare?
Das ist eher eine Geschmacksfrage und hängt auch vom Design des Formulares ab.
Wenn Du ein Hauptformular hast, das eine Beziehung zu den Daten des Unterformulares hat, kannst Du die Link-Fields des UFOs verwenden, dann filtert Access automatisch das UFO passend zum Datensatz des HFOs. Das klassische Beispiel: HFO zeigt den Header einer Bestellung an, UFO zeigt die Bestellpositionen. Verknüpft über die BestellungsID, zeigt das UFO nur die Bestellpositionen an, die zu genau der BestellungsID des HFOs gehören. Außerdem verwendet Access dann automatisch den passenden Wert für den FK im UFO, setzt also das Feld BestellungsID des UFOs auf den aktuellen Wert des HFOs. Ohne diesen Automatismus müßte man das selbst per VBA erledigen.
Ein UFO kann natürlich auch neue Datensätze erfassen. Für das Beispiel ist es dann sinnvoll, beide auf Endlosformulare zu setzen, UFO dann im Fußbereich einsetzen. (Ja, Access zeigt dann immer, daß das nicht geht und setzt das HFO auf Einzelformular zurück - einfach ignorieren und wieder auf Endlosformular setzen.)
Da Dein Erfassungsformular aber den Aufbau eines Einzelformulares hat und eher groß ist, eignet es sich i.d.R. nur schlecht für diese Art der Kopplung. Weil Du dann ohnehin auf einem HFO mit UFO im UFO nicht viel mehr als einen Datensatz anzeigen kannst. Bevorzugst Du also diese Art der Eingabe, ist ein per OpenForm aufgerufenes Formular sinnvoller. Denk aber dran, daß Du diesem, wenn Du es mit dem "Add"-Parameter aufrufst wie in Deinem Beispiel, selbst die passende FK-ID übermitteln und in das FK-Feld speichern mußt (aber gleiches Prinzip wie oben: Nicht schon beim Aufrufen des Formulares in das FK-Feld schreiben, sondern z.B. in DefaultValue oder in Form_BeforeUpdate).

ZitatIch möchte dem Speichern des Auftrags die Option mit oder ohne Drucken des Auftrags haben.
Ist hierfür eine Checkbox die richtige Wahl? (Bei der Auftragserfassung)

Die Arbeit würde ich mir schenken. Jemand muß die Checkbox ja vor dem Speichern anklicken. Und hat der User es vergessen - wie druckt er dann noch?

Viel einfacher: Einen Button anbieten zum Drucken. Wenn der User drucken will, klickt er auf den Button, fertig.


Ein Einzelformular hat natürlich den Vorteil, daß Du hier mehr unterbringen kannst wie Hilfetexte, Messages in Textboxen, Buttons, größere Felder usw. Das geht in Grenzen auch in einem Endlosformular, ist aber schwieriger einzubauen.

ZitatEvtl. hast du gesehen, dass ich die "Erledigung des Auftrags" als Checkbox angelegt habe.
Ist das ratsam, wenn ich später alle offen Aufträge , oder alle erledigten Aufträge eines Monats Filtern will?

Durchaus. Am einfachsten ist es immer, eine Kombobox mit einer Statusliste einzubauen statt einer Checkbox. Dann kann man den Status entweder automatisiert ändern oder der User kann den Status setzen. Also z.B. "Neu", "In Bearbeitung", "Erledigt", "Gedruckt", ... was auch immer.
Danach kannst Du später suchen und filtern, Diagramme erstellen usw.

Gruß

Christian