Neuigkeiten:

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

Mobiles Hauptmenü

Zugriff vom 1 Formular auf mehere Tabellen mit eigenständiger ID

Begonnen von Problemkind, November 18, 2025, 10:43:41

⏪ vorheriges - nächstes ⏩

Problemkind

Hallo und Moin aus SH,
ich habe eine funktionierende Datenbank bei der verschiedene Objekte (Häuser) die Instandsetzungsaufträge zugeordnet bekommen. Die ID ist analog der Auftragsnummer immer fortlaufend, egal ob Objekt HL oder BB oder UE.
Es passierte also das Aufrag 1 bis 3 an BB gingen und Auftrag 4-6 an HL usw.

Jetzt hat sich die Teppich-Etage etwas tolles ausgedacht:
Jedes Objekt hat seine eigene fortlaufende Auftragsnummer, beginnend bei 1. Es gibt also für Objekt HL die Auftragsnummer 1 und 2 und 3...., für das Objekt BB die Auftragsnummer 1 und 2 und 3.... und so weiter.

Ich würde das gerne über 1 Formular lösen, bei der ich über eine Auswahl (Kombinationsfeld/Auswahlfeld) das betreffende Objekt auswähle und dann eine neue Auftragsnummer erhalte. Die einzelnen Tabellen (Auftrag_BB, Auftrag_HL usw.) habe ich angelegt, aber leider keine Idee wie ich diese mit dem Formular verbinde, um (dann) über ein Kombinationsfeld/Auswahlfeld im Formular die richtige Tabelle "anzusprechen" und die nächste fortlaufende Auftragsnummer zu erhalten.

Könnt ihr mir dabei helfen?

Die Alternative mehrere Formulare zu erstellen um jedem Objekt (es wären 10 Stück) eine Tabelle zu zuweisen, dies halte ich für sehr unpraktisch, wäre aber die letzte Notlösung.

Gruß
Frank

PhilS

Zitat von: Problemkind am November 18, 2025, 10:43:41Die einzelnen Tabellen (Auftrag_BB, Auftrag_HL usw.) habe ich angelegt,
Stop!
Das ist ein grundlegende Designfehler.
Es sollte nur eine einzige Tabelle "Auftrag" geben und für welches Objekt ein Auftrag gilt, wird über ein (Fremdschlüssel-)Feld in der Tabelle bestimmt.

Eine neue Auftragsnummer kannst du dann z.B. mit der DMAX-Funktion ermitteln, wenn du die ObjektId als Kriterium verwendest. 
Der Primärschlüssel ist dann entweder ein zusammengesetzter Schlüssel aus der ObjektID und der Auftragsnummer, oder (meist einfacher/besser) ein zusätzlicher Autowert, der im Hintergrund einfach hochzählt.

Wenn möglich, solltest du mit der "Teppich-Etage" sprechen, damit sie ihre eher unsinnige Vorstellung von einem Auftragsnummernkreis pro Objekt wieder aufgeben. Das hat keinen echten Mehrwert, macht dir die Arbeit schwerer und wird früher oder später zu Verwirrung führen, wenn die eine "Etage" mit der anderen über Aufträge spricht.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Problemkind

Danke erst einmal für die schnelle Antwort,

klingt alles logisch, bei mir hängt es aber an der richtigen Umsetzung.

Brauche ich noch eine eigene Tabelle "Objekte", damit jedes Objekt seine eigene ID bekommt?

Die Tabelle "Auftrag" hätte dann die Felder: "ID" , "Auftragsort" , "Auftrag" , "lfd_Nummer" , "Objekt" .

Wenn ich jetzt ein Formular erstelle, wo bringe ich dann die DMAX-Funktion ein, und wo zählt der Autowert, der mir im Formular angezeigt werden muss.

Das sprengt mein sehr kleines Wissen über Access, war eigentlich schon froh und stolz, dass meine erste Datenbank funktionierte.

Bitsqueezer

Hallo,

