PDA

Vollständige Version anzeigen : Datenverknüpfung Acces - Excel


Johannes Kern
23.09.2011, 13:14
Hallo Zusammen

Wenn ich im Excel 2007 eine Abfrage aus dem Access 2007 verknüpfen möchte, macht Excel nicht was ich will. Ich wähle als Tabelle im Excel die Abfrage "Lieferanten Total" aus in deiser Abfrage sind gewisse Datensätze gruppiert (Also die Summe bzw. der Druchschnitt einzelner Felder)

Im Excel jedoch, werden diese Datensätze wieder einzeln aufgelistet.

Wieso ist das?

Gruss

chris-kaiser
23.09.2011, 16:20
Hi

Diese Fragestellung ist vergleichbar mit......

wenn ich mein Auto (Audi Axx) starten möchte und ich eigentlich den richtigen Schlüssel dafür verwende diesen im Zündschloß umdrehe startet mein Auto nicht. Wieso ist das so.

Ich tippe darauf das die Abfrage nicht passt, oder eine falsche Abfrage gewählt worden ist.

Jonk
26.09.2011, 11:49
Ok die dürftige Fragestellung tut mir leid.

Versuch Zwei:

Screenshot: http://imageshack.us/photo/my-images/8/screenshotlstatistik.jpg

Es werden dabei die 25 grössten NettoNetto Werte aus der Datenbank abgefragt. Die Dahinterliegende Abfrage:

Lieferanten Aggregiert nach Gesellschaft
SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, Lieferantenstatistik.Bezeichnung, "VIZEUM Switzerland AG" AS Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung NOT Like "*Publicitas*" AND Lieferantenstatistik.Bezeichnung NOT Like "*Publimedia*" AND Lieferantenstatistik.Bezeichnung NOT LIKE "*PUBLICITAS*"

AND
(((Lieferantenstatistik.Bezeichnung) NOT Like "*goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*Goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*GOLDBACH*"))
AND
Lieferantenstatistik.Bezeichnung NOT Like "*Publisuisse*" AND Lieferantenstatistik.Bezeichnung NOT Like "*PUBLISUISSE*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Ringier*" AND Lieferantenstatistik.Bezeichnung NOT Like "*RINGIER*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Tamedia*" AND Lieferantenstatistik.Bezeichnung NOT Like "*TAMEDIA*"
AND Lieferantenstatistik.Gesellschaft LIKE "VIZEUM Switzerland AG"

GROUP BY Lieferantenstatistik.Bezeichnung;

UNION
SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, Lieferantenstatistik.Bezeichnung, "CARAT Switzerland AG" AS Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung NOT Like "*Publicitas*" AND Lieferantenstatistik.Bezeichnung NOT Like "*Publimedia*" AND Lieferantenstatistik.Bezeichnung NOT LIKE "*PUBLICITAS*"

AND
(((Lieferantenstatistik.Bezeichnung) NOT Like "*goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*Goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*GOLDBACH*"))
AND
Lieferantenstatistik.Bezeichnung NOT Like "*Publisuisse*" AND Lieferantenstatistik.Bezeichnung NOT Like "*PUBLISUISSE*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Ringier*" AND Lieferantenstatistik.Bezeichnung NOT Like "*RINGIER*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Tamedia*" AND Lieferantenstatistik.Bezeichnung NOT Like "*TAMEDIA*"
AND Lieferantenstatistik.Gesellschaft LIKE "CARAT Switzerland AG"

GROUP BY Lieferantenstatistik.Bezeichnung;

UNION

SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, Lieferantenstatistik.Bezeichnung, "AEGIS MEDIA CENTRAL SERVICES" AS Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung NOT Like "*Publicitas*" AND Lieferantenstatistik.Bezeichnung NOT Like "*Publimedia*" AND Lieferantenstatistik.Bezeichnung NOT LIKE "*PUBLICITAS*"

AND
(((Lieferantenstatistik.Bezeichnung) NOT Like "*goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*Goldbach*" AND (Lieferantenstatistik.Bezeichnung) NOT Like "*GOLDBACH*"))
AND
Lieferantenstatistik.Bezeichnung NOT Like "*Publisuisse*" AND Lieferantenstatistik.Bezeichnung NOT Like "*PUBLISUISSE*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Ringier*" AND Lieferantenstatistik.Bezeichnung NOT Like "*RINGIER*"
AND Lieferantenstatistik.Bezeichnung NOT Like "*Tamedia*" AND Lieferantenstatistik.Bezeichnung NOT Like "*TAMEDIA*"
AND Lieferantenstatistik.Gesellschaft LIKE "AEGIS MEDIA CENTRAL SERVICES"

