Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Access 2010 - Abfrage über mehrere Tabellen

Frage Entwicklung Datenbanken

Mitglied: Eisbrecherin

Eisbrecherin (Level 1) - Jetzt verbinden

15.08.2014, aktualisiert 18.08.2014, 2482 Aufrufe, 12 Kommentare

Hallo zusammen!

Ich bin gerade etwas am Verzweifeln mit Access 2010. Meine Datenbank besteht aus folgenden Tabellen / Beziehungen:
abbea075ba9b873f3b3b11a2c42a1a24 - Klicke auf das Bild, um es zu vergrößern

Sie soll Verträge verwalten zwischen unterschiedlichen Gesellschaften. Alle Gesellschaften sind in tblGesellschaft enthalten.
Jede Gesellschaft kann Empfänger oder Zahlender sein.
tblVertrag enthält alle Verträge, die sich in einzelne Positionen aufteilen (tblVertragPosition). Jede Einzelposition bekommt ein Kennzeichen zugeordnet (=Art der Leistung). Alle Kennzeichen sind in tblKennzeichen gespeichert.
Die beiden Tabellen tblKtoEmpfangend und tblKtoZahlend enthalten die Info, welches Konto für welche Kombination Gesellschaft und Kennzeichen verwendet werden soll.
tblSteuer und tblMonat enthalten Kennzeichen für die einzelnen Steuerarten und Monate.
Wird ein Vertrag angelegt, müssen Empfänger und Zahlender festgelegt werden. Aus diesen beiden und dem Kennzeichen in tblVertragPosition ergibt sich dann das jeweilige Konto aus tblKtoEmpfangend bzw. tblKtoZahlend.

Ich möchte jetzt einen Bericht zu den Verträgen mit Einzelpositionen, in dem für jede Einzelposition das korrekte Konto enthalten ist inkl. Name der Gesellschaften und Name der Kennzeichen, mit Angabe von Steuer und Monat.

Ich habe schon gestern den ganzen Tag mit sämtlichen JOIN Arten experimentiert. Die Art, wie Access dann noch Klammern darum möchte, macht es auch nicht gerade einfacher. Auch mit einzelnen Unterabfragen, die dann in die Hauptabfrage laufen, habe ich es versucht.

Funktioniert das überhaupt mit Access, wie ich das gern hätte? Muss ich die Beziehungen überarbeiten, damit es funktioniert?
Für einen kleinen Denkanstoß wäre ich sehr dankbar


Viele Grüße
Eisbrecherin
Mitglied: SlainteMhath
15.08.2014 um 10:28 Uhr
Moin,

dein DB-Schema sieht auf den ersten Blick erstmal korrekt aus. Wenn du die Datenquelle für den report mit dem Abfrageeditor per Drag'n'Drop zusammenbastelst sollte das eigentlich passen.

Wo genau liegt denn dein Problem?

lg,
Slainte
Bitte warten ..
Mitglied: Eisbrecherin
15.08.2014 um 11:59 Uhr
Hallo!

Mir fehlt etwas der Durchblick beim doppelten Einbinden der Tabellen. Gesellschaft, Kennzeichen und Steuer brauche ich ja doppelt. Mein Abfrage-Diagramm sieht damit so aus:
abbea075ba9b873f3b3b11a2c42a1a24 - Klicke auf das Bild, um es zu vergrößern

Wenn ich das ausführe, bekomme ich auch drei Einträge. Allerdings sind die Einträge falsch:
ff0373044d77fc0a98ae9c7693ec5f50 - Klicke auf das Bild, um es zu vergrößern

Die Gesellschaft Empfänger stimmt, Gesellschaft Zahlender stimmt aber nicht. Beim Kennzeichen sollten bei beiden unterschiedliche Kennzeichen stehen. Die Beschreibung dagegen stimmt wieder.

Irgendwo ist da noch der Wurm drin.
Vielleicht sollte ich mal die beiden Tabellen mit den Konten in eine zusammenführen und dann halt ein Konto Zahlend und eines empfangend. Würde das mehr Sinn machen?


Viele Grüße
Eisbrecherin
Bitte warten ..
Mitglied: SlainteMhath
LÖSUNG 15.08.2014, aktualisiert 18.08.2014
Vielleicht sollte ich mal die beiden Tabellen mit den Konten in eine zusammenführen und dann halt ein Konto Zahlend und eines empfangend. Würde das mehr Sinn machen?
Das macht die Sache einfacher, sicher. Wenn dann dabei noch Redundanzen innerhalb der Daten reduziert werden, umso besser
Bitte warten ..
Mitglied: Biber
15.08.2014 um 13:13 Uhr
Moin Eisbrecherin,

