Falsche Anzeige in Excel nach Sql Abfrage

Hallo Experten,

ich habe ein kleines Problem, ich habe eine Datenbank in Microsoft-Access erstellt mit zwei Tabellen(Tabelle1 und Tabelle2) mit den Feldern Bezeichnung(Text) und Wert(Ja/Nein).
In Excel VBA habe ich eine SQL Abfrage programmiert:

sql = „SELECT Tabelle1.Bezeichnung, Tabelle2.Bezeichnung From Tabelle1,Tabelle2 Where Tabelle1.Wert =“ & strVar1
sql = sql & " AND Tabelle2.Wert =" & strVar1

'StrVar1 und strVar2 sind Strings (strVar1 = „True“ strVar2 = „True“)

Die Abfrage funktioniert gut, aber die Anzeige der Ergebnisse in Excel ist falsch. die Werte von Tabelle2 wiederholen sich, also Werte von Tabelle1 wird so angezeigt wie gewollt, Werte von Tabelle 2 aber nicht.

Ergebnis der Abfrage in Excel.

Bezeichnung von Tabelle1 Bezeichnung von Tabelle2

a a
b a
c a
a b
b b
c b
a c
b c
c c

Die Anzeige sollte aber so sein:

Werte von Tabelle 1 Werte von Tabelle2
a a
b b
c c

Hallo,

Du selektierst momentan alles und uneingeschränkt was in Deinen Tabellen steht - und das sind drei mal drei Werte und diese werden angezeigt.

Aus meiner Sicht brauchst Du noch eine Verbindung (JOIN) zwischen Deinen Bezeichnungen. In SQL würde das so aussehen:

SELECT Tabelle1.Bezeichnung, Tabelle2.Bezeichnung
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.Bezeichnung = Tabelle2.Bezeichnung;

Wie’s genau in VBA aussieht… - laß’ es mich wissen, wenn der Hinweis geholfen hat. Grüße.

Hallo Dieter,

zuerst will ich mich für deine Hilfe bedanken,
ich habe ein Fehler gemacht, ich hätte meine Frage deutlicher und ausführlicher schreiben sollen, jetzt versuch ich es mal;D

mit INNER JOIN verknüpft man zwei Tabellen die ein gemeinsames Feld haben… in meinem Programm ist dies nicht der Fall.

Meine erste Tabelle (Tabelle1) besteht aus folgenden Feldern:

Beschreibung (text): z.b. Mercedes, BMW, VW
Neuwagen (Ja/NEin)
Automatik (Ja/Nein)

Die zweite Tabelle(Tabelle2)

Name (text): z.b. Müller, Brigitte, Frank
Männlich (Ja/Nein)
Weiblich (Ja/Nein)

So dies sind die Tabellen in meiner DB in Acces.
Neuwagen, Automatik, Männlich, Weiblich sind in meinem Userform in Excel Optionsfelder und als Bolean definiert, wenn ich auf diese als Bediener klicke werden sie true und sollen nach der sql abfrage in einer neuen tabelle angezeigt werden.

SQL :

dim strneu$, strauto$, strmän$, strweib As String
… wenn ich auf das bestimmte optionsfeld drücke setzte ich diesen string auf true und die anderen auf false -> danach vergleich ich mit sql ob z.b. Automatik oder Männlich in der Tabelle auf Ja gelegt ist, wenn ja soll er diese anzeigen.

sql = „Select Tabelle1.Beschreibung, Tabelle2.Name From Tabelle1, Tabelle2 Where Tabelle1.Neuwagen =“ & strneu
sql = sql " AND Tabelle1.Automatik =" & strauto
sql = sql " AND Tabelle2.Männlich =" & strmän
sql = sql " AND Tabelle2.Weiblich =" & strweib

-> Die Abfrage funktioniert, ABER

wie gesagt zeigt er diese nicht richtig an.

Beschreibung:… Name:
Mercedes…Frank
BMW…Frank
AUdi…Frank
Mercedes…Müller
BMW…Müller
Audi…Müller
usw.