GROUP BY Lieferantenstatistik.Bezeichnung

UNION

SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, "Goldbach" AS Bezeichnung, Lieferantenstatistik.Gesellschaft
FROM Lieferantenstatistik
WHERE (((Lieferantenstatistik.Bezeichnung) Like "*goldbach*" Or (Lieferantenstatistik.Bezeichnung) Like "*Goldbach*" Or (Lieferantenstatistik.Bezeichnung) Like "*GOLDBACH*"))
GROUP BY Lieferantenstatistik.Gesellschaft

UNION

SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, "Publimedia" AS Bezeichnung, Lieferantenstatistik.Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung Like "*Publicitas*" Or Lieferantenstatistik.Bezeichnung Like "*Publimedia*" Or Lieferantenstatistik.Bezeichnung Like "*PUBLICITAS*"
GROUP BY Lieferantenstatistik.Gesellschaft

UNION

SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, "Publisuisse" AS Bezeichnung, Lieferantenstatistik.Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung Like "*Publisuisse*" Or Lieferantenstatistik.Bezeichnung Like "*PUBLISUISSE*"
GROUP BY Lieferantenstatistik.Gesellschaft

UNION

SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, "Tamedia" AS Bezeichnung, Lieferantenstatistik.Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung Like "*Tamedia*" Or Lieferantenstatistik.Bezeichnung Like "*TAMEDIA*"
GROUP BY Lieferantenstatistik.Gesellschaft

UNION SELECT ROUND(Sum(Lieferantenstatistik.Brutto),2) AS Brutto, ROUND(Sum(Lieferantenstatistik.NettoNetto),2) AS NettoNetto, ROUND(Avg(Lieferantenstatistik.Satz),2) AS Satz, "Ringier" AS Bezeichnung, Lieferantenstatistik.Gesellschaft
FROM Lieferantenstatistik
WHERE Lieferantenstatistik.Bezeichnung Like "*Ringier*" Or Lieferantenstatistik.Bezeichnung Like "*RINGIER*"
GROUP BY Lieferantenstatistik.Gesellschaft
ORDER BY NettoNetto DESC;

Aus dieser Abfrage wird aus einfachheitsgründen eine zweite Abfrage ausgeführt

Lieferanten Total
SELECT TOP 25 Round(Sum([Lieferanten Aggregiert nach Gesellschaft].[Brutto]),2) AS Brutto, Round(Sum([Lieferanten Aggregiert nach Gesellschaft].[NettoNetto]),2) AS NettoNetto, [Lieferanten Aggregiert nach Gesellschaft].Bezeichnung
FROM [Lieferanten Aggregiert nach Gesellschaft]
GROUP BY [Lieferanten Aggregiert nach Gesellschaft].Bezeichnung
ORDER BY Round(Sum([Lieferanten Aggregiert nach Gesellschaft].[NettoNetto]),2) DESC;

Diese Abfrage wird dann im Excel verknüpft.

Danke für die schnelle Hilfe!

Gruss

chris-kaiser
26.09.2011, 13:03
Hallo Johannes

der SQL String wird aber nicht über runsql ausgeführt oder?
ich würde das mit den Top25 auch noch in der gleichen Abfrage erledigen, bzw. wenn diese nur für Excel benötigt eine Abfrage machen group kombiniert mit den Top25. werden in der Abfrgae die Daten richtig angezeigt, müssten die Daten auch in Excel so erscheinen.

Zumindest hatte ich diesbezüglich noch nie Probleme.

Deine Verküpfung erzeugst du durch Menü Daten -> aus Access
vermute ich mal, oder ist bei Dir der Vorgang anders?

Wenn es mit der kombinierten Abfrage nicht gehen sollte könntest du auch im Acc.forum nachfragen.

Ein Experte auf dem Gebiet ist sicherlich der User ebs17 (Eberhard), möglicherweise liest er ja das mit. Mit SQL kennt er sich saugut aus, da bin ich eine Null dagegen.

Luschi
27.09.2011, 08:51
Hallo Jonk, Johannes oder ???,

ich mach in solchen Fällen noch eine 3. Abfrage, in der dann nur noch
Select * From Abfrage2;
drin steht und gebe Excel den Auftrag, die Daten aus dieser Access-Abfrage zu holen. Gerade mit Union-Abfragen
hat da die Kombination Excel/Access so seine liebe Müh und Not. Das sieht man schon darin, daß solche
Abfragen garnicht in Excel-Auswahlmenü der Datenquelle von Access-Abfragen auftauchen.

