Hallo liebe Forum-Gemeinde,
ich habe mir vor etwa 4 Monaten eien Datenbank erstellt, die stetig wächst. Doch je größer der Umfang wird, desto mehr zweifel ich an dem richtigen Aufbau der Datenbank.
Die Datenbank besteht aus diversen Tabellen. Beispielhaft und vereinfacht gibt es diese Tabellen:
- Tabelle 1: tbl_Mandanten mit Felder: MandantenID (Primärschlüssel), Mandantenname
- Tabelle 2: tbl_Anfrage mit Feldern AnfrageID, MandantenID_f, Jahr, Termin, Ansprechpartner
- Tabelle 3: tbl_Auftragsdetails mit Feldern AuftragID, MandantenID_f, Jahr, Rechtsform, Einspruch, Steuerart
- Tabelle 4: tbl_Checkliste mit Feldern ListeID, MandantenID_f, Jahr, Einspruch, Verlustvorträge, Besonderheiten
Die Tabellen 2 ff. enthalten alle die MandantenID als Fremdschlüssel. Ich habe mehrere Tabellen angelegt, da die Informationen auf verschiedenen Formularen beruhen, die wir im Rahmen des Auftragsprozesses erhalten.
Bisherige Situation: für jeden Mandanten haben wir für 2014 jeweils eine Anfrage, einen Auftrag, eine Checkliste erhalten. Bisher hat alles gut geklappt. Die Eingabenerfassung erfolgt über ein Hauptformular, in dem sich Registerkarten mit Unterbericht für die Tabellen Anfrage, Auftragsdetails, Checkliste befinden.
Problem: wir erhalten in Zukunft für die gleichen Mandanten Anfragen, Aufträge, Checklisten für die Folgejahre.
Ich bin mir generell unsicher, ob der Aufbau meiner Datenbank langfristig Sinn ergibt: in der tblMandanten sind meine Mandanten enthalten und die anderen Tabellen beziehen sich über den Fremdschlüssel und erstellen für jedes Jahr einen neuen Datensatz?! Ich würde mich riesig über generelle Tipps zu meiner Struktur freuen.
Viele Grüße und schönen Start ins Wochenende
Carola
Hallo Carienchen,
Also der Aufbau mit den 1:n Verknüpfungen ist schon richtig.
Weshalb ich dieses nicht verstehe:
ZitatProblem: wir erhalten in Zukunft für die gleichen Mandanten Anfragen, Aufträge, Checklisten für die Folgejahre.
Durch die Verknüpfung der Tabellen über die MandantenID kannst Du doch so viele Anfragen/Aufträge/Checklisten pro Mandant erfassen wie Du willst. Musst Du nur auch die UFos mit dem HFo über die MandantenID verknüpfen.
Einzelne Jahre filterst Du mit Abfragen.
gruss ekkehard
Hallo ekkehard,
vielen Dank für die Info, das beruhigt mich schon mal. Ich war gestern deshalb so verunsichert, weil ich den ersten Auftrag für ein neues Jahr erfassen wollte. In dem Eingabeformular (mit Unterformularen) hat es soweit geklappt und somit wurden die Daten auch richtig in die entsprechenden Tabellen übertragen. Aber als ich mir den Bericht für den neuen Auftrag 2015 des Mandanten ausgeben wollte, kam ich nicht weiter. Statt 1 Datensatz wurden mir immer zwei Datensätze angezeigt. Ich habe mir deshalb für jedes Jahr und jeden (Unter-)Bericht eine Abfrage gebaut, die ich über einen Button anstoße - einerseits sehr zeitaufwendig und andererseits auch mit sehr viel VBA-Code verbunden.
Ist es möglich, durch Klicken des Buttons zB für 2014 einer allgemeinen Abfrage (ohne Filter auf ein einziges Jahr) ein Kriterium mitzuteilen, so dass mir dann der entsprechende Bericht angezeigt wird? Dann bräuchte ich nicht für jedes Jahr eine Abfrage und einen (Unter-)Bericht.
Mein bisheriger Code für meinen Button 2014 lautet zB
Private Sub cmd_2014_17_mE_Click()
'Prüfen, ob Mandant in qry_Auftrag_2014 vorhanden ist; wenn nicht, dann kein Bericht
Dim db As DAO.Database
Dim rsAuftrag As DAO.Recordset
Set rsAuftrag = CurrentDb.OpenRecordset("qry_tbl_Auftrag_2014", dbOpenDynaset)
rsAuftrag.FindFirst "Mandanten_ID_f=" & Me!Mandanten_ID
If rsAuftrag.NoMatch Then
MsgBox "Auftrag nicht vollständig erfasst:" & _
vbNewLine & "Mandant ist in Abfrage 'qry_tbl_Auftrag_2014' nicht vorhanden, so dass kein Bericht ausgegeben werden kann. Bitte Daten überprüfen und Bericht erneut ausgeben."
Else
'Bericht erstellen, (versteckt) öffnen und abspeichern
'Variablendeklaration
Dim strBerichtname As String
Dim strBedingung As String 'Where-Bedingung für Berichterstellung
Dim strDateipfad As String
'Wertzuweisung
strBerichtname = "rpt_E_Team_Auftragsannahme_1_Anfrage_2014"
'Bedingung: "[ID-Feld-im-Bericht] = Formulare![Formular-Name]![ID-Feld]"; hier Bericht: rpt_E_Team_Auftragsannahme_1_Anfrage_2013
strBedingung = "Mandanten_ID_f=" & Me!Mandanten_ID '1. "Mandanten_ID_f" aus rpt, Me!Mandanten_ID s. frm_Mandantenverwaltung
strDateipfad = "\\Dekoefsr12\Daten5\Steuer\FSC_Koeln\pdf-Berichte\" & Mandanten_ID & "_Auftragsannahme 2014.pdf"
'Aktionen durchführen
DoCmd.OpenReport strBerichtname, acViewPreview, , strBedingung, acHidden
DoCmd.OutputTo acOutputReport, strBerichtname, acFormatPDF, strDateipfad, False
DoCmd.Close acReport, strBerichtname
'Explorer öffnen und Datei auswählen
Shell "Explorer.exe /select, \\Dekoefsr12\Daten5\Steuer\FSC_Koeln\pdf-Berichte\" & Mandanten_ID & "_Auftragsannahme 2014.pdf", vbNormalFocus
'E-Mail-Vorlage öffnen, die auf FSC-Laufwerk abgespeichert ist
Application.FollowHyperlink "\\Dekoefsr12\Daten5\Steuer\FSC_Koeln\Schriftwechsel Vorlage\1.7 Annahme Auftragsanfrage mit E-Bilanz.msg"
'Hinweis, welcher Bericht als Anlage beizufügen ist
MsgBox "Bitte folgenden pdf-Bericht als Anlage beifügen: " & Mandanten_ID & "_Auftragsannahme 2014.pdf"
End If
End Sub
Hallo,
wenn ich das ad hoc richtig verstanden habe, genügt ein (passend aufgebauter, z. B. über das Jahr gruppierender ) Bericht (statt für jedes Jahr einer) mit der "allgemeinen" Abfrage, wobei in "strBedingung" eben das Kriterium für das entspr. Jahr eingefügt werden müßte...
Ja, genau richtig verstanden :)
Ich weiß nur nicht genau, wie ich das umsetzen muss, da ich noch nicht allzu viel mit Berichten gearbeitet habe.
Mein Bericht besteht derzeit aus (dem Hauptbericht) und drei Unterberichten, wobei jeder Unterbericht wieder auf einer eigenen Abfrage besteht. In den Abfragen wird im Moment nach dem Jahr gefiltert. Im Endeffekt habe ich dann diverse Abfragen und diverse Berichte - für jedes Jahr eine(n).
Gemäß dem Lösungsvorschlag würde ich nur noch 1 Abfrage für jeden (Unter-)Bericht benötigen? Wobei in der Abfrage(n) kein Filter für das Jahr hinterlegt ist. Und wie müsste meine Where-Bedingung (bei mir: strBedingung) dann aussehen? Bei mir sind die Jahre warden die Jahre über einen Fremdschlüssel angegeben. 7 steht zB für 2014. Beispiel:
strBedingung = "Mandanten_ID_f=" & Me!Mandanten_ID And "Veranlagungszeitraum_f" = 7
Vielen lieben Dank.
Hallo,
am Sinnvollsten wäre ein Screenshot des Beziehungsfensters und die SQL-Strings der Abfragen....
Prinzipiell: Abfrage für den Bericht erstellen, die über alle beteiligten Tabellen (und deren Schlüsselfelder) verknüpft und den Bericht mit der Sortieren/Gruppieren-Funktion gruppieren.
Ansonsten:
strBedingung = "Mandanten_ID_f=" & Me!Mandanten_ID & " And Veranlagungszeitraum_f = 7"