Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Carienchen am November 14, 2015, 10:09:43

Titel: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: Carienchen am November 14, 2015, 10:09:43
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
Titel: Re: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: Beaker s.a. am November 14, 2015, 20:36:19
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
Titel: Re: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: Carienchen am November 15, 2015, 09:16:02
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
Titel: Re: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: DF6GL am November 15, 2015, 09:44:39
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...
Titel: Re: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: Carienchen am November 15, 2015, 12:26:16
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.
Titel: Re: Datenbankstruktur: mehrere Tabellen um einen Primärschlüssel-Feld
Beitrag von: DF6GL am November 15, 2015, 13:41:06
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"