poste doch mal das generierte Statement, dann rücken wir das zurecht.

Und zum Verständnis:

In deinen Tabellen ist die Verknüpfung zu den Dimensionstabellen ja notgedrungen immer über diese ID-Felder, beispielsweise
steht in tblGesellschaft ja ein Feld "ID" und ein Feld "NameGes".

Die Verknüpfung zu (bspw.) tblKtoEmpfangend geht dann über das Feld "tblKtoEmpfangend GesellName", welches unabhängig vom Feldname in Wirklichkeit eine ID enthält, die auf "tblGesellschaft ID" refernziert????

Ich finde das DB-Modell nicht in Ordnung...zu viele irreführende Feldnamen, zu viele künstliche IDs.
Wonach sind denn die Vertragspositionen geordnet? Ich sehe da zwar den FK auf den zugehörigen Vertrag, aber keine "laufende Nummer" für Position 1, 2, 3....?

P.S. Aber deine verbale Beschreibung des Sachverhalts ist wirklich vorbildlich!

Grüße
Biber
Bitte warten ..
Mitglied: Eisbrecherin
15.08.2014 um 13:44 Uhr
Hallo Biber,

vielleicht sollte ich also lieber rausfinden, ob Access auch eine Spracherkennung hat? Das würde es einfacher machen

Ich habe jetzt erst mal die Felder umbenannt, damit man eher sieht, was ein Schlüssel in einer anderen Tabelle ist:
682866ac9c6029f45ad16ccba45e93b7 - Klicke auf das Bild, um es zu vergrößern

Und hier die zugehörige SQL Abfrage:
01.
SELECT tblVertrag.VertragNr, tblKtoZahlend.Konto, tblVertragPosition.fk_KZ, tmpGesEmpf.NameGes, tmpGesZahl.NameGes, tblVertragPosition.Beschreibung 
02.
FROM ((tblKennzeichen AS tmpKZ_Zahl  
03.
INNER JOIN (tblGesellschaft AS tmpGesZahl  
04.
INNER JOIN tblKtoZahlend ON tmpGesZahl.ID = tblKtoZahlend.[fk_Ges])  
05.
ON tmpKZ_Zahl.ID = tblKtoZahlend.[fk_KZ])  
06.
INNER JOIN ((tblKennzeichen AS tmpKZ_Empf  
07.
INNER JOIN (tblGesellschaft AS tmpGesEmpf  
08.
INNER JOIN tblKtoEmpfangend ON tmpGesEmpf.ID = tblKtoEmpfangend.[fk_Ges])  
09.
ON tmpKZ_Empf.ID = tblKtoEmpfangend.[fk_KZ])  
10.
INNER JOIN (tblSteuer AS tmpVST  
11.
INNER JOIN (tblSteuer AS tmpMWST  
12.
INNER JOIN tblVertrag ON tmpMWST.ID = tblVertrag.[fk_Steuer])  
13.
ON tmpVST.ID = tblVertrag.[fk_Steuer])  
14.
ON tblKtoEmpfangend.ID = tblVertrag.[fk_KtoEmpf])  
15.
ON tblKtoZahlend.ID = tblVertrag.[fk_KtoZahl])  
16.
INNER JOIN (tblMonat  
17.
INNER JOIN tblVertragPosition ON tblMonat.ID = tblVertragPosition.[fk_Div])  
18.
ON tblVertrag.ID = tblVertragPosition.fk_Vertrag;
Die Vertragspositionen sind nicht extra geordnet. Ist hier nicht nötig.


Viele Grüße
Eisbrecherin
Bitte warten ..
Mitglied: SlainteMhath
15.08.2014, aktualisiert um 14:14 Uhr
Du solltest noch die Kardinalitäten für die FKs richtig einstellen bzw die referenzielle Integrität einschalten (ohne Löschweitergabe), dann ist das schon mal sauber - und Access bastelt schönere JOINs

Ggfs. kannst du noch die Tabellen tblKtoiEmpfangend mit tblKontoZahlend und die KZ und Zahl Tabellen zu jeweils einer Tabelle zusammen führen (dann wird der Select auch schon übersichtlicher)