genau wie Phil sage ich auch: Du versuchst, Aufzählungswerte als Tabellen zu erstellen - das ist die falsche Denke, wo immer es um Aufzählungen geht. Man sieht auch oft sowas wie "Aufträge_2024", "Aufträge_2025" usw. Aufzählungen eben, gleiches gilt für Aufzählungen in Feldnamen.

Du kannst ohne weiteres ein DB-konformes System verwenden und die Anforderung dennoch erfüllen.

  • eine Tabelle "tblAuftraege"
  • eine Tabelle "tblObjekte"
  • eine Tabelle "tblAuftragsnummern
  • und natürlich diverse weitere, die man dazu so brauchen könnte.

In "tblObjekte" werden die Objekte beschrieben.
ID_Objekt (AutoID)
ObjektName (Kürzel wie "HL", "BB", "UE")
ObjektBeschreibung (Freitext)
ObjektNameLang (Längerer Name für Displayzwecke)
usw.

In "tblAuftraege" werden die Auftragsdaten erfaßt.
ID_Auftrag (AutoID)
ID_Auftragsnr (Long)
Weitere Felder

In "tblAuftragsnummern" werden die Objekte und die Nummern zusammengefaßt:
ID_Auftragsnr (AutoID)
ID_Objekt (Long) beschreibt, für welches Objekt der Auftrag gilt.
Auftragsnr (Long) enthält die aufsteigende Nr. je Objekt.


In einem Formular kannst Du jetzt die tblAuftraege mit ihren Feldern verwalten. Hier kannst Du in einem ungebundenen Feld per Kombobox die Liste der Objekte zur Auswahl anbieten. Warum ungebunden? Kommt jetzt.

Wenn der User die Auftragsdaten erfaßt, ist die Auswahl des Objektes für ihn wie ein Teil des Datensatzes, obwohl er das nicht ist. Er weiß ja nicht, was gebunden ist und was nicht.

Wenn sich der User entscheidet, den Datensatz abzubrechen, wurde noch keine Auftragsnummer vergeben.

Wenn der User nun den Auftrag speichern will, kannst Du "Form_BeforeUpdate" verwenden, dieser Event wird unmittelbar vor dem Speichern des Datensatzes aufgerufen.

Hier kannst Du nun mit einem INSERT-SELECT-Befehl, aus der Tabelle "tblAuftragsnummern" die höchste Auftragsnummer für das im Formular ausgewählte Objekt (ID_Objekt) per MAX heraussuchen, 1 hinzuaddieren und in die Tabelle einfügen, zusammen mit der gewählten ID_Objekt, alles mit einem einzigen INSERT/SELECT. Im Anschluß kannst Du die erstellte ID abrufen und in das Feld "ID_Auftragsnummer" der Auftragstabelle schreiben - fertig.

INSERT/SELECT ist ein atomarer Befehl, das heißt, nichts kann dazwischenkommen, kein anderer User etwa. Da Du die Operation in Form_BeforeUpdate machst, bekommst Du die Auftragsnummer erst, wenn der Datensatz wirklich gespeichert werden soll. Im Anschluß an die Prozedur mußt Du nichts machen, sobald die Prozedur endet, speichert Access den Datensatz mit den zusätzlichen Daten, die Du dem Datensatz so hinzugefügt hast.

Da das Objekt in der Auftragsnummer steckt, kannst Du nun z.B. in einer Abfrage die Auftragsnummern-Tabelle zur Auftragstabelle hinzu-joinen, ebenso die Objekttabelle, und erhältst alle Informationen zum Auftrag. Wenn gewünscht, kannst Du auch das Kürzel des Objektes zur Auftragsnummer hinzukleben, also "HL-100" oder "BB-543". Das macht die Auftragsnummer weiterhin eindeutig nach außen hin, intern wird aber ausschließlich die ID verwendet, die wiederum NICHT durchgängig fortlaufend sein muß, sondern nur der Identifikation eines Datensatzes dient.
Mit so einer Abfrage kannst Du dann auch Aufträge nach Objekt suchen usw.

Gruß

Christian

Problemkind

Danke erstmal an PhilS und Bitsqueezer,

ich werde einmal mein bestes Geben und versuchen eure Lösungsvorschläge umzusetzen.