Neuigkeiten:

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

Mobiles Hauptmenü

Formular öffnen und dabei Laufende-Nummer generieren

Begonnen von PeteTheBeat, Juni 23, 2026, 08:10:04

⏪ vorheriges - nächstes ⏩

PeteTheBeat

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   :-[

Knobbi38

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

Bitsqueezer

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

PeteTheBeat

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. 

Beaker s.a.

ZitatWie generiere ich denn das Hochzählen der Auftragsnummer ?
DMax("AuftragsNr", "Auftragstabelle") + 1
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Bitsqueezer

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

PeteTheBeat

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


PeteTheBeat

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.

Bitsqueezer

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

PeteTheBeat

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  :(

Bitsqueezer

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

  • wenn Du eine Zuweisung in VBA zu einem Feld machst, geht der Datensatz in den Edit Mode (siehe Stiftsymbol im Record Selector). Das unbedingt vermeiden
  • wenn 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.
  • wenn Du in Form_Current ("Beim Anzeigen") des Datensatzes Werte veränderst, dann ändern sich die Werte mit jedem Blättern im Datensatz.
  • besonders tragisch dann, wo Du die laufende Nummer setzt: Durch Form_Current überschreibst Du auch in existierenden Datensätzen die Nr. gegen eine neue. Damit ändern sich dauernd die Nummern auf Deinen Aufträgen.
  • wenn Du die laufende Nummer schon zu Beginn holst (beim Anzeigen oder auch bei Start der Bearbeitung etwa), ist die Nr. z.B. 100. Jetzt fängt der User an, das Formular zu befüllen und ein anderer User beginnt einen neuen Datensatz. Da der erste seinen noch nicht gespeichert hat, bekommt User 2 jetzt durch DMax+1 auch die 100. Wenn sie dann speichern, hast Du 2x 100 in Deiner Tabelle (das sollte mal mindestens durch Setzen eines Primary Keys oder wenigstens Unique Index auf die Nr. verhindert werden!)
  • wie gesagt: Für den User ist die Nummer zum Zeitpunkt der Bearbeitung unwichtig. Wenn er den Datensatz dann gespeichert hat, wird durch Form_BeforeUpdate erst direkt vor dem Speichern eine neue Nr. generiert und gespeichert. Der User bekommt dann auch die Nummer angezeigt.
  • für das Datum (Datum_Annahme) gilt das gleiche. Auch hier erst beim Speichern generieren.
  • Beide Controls sollten Lock=True sein, Enabled kann auch True bleiben (damit man in die Felder hineinklicken und Werte kopieren kann). So kann der User hier gar nichts selbst eingeben. Außerdem im letzten Tab der Eigenschaften ("Andere") den Tab Stop für diese Felder ausschalten, damit Read-Only-Felder per Tab-Taste nicht angesprungen werden (vereinfacht die Eingabe per Tastatur).
  • es empfiehlt sich, ebenso mit anderen automatisch berechneten Feldern zu verfahren. Es ist auch sinnvoll, solche Felder mit einem anderen Hintergrund zu versehen und/oder den Rahmen abzuschalten, um optisch zu markieren, daß es hier nichts einzugeben gibt.
  • "Sqrapping"? Meintest Du nicht eher "Scrapping"? Wobei "Scrap" und "Waste" so ziemlich das gleiche wäre.
  • "Aufgeräumte Formulare": Du solltest Felder, die übereinander stehen, möglichst gleich breit machen und links ausgerichtet positionieren. Das Formular wirkt dann weniger chaotisch. Du solltest Dich mit Access-Layouts befassen, die Dir erlauben, Felder sehr einfach auszurichten oder zu tauschen. Das geht tabellarisch (i.d.R. Endlosformulare) oder gestapelt (i.d.R. Einzelformulare wie hier). Einfach alle Controls markieren, die Du in ein Layout aufnehmen willst, und dann rechts anklicken, Layout, gestapelt.
    Das Ergebnis ist oft nicht "schön", weil Access seine sehr eigenen Ideen von Design hat, aber die Controls sind danach in ein Layout-Raster eingebunden. Das kannst Du danach aber nach eigenem Geschmack beliebig anpassen. Du kannst Zeilen und Spalten einfügen, entfernen, mergen, splitten usw., Controls im Raster verschieben oder hineinziehen usw. Du kannst außerdem auch getrennte Layout-Blöcke erstellen.

Gruß

Christian

PeteTheBeat

Moin Christian,
suuuuuuuper vielen Dank . Ich werde alles, was du geschrieben hast, versuchen umzusetzen.

  • wenn 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

  • wenn Du in Form_Current ("Beim Anzeigen") des Datensatzes Werte veränderst, dann ändern sich die Werte mit jedem Blättern im Datensatz.
  • besonders tragisch dann, wo Du die laufende Nummer setzt: Durch Form_Current überschreibst Du auch in existierenden Datensätzen die Nr. gegen eine neue. Damit ändern sich dauernd die Nummern auf Deinen Aufträgen.
  • wenn Du die laufende Nummer schon zu Beginn holst (beim Anzeigen oder auch bei Start der Bearbeitung etwa), ist die Nr. z.B. 100. Jetzt fängt der User an, das Formular zu befüllen und ein anderer User beginnt einen neuen Datensatz. Da der erste seinen noch nicht gespeichert hat, bekommt User 2 jetzt durch DMax+1 auch die 100. Wenn sie dann speichern, hast Du 2x 100 in Deiner Tabelle (das sollte mal mindestens durch Setzen eines Primary Keys oder wenigstens Unique Index auf die Nr. verhindert werden!)
  • wie gesagt: Für den User ist die Nummer zum Zeitpunkt der Bearbeitung unwichtig. Wenn er den Datensatz dann gespeichert hat, wird durch Form_BeforeUpdate erst direkt vor dem Speichern eine neue Nr. generiert und gespeichert. Der User bekommt dann auch die Nummer angezeigt.
Das ist mit dem Code von oben so umgesetzt, oder ?

  • für das Datum (Datum_Annahme) gilt das gleiche. Auch hier erst beim Speichern generieren.
  • Beide Controls sollten Lock=True sein, Enabled kann auch True bleiben (damit man in die Felder hineinklicken und Werte kopieren kann). So kann der User hier gar nichts selbst eingeben. Außerdem im letzten Tab der Eigenschaften ("Andere") den Tab Stop für diese Felder ausschalten, damit Read-Only-Felder per Tab-Taste nicht angesprungen werden (vereinfacht die Eingabe per Tastatur).
  • es empfiehlt sich, ebenso mit anderen automatisch berechneten Feldern zu verfahren. Es ist auch sinnvoll, solche Felder mit einem anderen Hintergrund zu versehen und/oder den Rahmen abzuschalten, um optisch zu markieren, daß es hier nichts einzugeben gibt.
Ich überlege die Felder komplett rauszunehmen, die kommen ja dann beim Druck oder bei der Bearbeitung zu tragen

  • "Sqrapping"? Meintest Du nicht eher "Scrapping"? Wobei "Scrap" und "Waste" so ziemlich das gleiche wäre.
Ups , natürlich ja :D

  • "Aufgeräumte Formulare": Du solltest Felder, die übereinander stehen, möglichst gleich breit machen und links ausgerichtet positionieren. Das Formular wirkt dann weniger chaotisch. Du solltest Dich mit Access-Layouts befassen, die Dir erlauben, Felder sehr einfach auszurichten oder zu tauschen. Das geht tabellarisch (i.d.R. Endlosformulare) oder gestapelt (i.d.R. Einzelformulare wie hier). Einfach alle Controls markieren, die Du in ein Layout aufnehmen willst, und dann rechts anklicken, Layout, gestapelt.
    Das Ergebnis ist oft nicht "schön", weil Access seine sehr eigenen Ideen von Design hat, aber die Controls sind danach in ein Layout-Raster eingebunden. Das kannst Du danach aber nach eigenem Geschmack beliebig anpassen. Du kannst Zeilen und Spalten einfügen, entfernen, mergen, splitten usw., Controls im Raster verschieben oder hineinziehen usw. Du kannst außerdem auch getrennte Layout-Blöcke erstellen.

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 ?

Knobbi38

Hallo PeteTheBeat!

kleiner Tip am Rande:
Bevor du dir über die UI der Anwendung Gedanken machst, sollte erstmal das Datenmodell fertig gestellt werden, erst danach beschäftigt man sich der Oberfläche! Entsprechend dieser Vorgehensweise trennt man auch die Daten von der Anwendung, sprich man hat eine Datenbank mit den Tabellen, das sogenannte Backend (BE) und eine Access Datenbank mit den Formularen/Berichten, das sogenannte Frontend (FE).

Knobbi38