/EDIT:
P.S. Aber deine verbale Beschreibung des Sachverhalts ist wirklich vorbildlich!
Dem kann ich nur zustimmen - das liest sich wie eine Klausuraufgabe :P
Bitte warten ..
Mitglied: Eisbrecherin
15.08.2014 um 14:27 Uhr
Die referenzielle Integrität ist bei den Beziehungen aktiviert. Wie kann ich die denn in der Abfrage einstellen? Sobald ich hier eine Tabelle doppelt aufnehme, verschwindet das.
Die Verknüpfungen in der Abfrage stehen auf 1 (nur die Datensätze, die in beiden Tabellen gleich sind).

Dann werde ich mich mal ans Verknüpfen der Tabellen machen.
Bitte warten ..
Mitglied: SlainteMhath
15.08.2014 um 14:47 Uhr
Achso, das ist der Abfrage Editor.. sorry, ich dachte das ist das (gesamte) DB Schema... ok vergiss was ich über die Kardinalität usw gesagt habe .)
Bitte warten ..
Mitglied: Biber
LÖSUNG 15.08.2014, aktualisiert 18.08.2014
Moin Eisbrecherin,

leider muss ich jetzt mal das Wochenende vorbereiten und dich mit deinem Elend etwas alleine lassen.

Aber als Hinweis, bis ich wieder mal einen Rechner anschalte:
- stell die Abfragereihenfolge mal vom Kopf auf die Füsse - das generierte Statement nimmt als "zentrale Tabelle" für den ganzen Aufbau die "tblKennzeichen".... das kann nicht gutgehen.

Die "zentrale Tabelle", die als erstes genannt werden muss in dem ganzen FROM... INNER JOIN..INNER JOIN -Rattenschawanz ist die "tblVertragPosition", damit geht es los.

Das FROM sollte dann also von dieser Tabelle aus -beim Testen schrittweise, Verknüpfung um Verknüfung vorgehen:

01.
-- nur ein Anfang ... 
02.
SELECT v.*, vpos.* , m.* 
03.
 
04.
 FROM tblVertragPosition vpos 
05.
INNER JOIN tblMonat m ON m.ID = vpos.fk_Div 
06.
INNER JOIN tblVertrag v ON v.ID = vpos.fk_vertrag 
07.
 
08.
...usw.
Und zum Testen erstmal mit einer WHERE-Bedingung "WHERE v=ID = 4711" oder eine andere Vertragsnummer, die existiert
Natürlich auch statt v.*, vpos.* usw nur die Felder, die du auch brauchst.

Ich klinke mich gern wieder ein, aber nicht in den nächsten 20 Stunden.

Grüße
Biber
Bitte warten ..
Mitglied: Eisbrecherin
18.08.2014 um 17:27 Uhr
Hallo Biber und Slainte,

ich habe meine Tabellen noch ein bisschen überarbeitet (gibt nur noch eine Tabelle für die Konten) und bin gerade dabei, die Abfrage INNER JOIN für INNER JOIN aufzubauen.
Momentan sieht sie so aus:
01.
SELECT  
02.
	vpos.KST_Empf, vpos.KST_Zahl, vpos.Beschreibung, m.Monat, v.VertragNr, kz_empf.NameKZ, s.MwSt, s.VSt, s.Satz, kto_empf.KtoEmpfangend, g_empf.NameGes, kto_zahl.KtoEmpfangend, g_zahl.NameGes 
03.
FROM ((((tblVertragPosition vpos 
04.
INNER JOIN tblMonat m ON m.Divisor = vpos.fk_Monat) 
05.
INNER JOIN tblVertrag v ON v.ID = vpos.fk_Vertrag) 
06.
INNER JOIN (tblKennzeichen kz_empf  
07.
INNER JOIN (tblKonto kto_empf 
08.
INNER JOIN (tblVertrag v_empf  
09.
INNER JOIN tblGesellschaft g_empf ON g_empf.ID = v_empf.fk_GesellEmpf) 
10.
ON v_empf.fk_GesellEmpf = kto_empf.fk_Ges) 
11.
ON kz_empf.ID = kto_empf.fk_KZ) 
12.
ON kz_empf.ID = vpos.fk_KZ) 
13.
INNER JOIN (tblKennzeichen kz_zahl 
14.
INNER JOIN (tblKonto kto_zahl 
15.
INNER JOIN (tblVertrag v_zahl 
16.
INNER JOIN tblGesellschaft g_zahl ON g_zahl.ID = v_zahl.fk_GesellZahl) 
17.
ON v_zahl.fk_GesellZahl = kto_zahl.fk_Ges) 
18.
ON kz_zahl.ID = kto_zahl.fk_KZ) 
19.
ON kz_zahl.ID = vpos.fk_KZ) 
20.
INNER JOIN tblSteuer s ON s.ID = vpos.fk_Steuer
Es ist noch nicht alles drin, aber der Teil zumindest funktioniert schon mal. Wenn mich Access komplett in den Wahnsinn treibt, wird der Rest hoffentlich auch noch