Für Inner Join bräuchte ich doch ein gemeinsames feld, oder?
meine abfrage ist aber etwas komplexer, weil ich aus zwei tabellen abfrage, und mit der bedingung, dass die felder in der tabelle die auf Ja/Nein gesetzt sind gleich dem gewähltem Optionsfeld.

Hoffe das es jetzt nicht zu verwirrend geworden ist:wink:

INNER JOIN ist das Zauberwort!

SELECT Tabelle1.Bezeichnung, Tabelle2.Bezeichnung AS Bezeichnung2
FROM Tabelle1 INNER JOIN
Tabelle2 ON Tabelle1.Bezeichnung = Tabelle2.Bezeichnung
WHERE (Tabelle1.Wert = ‚True‘) AND (Tabelle2.Wert = ‚True‘)

Gruß
Lutz

Hallo Lutz,

Vielen Dank für deine Hilfe!!!

Für INNER JOIN müssten die Tabellen (Tabelle1,Tabelle2) ein gemeinsames Feld haben, dies ist aber nicht der Fall.

ich weis nicht ob du die Antwort sehen kannst, die ich dem Dieter geschrieben habe, weil er das mit dem INNER JOIN auch vorgeschlagen hatte…

Hier die Antwort:

Meine erste Tabelle (Tabelle1) besteht aus folgenden Feldern:

Beschreibung (text): z.b. Mercedes, BMW, VW
Neuwagen (Ja/NEin)
Automatik (Ja/Nein)

Die zweite Tabelle(Tabelle2)

Name (text): z.b. Müller, Brigitte, Frank
Männlich (Ja/Nein)
Weiblich (Ja/Nein)

So dies sind die Tabellen in meiner DB in Acces.
Neuwagen, Automatik, Männlich, Weiblich sind in meinem Userform in Excel Optionsfelder und als Bolean definiert, wenn ich auf diese als Bediener klicke werden sie true und sollen nach der sql abfrage in einer neuen tabelle angezeigt werden.

SQL :

dim strneu$, strauto$, strmän$, strweib As String
… wenn ich auf das bestimmte optionsfeld drücke setzte ich diesen string auf true und die anderen auf false -> danach vergleich ich mit sql ob z.b. Automatik oder Männlich in der Tabelle auf Ja gelegt ist, wenn ja soll er diese anzeigen.

sql = „Select Tabelle1.Beschreibung, Tabelle2.Name From Tabelle1, Tabelle2 Where Tabelle1.Neuwagen =“ & strneu
sql = sql " AND Tabelle1.Automatik =" & strauto
sql = sql " AND Tabelle2.Männlich =" & strmän
sql = sql " AND Tabelle2.Weiblich =" & strweib

-> Die Abfrage funktioniert, ABER

wie gesagt zeigt er diese nicht richtig an.

Beschreibung:… Name:
Mercedes…Frank
BMW…Frank
AUdi…Frank
Mercedes…Müller
BMW…Müller
Audi…Müller
usw.

Für Inner Join bräuchte ich doch ein gemeinsames feld, oder?
meine abfrage ist aber etwas komplexer, weil ich aus zwei tabellen abfrage, und mit der bedingung, dass die felder in der tabelle die auf Ja/Nein gesetzt sind gleich dem gewähltem Optionsfeld.

Hoffe das es jetzt nicht zu verwirrend geworden ist:wink:

Dann ist die Anzeige aber doch richtig: auf je 2 Namen und je 1 Auto trifft die Abfrage zu; der SQL Server macht daraus einen CROSS JOIN: jedes Ergebnis der ersten Tabelle wird mit jedem Ergebnis der zweiten Tabelle verknüpft. Was ist daran falsch bzw. wie sollte deiner Meinung nach das Ergebnis aussehen?

Gruß
Lutz

Aso, dass wusste ich nicht!!!

Das Ergebnis soll so aussehen:

Beschreibung:…Name:
Mercedes…Frank
BMW…Müller
Audi…Schmid