Gruß von Luschi
aus klein-Paris

PS: Wenn alles nichts hilft, dann mach doch eine Tabellenerstellungsabfrage
und dagegen kann Excel bestimmt nicht anstinken (nicht schön, aber hilfreich!)

Jonk
27.09.2011, 14:10
Danke für die Antworten! Ich denke auch, dass sich Excel wegen den Union - Abfragen doof stellt. Leider hat das verschachteln mit der 3. Abfrage auch nicht geklappt.

Was meinst du genau mit einer Tabellenerstellungsabfrage?

Gruss

Johannes

ebs17
27.09.2011, 15:44
Im Excel jedoch, werden diese Datensätze wieder einzeln aufgelistet.
Was heißt das genau? Dein Bild ist nicht aussagefähig, da ist nichts zu erkennen.
Dass aus einer gruppierten/aggregierten Abfrage wieder Einzeldatensätze reproduzierbar und sogar anzeigbar sein sollen, würde ich bestreiten wollen. Wie sieht es denn direkt in der Datenbank aus? Durch eine Verknüpfung ändern sich keine Inhalte.

Zu den Abfragen hätte ich aber auch schon Hinweise:

=> UNION scheint gar nicht erforderlich zu sein. Man kann auch Kriterien kombinieren (z.B. mit OR-Verknüpfung) statt Datensätze.

=> SQL unterscheidet analog zu Windows nicht zwischen Groß- und Kleinschreibung von Buchstaben (außer bei besonderen Tabelleneinstellungen). Daher sind einige Kriterieninhalte schlicht überflüssig. Weglassen erhöht die Übersicht. Bei Verwendung eines Tabellen-Alias wäre es zusätzlich noch einmal übersichtlicher.

=> Mit Round hat man keine kaufmännische Rundung, vergleiche Runden (http://www.donkarl.com?FAQ2.1)

=> Das ganze Kriteriengeflecht deutet auf sehr schlechten Stil oder auf eine schlechte Datenbankstruktur (Datenmodell) hin:
Lieferantenstatistik.Bezeichnung NOT Like "*Publisuisse*" AND ...
Mit NOT, LIKE "*..." und UNION wird die mögliche Verwendung einer Indexierung verhindert. Besonders schnell dürfte diese Abfrage nicht sein.

@Chris: Danke für die Blumen.

Jonk
28.09.2011, 09:08
Hallo Ebs

An der Datenstruktur kann ich leider nichts ändern, da die Rohdaten aus einem externen Programm exportiert und nur zwecks verarbeitung im Access sind. Da meine SQL-Kentnisse nicht sonderlich gross sind, habe ich keine andere Lösung gefunden, als die mit Union.

Ich wäre froh, wenn du mir hier ein paar Tipps geben könntest =)

Das mit dem Runden werde ich mir anschauen.

Leider kann ich dir die Daten nicht zur vefüghung stellen (vgl. Bild), da es Firmeninterne Informationen sind.

Danke und Viele Grüsse

Johannes

Luschi
28.09.2011, 09:59
Hallo Jonk,

wird vom externen Programm jedesmal eine neue Access-DB erstellt oder immer in die selbe die Daten reingeschrieben?
Ich würde Folgendes machen:
- per Vba die Tabelle 'Lieferantenstatistik' datensatzweise durchlaufen
- in einem 'unverdächtigen' Text-Feld das Chr(160)-Zeichen am Feldinhalt anängen und zwar
immer dann, wenn im Feld 'Bezeichnung' die Ausschlußkriterien
*Publicitas*, *Publimedia* usw. auftauchen
- das Chr(160)-Zeichen sieht aus wie ein Leerzeichen und wird in Winword als
'geschützes ' Leerzeichen benutzt
Dann brauch man nur noch eine normale Select-Abfrage mit der Bedingung:
Select ... From ... Where Right(Lieferantenstatistik.'unverdächtiges Feld', 1) <> Chr(160);
- hinterher das Zeichen wieder entfernen oder wenn's keinem stört einfach drinlassen.
Ich kenne Firmen, die versuchen auf diese Weise Ihre Adressdaten zu kennzeichnen.

Gruß von Luschi
aus klein-Paris

Jonk
03.10.2011, 09:29
Hallo Luschi

Das Ding ist, dass in dieser Tabelle "Lieferantenstatistik" ca 60'000 Datensätze drin sind, die zuerst verarbeitet werden müssen. Das würde warscheinlich die Abfrage ins unendliche verlangsamen.

Danke trotzdem

Gruss