Ich markiere jetzt erst mal als gelöst, sollte es doch nicht so wollen wie ich melde ich mich nochmal.
Danke auf jeden Fall für eure Denkanstöße
Bitte warten ..
Mitglied: Biber
18.08.2014 um 19:33 Uhr
Moin Eisbrecherin,

Zitat von Eisbrecherin:

...
Es ist noch nicht alles drin, aber der Teil zumindest funktioniert schon mal.
So war der Plan, und ich denke, dieses Vorgehen hilft dir auch für die nächsten 20 Statements.
Ich denke, du bist auf dem richtigen Weg.

Wenn mich Access komplett in den Wahnsinn treibt, wird der Rest hoffentlich auch noch
Hoffentlich auch, wenn dich Access NICHT in den Wahnsinn treibt.


Ich markiere jetzt erst mal als gelöst, sollte es doch nicht so wollen wie ich melde ich mich nochmal.
Ich sage es voraus: Wenn das Statement drei DIN-A4-Seiten lang ist und nur noch eine einzige Tabelle drangeflanscht werden soll, dann wird dir Access mit einer lapidaren Meldung "Ungültige Anweisung in Nähe von ")", ankommen und du wirst schreien.

Wenn es zu holzig wird, dann kannst du mir auch den aktuellen Stand per Mail (Adresse in meinem Profil) senden.

Viel Glück
Biber
Bitte warten ..
Mitglied: Eisbrecherin
19.08.2014 um 16:56 Uhr
Hi Biber,

Zitat von Biber:
Hoffentlich auch, wenn dich Access NICHT in den Wahnsinn treibt.
Sieht so aus, als hätte Access sein Ziel nicht erreicht...
Und manchmal sind WHERE Bedingungen einfach mehr wert als jeder JOIN

So sieht's jetzt aus:
01.
SELECT 
02.
v.VertragNr, v.VertragAenderungjahr, v.VertragAenderungUnterjahr, 
03.
g_empf.NameGes AS GesEmpfangend, g_zahl.NameGes AS GesZahlend,  
04.
vpos.KST_Empf, kto_empf.KtoEmpfangend,  
05.
vpos.KST_Zahl, kto_zahl.KtoZahlend,  
06.
kz.NameKZ, vpos.Beschreibung,  
07.
s.MwSt, s.VSt, s.Satz,   
08.
m.Monat,  vpos.BetragMonatNetto, (vpos.BetragMonatNetto / 100 * s.Satz) AS BetragSteuer, (BetragSteuer + vpos.BetragMonatNetto) AS BetragBrutto, vpos.GJ 
09.
 
10.
FROM ((((tblVertragPosition AS vpos 
11.
INNER JOIN tblMonat AS m ON m.Divisor = vpos.fk_Monat) 
12.
INNER JOIN tblSteuer AS s ON s.ID = vpos.fk_Steuer) 
13.
 
14.
INNER JOIN ((tblVertrag AS v 	 
15.
INNER JOIN (tblGesellschaft AS g_empf 	 
16.
INNER JOIN tblKonto AS kto_empf ON kto_empf.fk_Ges = g_empf.ID) 
17.
ON g_empf.ID = v.fk_GesellEmpf) 
18.
INNER JOIN (tblGesellschaft AS g_zahl  
19.
INNER JOIN tblKonto AS kto_zahl ON kto_zahl.fk_Ges = g_zahl.ID) 
20.
ON g_zahl.ID = v.fk_GesellZahl) 
21.
ON v.ID = vpos.fk_Vertrag) 
22.
 
23.
INNER JOIN tblKennzeichen AS kz ON kz.ID = vpos.fk_KZ)  
24.
 
25.
WHERE kto_empf.fk_Ges = g_empf.ID AND kto_empf.fk_KZ = kz.ID AND kto_zahl.fk_Ges = g_zahl.ID AND kto_zahl.fk_KZ = kz.ID;
Und wer jetzt noch was geändert haben will, muss schon ein paar Kilo Schoki springen lassen
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Datenbanken
gelöst Access 2010 Abfrage erster Werktag (10)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Datenbanken
gelöst Access 2010 komplizierte Abfrage (3)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Datenbanken
gelöst Syntaxfehler VBA Access 2010 (6)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...