die erste Tabelle und die zweite Tabelle haben im Access-DB abgesehen von Beschreibung und Name die selben Felder.
wenn ich als Bediener im Excel-Userform auf die gewünschten Optionsfelder drücke sollen nur die Werte in Beschreibung und Name angezeigt werden die ein true haben…

aaaaaaaaaaahhhh jetzt versteh ich ;D
ich kann die felder von der ersten und von der zweiten tabelle mit ausnahme von beschreibung und name als Inner Join verknüpfen, da die tabellen die selben felder besitzten!
ich probiere es gleich mal aus ;D

Vielen DANK LUTZ

gruß
WillsWissen

Hallo Lutz,

ich hab das versucht, jetzt hab ich als Ergebnis das selbe nur umgekehrt.

SQL Abfrage:

sql = "SELECT tabelle1.Beschreibung, tabelle2.Name From tabelle1 INNER JOIN tabelle2 ON tabelle1.Land = tabelle2.Land AND tabelle1.Nummer = tabelle2.Nummer Where tabelle1.Land = „true“ ANd tabelle1.Nummer=„True“

Land und Nummer sind felder die in beiden tabellen vorhanden sind mit (Ja/Nein).
Ich wollte die tabellen miteinander verknüpfen, die die selben (Ja/Nein) Werte haben, danach mit der Where Bedingung die Verknüpfung mit dem Userform erstellen.

das ergebnis sieht momentan so aus:

Beschreibung:…Name:
Mercedes…Frank
Mercedes…Walter
Mercedes…Uli
Audi…Frank
Audi…Walter
Audi…Uli

Kannst du weiterhelfen?

Gruß
WillsWissen

Was soll denn als Ergebnis kommen? Ist doch so richtig was ausgegeben wird.

ich will nicht, dass sich die Werte im ergebnis von Beschreibung wiederholen, das beispiel mit den automarken war nicht klug gewählt ;(

bei einem anderen beispiel würde das ergebnis so aussehen:

Schweißgeräte:…Schneidearten:
Laserschweißen…Scheren
Laserschweißen…Trennen
Laserschweißen…Brechen
Punktschweißen…Scheren
Punktschweißen…Trennen
Punktschweißen…Brechen
WIG schweißen…Scheren
WIG schweißen…Trennen
WIG schweißen…Brechen

Ich will aber :

Laser…Scheren
Punktschweißen…Trennen
WIG schweißen…Brechen

als Ergebnis, das sind 2 tabellen haben einige felder gemeinsam(Ja/Nein) aber das was angezeigt wird hängen nicht miteinander ab, ich will sie nur in einem excelsheet anzeigen.

Das geht aber nur, wenn du Schweißgeräte mit Schneidearten verknüpst. Ansonsten: no chance

ok… und wie?

mit Inner JOin ON?, weil so hab ich es versucht, geht aber auch nicht…

ok… und wie?

mit Inner JOin ON?, weil so hab ich es versucht, geht aber
auch nicht…

Das hat erst einmal nichts mit INNER JOIN zu tun, sondern mit der Datenstruktur der beiden Tabellen.
In einer dritten Tabelle könntest du den Geräten die Schweißart zuordnen. Anders geht es nicht.
Du sagst bisher: es gibt 3 Schweißgeräte und es gibt 3 Schweißarten, aber nur du weißt, das zB. Laser = Scheren. Das muss auch die Datenbank wissen, sonst gehts nicht.

hmmm… ok ich versuch es mal,
nochmals Danke für deine Hilfe :wink:

gruß
WIlss wissen

Hallo,

sorry für die späte Antwort.

Ich meine, daß Du ohne einem gleichlautenden Feld und einer darüber hergestellten Verbindung mit dem Join-Befehl nicht auskommst.

Empfehlung: in beiden Access-Tabellen ein Feld mit der „Auto-Wert-Eigenschaft“ anzulegen und diese beiden dann miteinander zu verknüpfen. Setzt Voraus, daß bei jeder neuen Dateneingabe immer in beide Tabellen Daten eingegeben werden.

kann leider nicht weiterhelfen