Access-Abfragen for Dummies

Hi Experten,

ich hab hier gerade ein delikates Problemchen…
folgende Basis ist gegeben:
Es sollen Abfragen von verschiedenen Tabellen gemacht werden, die chronologisch voneinander getrennt worden sind. Sprich es gibt z.B. eine Tabelle für 2003 und eine für 2004. Von diesen Tabellen sollen eben identische Abfragen erzeugt werden und nachdem das folgende wohl recht komplex wird (vermute ich) suche ich in TOP1 erst mal eine Möglichkeit wie man am besten per Dropdown eines Formulars die Datenquelle für die folgenden Abfragen bestimmen kann.
Geht das? Wie würdet ihr das am ehesten angehen?

TOP2 ist dann, dass eben diese Abfragen wohl leider nacheinander ablaufen müssen - macht das etwas aus von der abarbeitungszeit?
Es geht nämlich darum dass verschiedene Einträge einer Datenbank, die ca 250 MB gross ist zu gruppieren. im Idealfall sollte eben gleichzeitig noch eine andere Bedingung erfüllt werden weil ich denke, dass es viel Zeit kosten würde eine separate Abfrage dafür zu Bemühen.
Ein Beispiel worum es geht

Spalte1 Kosten Spalte3 Spalte4 Spalte5 Seriennummer
abc 123 def ghi jkl abcde
abc 531 def ghi jkl abcde
abc 69 def ghi jkl 12345
has 453 def ghi jkl 12345

nun sollen die Inhalte gruppiert werden, und die Kosten adiert…
dabei sollen aber auch die ANZAHL DER VERSCHIEDENEN Seriennummern einer Gruppierung betrachtet werden, ohne dass diese erst gruppiert und dann die Anzahl gezählt werden muss.
Nachdem aber auf manche Werte die gleiche Seriennummer mehrfach auftaucht kann ich Anzahl nicht nehmen, sonst wüsste ich aber auch nicht was ich machen soll… :frowning:

TOP3 (vmtl das kniffligste)
im idealfall sollte man um die auswertung zu bekommen auch noch ein paar „freehand“ eingaben machen können…
zum Beispiel, dass man sagt, nur alle Einträge verwenden, die als ersten Buchstaben ein a haben (like „a*“) oder die, die in einer anderen Spalte „Service“ eingetragen haben…
im idealfall auch noch vom user bestimmbar ob es eine UND oder eine ODER verknüpfung sein soll…
ich glaub das ist alles sehr schwierig, oder?

Vielen Dank schon mal…
Munich

Hi, Munich!

ich hab hier gerade ein delikates Problemchen…

Lecker. Für mich noch ein bisschen Sahne dazu:wink:

folgende Basis ist gegeben:
Es sollen Abfragen von verschiedenen Tabellen gemacht werden,
die chronologisch voneinander getrennt worden sind. Sprich es
gibt z.B. eine Tabelle für 2003 und eine für 2004. Von diesen
Tabellen sollen eben identische Abfragen erzeugt werden und

Was meinst Du mit „identische“ Abfragen? Willst Du auf alle Tabellen zugleich zugreifen, oder auf jede einzeln? Tabellen (und auch Abfragen) „zusammenfahren“ funktioniert mit UNION, z. B. SELECT Spalte1 Kosten Spalte3 Spalte4 Spalte5 Seriennummer FROM Tabelle2004 UNION SELECT Spalte1 Kosten Spalte3 Spalte4 Spalte5 Seriennummer FROM Tabelle2005. Dann hast Du eine Abfrage, die wie eine Deiner Tabellen aussieht.

nachdem das folgende wohl recht komplex wird (vermute ich)
suche ich in TOP1 erst mal eine Möglichkeit wie man am besten
per Dropdown eines Formulars die Datenquelle für die folgenden
Abfragen bestimmen kann.
Geht das? Wie würdet ihr das am ehesten angehen?

Bin mir gerade nicht sicher, was Du willst. Entweder spielst Du mit obiger Abfrage. Oder wenn Du mehrere Abfragen hast, schreibst Du die in ein Dropdownfeld (als Wertliste oder die Abfragenamen vorher in eine Tabelle), und nach dem Auswählen eines Eintrags setzt Du die RecordSource im Formular um.

TOP2 ist dann, dass eben diese Abfragen wohl leider
nacheinander ablaufen müssen - macht das etwas aus von der
abarbeitungszeit?

Wie „ablaufen“? Redest Du von Aktionsabfragen oder Auswahl?

Es geht nämlich darum dass verschiedene Einträge einer
Datenbank, die ca 250 MB gross ist zu gruppieren. im Idealfall
sollte eben gleichzeitig noch eine andere Bedingung erfüllt
werden weil ich denke, dass es viel Zeit kosten würde eine
separate Abfrage dafür zu Bemühen.
Ein Beispiel worum es geht

Spalte1 Kosten Spalte3 Spalte4 Spalte5 Seriennummer
abc 123 def ghi jkl abcde
abc 531 def ghi jkl abcde
abc 69 def ghi jkl 12345
has 453 def ghi jkl 12345

nun sollen die Inhalte gruppiert werden, und die Kosten
adiert…

Da wirst Du ein Hilfskonstrukt benötigen, auch der Übersicht halber: Baue Dir die UNION-Abfrage, die alle Tabellen zusammenfährt. Dann kannst Du ganz normal eine Abfrage mit Gruppierung, Aggregation und Bedingung bauen: SELECT x, SUM(y), COUNT(Seriennummer) FROM UnionAbfrage WHERE Feld1 like ‚*blubb*‘ mit GROUP BY, SORT etc. nach belieben.

dabei sollen aber auch die ANZAHL DER VERSCHIEDENEN
Seriennummern einer Gruppierung betrachtet werden, ohne dass
diese erst gruppiert und dann die Anzahl gezählt werden muss.
Nachdem aber auf manche Werte die gleiche Seriennummer
mehrfach auftaucht kann ich Anzahl nicht nehmen, sonst wüsste
ich aber auch nicht was ich machen soll… :frowning:

TOP3 (vmtl das kniffligste)
im idealfall sollte man um die auswertung zu bekommen auch
noch ein paar „freehand“ eingaben machen können…
zum Beispiel, dass man sagt, nur alle Einträge verwenden, die
als ersten Buchstaben ein a haben (like „a*“) oder die, die in
einer anderen Spalte „Service“ eingetragen haben…
im idealfall auch noch vom user bestimmbar ob es eine UND oder
eine ODER verknüpfung sein soll…
ich glaub das ist alles sehr schwierig, oder?

Hier wird’s lustig. Entweder lässt Du den Anwender mit dem Access-eigenen Filter rumspielen, was ad 1 nur für erfahrene Access-Anwender taugt und Dir ad 2 ziemlich die Kontrolle entzieht.

Also baust Du Dir am besten ein Formular mit Eingabemöglichkeit der Filterkriterien (im Luxus auch die Auswahl des Vergleichoperators: entspricht, beginnt mit, endet mit, enthält, ist leer, ist nicht leer, …) und verarbeitest dann alle Eingaben zu einer WHERE- bzw. Filter-Bedingung, die Du dann einem Formular bzw. obiger Gesamtabfrage zuordnest.

Vielen Dank schon mal…
Munich

Gruß, Manfred

Hi Manfred und Danke schon mal… kriegst gleich schon mal ein Sternchen dafür :smiley:

Lecker. Für mich noch ein bisschen Sahne dazu:wink:

*g*

Was meinst Du mit „identische“ Abfragen? Willst Du auf alle
Tabellen zugleich zugreifen, oder auf jede einzeln? Tabellen
(und auch Abfragen) „zusammenfahren“ funktioniert mit UNION,
z. B. SELECT Spalte1 Kosten Spalte3 Spalte4 Spalte5
Seriennummer FROM Tabelle2004 UNION SELECT Spalte1 Kosten
Spalte3 Spalte4 Spalte5 Seriennummer FROM Tabelle2005. Dann
hast Du eine Abfrage, die wie eine Deiner Tabellen aussieht.

  1. Die Tabellen sind gleich - heissen aber anders, sind eben jährlich angelegte Auswertungen über Ersatzteilverbräuche. Diese Tabellen müssen mit den gleichen Abfragen abgearbeitet werden.
  2. dieses UNION SELECT klingt sehr gut… wenn ich 2 Tabellen habe kann ich doe so zusammenfügen, oder?
    Wo mache ich das? In der SQL Entwurfsansicht?
    Kann ich dann auch noch eine zusätzliche Spalte einfügen, in der ich dann jeweils nochmal die Herkunft der Daten eintrage also eine Spalte in der entweder 2003 oder 2004 steht?

Bin mir gerade nicht sicher, was Du willst. Entweder spielst
Du mit obiger Abfrage. Oder wenn Du mehrere Abfragen hast,
schreibst Du die in ein Dropdownfeld (als Wertliste oder die
Abfragenamen vorher in eine Tabelle), und nach dem Auswählen
eines Eintrags setzt Du die RecordSource im Formular um.

wenn ich dieses Union Dings verwenden kann dürfte es nicht mehr relevant sein denke ich. Die Idee war in einer Tabelle den Tabellennamen der Quelle für die Abfrage zu hinterlegen und wie man dann sagen soll dass dieser Tabellenname für die Abfragen gebraucht wird… (klingt komplex glaub ich ^^)

TOP2 ist dann, dass eben diese Abfragen wohl leider
nacheinander ablaufen müssen - macht das etwas aus von der
abarbeitungszeit?

Wie „ablaufen“? Redest Du von Aktionsabfragen oder Auswahl?

naja - Abfrage 3 arbeitet auf der Basis der Daten von Abfrage 2, die ihre Daten aus Abfrage 1 holt, die die Daten aus der Tabelle holt…

Da wirst Du ein Hilfskonstrukt benötigen, auch der Übersicht
halber: Baue Dir die UNION-Abfrage, die alle Tabellen
zusammenfährt. Dann kannst Du ganz normal eine Abfrage mit
Gruppierung, Aggregation und Bedingung bauen: SELECT x,
SUM(y), COUNT(Seriennummer) FROM UnionAbfrage WHERE Feld1 like
‚*blubb*‘ mit GROUP BY, SORT etc. nach belieben.

das klingt so als arbeitest Du fast nur mit den SQLs… ich bin da aber noch relativ unerfahren :frowning:
ich denke da steckt ne Menge power drin… wenn ichs verstehen würde was welcher Befehl macht ^^

Hier wird’s lustig. Entweder lässt Du den Anwender mit dem
Access-eigenen Filter rumspielen, was ad 1 nur für erfahrene
Access-Anwender taugt und Dir ad 2 ziemlich die Kontrolle
entzieht.

fällt aus :wink:
er hats vorhin versucht und sich dann gewundert warum er keine Ergebnisse mehr hatte *g*

Also baust Du Dir am besten ein Formular mit
Eingabemöglichkeit der Filterkriterien (im Luxus auch die
Auswahl des Vergleichoperators: entspricht, beginnt mit, endet
mit, enthält, ist leer, ist nicht leer, …) und verarbeitest
dann alle Eingaben zu einer WHERE- bzw. Filter-Bedingung, die
Du dann einem Formular bzw. obiger Gesamtabfrage zuordnest.

die Frage ist nur wie man sowas macht *g*

Danke jedenfalls schon mal… dieses Union Ding ist glaub ich genau das was ich für eins der Modelle brauche :smile:

Grüsse
Munich

Hi, Munich!

Lecker. Für mich noch ein bisschen Sahne dazu:wink:

*g*

Wildschwein à la creme…

Was meinst Du mit „identische“ Abfragen? Willst Du auf alle
Tabellen zugleich zugreifen, oder auf jede einzeln? Tabellen
(und auch Abfragen) „zusammenfahren“ funktioniert mit UNION,
z. B. SELECT Spalte1 Kosten Spalte3 Spalte4 Spalte5
Seriennummer FROM Tabelle2004 UNION SELECT Spalte1 Kosten
Spalte3 Spalte4 Spalte5 Seriennummer FROM Tabelle2005. Dann
hast Du eine Abfrage, die wie eine Deiner Tabellen aussieht.

  1. Die Tabellen sind gleich - heissen aber anders, sind eben
    jährlich angelegte Auswertungen über Ersatzteilverbräuche.
    Diese Tabellen müssen mit den gleichen Abfragen abgearbeitet
    werden.
  2. dieses UNION SELECT klingt sehr gut… wenn ich 2 Tabellen
    habe kann ich doe so zusammenfügen, oder?
    Wo mache ich das? In der SQL Entwurfsansicht?
    Kann ich dann auch noch eine zusätzliche Spalte einfügen, in
    der ich dann jeweils nochmal die Herkunft der Daten eintrage
    also eine Spalte in der entweder 2003 oder 2004 steht?

Das geht auch. UNION kann allerings nicht der Entwurf, sondern wirklich nur SQL. Du kannst aber die „Einzelabfragen“ über die Entwurfsansicht zusammenbasteln, kopieren und dann per UNION verbinden. Zu der zusätzlichen Spalte: Klar geht das:

SELECT 2003 AS Jahr, Feld1, Feld2, Feld3 
FROM Tabelle2003 WHERE Feld1 LIKE '\*moin\*' 
UNION 
SELECT 2004 AS Jahr, Feld1, Feld2, Feld3 
FROM Tabelle2004 WHERE Feld1 LIKE '\*moin\*'

ergibt z. B.

Jahr Feld1 Feld2 Feld3
2003 moin,tach 1 blubb
2003 tach,moin 1 hugo
2004 moinmoin 2 hundert

wenn ich dieses Union Dings verwenden kann dürfte es nicht
mehr relevant sein denke ich. Die Idee war in einer Tabelle
den Tabellennamen der Quelle für die Abfrage zu hinterlegen
und wie man dann sagen soll dass dieser Tabellenname für die
Abfragen gebraucht wird… (klingt komplex glaub ich ^^)

Ginge auch; dabei dann die Abfrage zur Laufzeit zusammenbauen mit CreateQueryDef oder dem Zuweisen der SQL-Eigenschaft zu einer bestehenden Abfrage.

naja - Abfrage 3 arbeitet auf der Basis der Daten von Abfrage
2, die ihre Daten aus Abfrage 1 holt, die die Daten aus der
Tabelle holt…

Das dauert schon, vor allem, wenn Du dann noch Textkriterien vergleichen lässt. Musst Du halt mal ausprobieren. Es gibt dann noch diverse Möglichkeiten, die Abfragen zu optimieren. Dazu muss man dann aber schon ein wenig weiter in die Materie einsteigen. Als grober Trend: Selektion (einschränkende Auswahl) so früh wie möglich in der Abfrage, Zusammenführen (JOINs und UNION) so spät wie möglich.

das klingt so als arbeitest Du fast nur mit den SQLs… ich
bin da aber noch relativ unerfahren :frowning:

Jein. Einfache Abfragen klicke ich mir mit dem Entwurfsassistenten zusammen, ändere fest eingetragene Kriterien ggf. durch Variablen per Code und tue dann so, als wäre der resultierende SQL-String auf meinem eigenen Mist gewachsen.

ich denke da steckt ne Menge power drin… wenn ichs verstehen
würde was welcher Befehl macht ^^

Das tut es zweifelsohne. Suche mal in der Online-Hilfe nach allem, was mit SQL zu tun hat. Oder suche so was wie eine SQL-Referenz. Die meisten Konstrukte gibt es auch unter Access, ggf. in leichter Dialekt-Abart.

Also baust Du Dir am besten ein Formular mit
Eingabemöglichkeit der Filterkriterien (im Luxus auch die
Auswahl des Vergleichoperators: entspricht, beginnt mit, endet
mit, enthält, ist leer, ist nicht leer, …) und verarbeitest
dann alle Eingaben zu einer WHERE- bzw. Filter-Bedingung, die
Du dann einem Formular bzw. obiger Gesamtabfrage zuordnest.

die Frage ist nur wie man sowas macht *g*

Wie oben. Formular mit Eingabe der Werte, dann bei Klick auf Schaltfläche den eigens gestrickten SQL-Befehl „nachbauen“ und mit den Eingaben setzen. Diesen SQL-Befehl kannst Du dann ja als Datenquelle für ein Formular oder Bericht angeben. Also z. B.

strSql = "SELECT 2003 AS Jahr, Feld1, Feld2, Feld3" \_
 & " FROM Tabelle2003 WHERE Feld1 LIKE '\*" \_
 & Me.txtFilter1 &"\*' UNION " \_
 &" SELECT 2004 AS Jahr, Feld1, Feld2, Feld3 " \_
 &" FROM Tabelle2004 WHERE Feld1 LIKE '\*" \_
 & Me.txtFilter1 &"\*'"
DoCmd.OpenForm DeinFormular,....,strSql

und dann z. B. im Formular

Me.RecourdSource = Me.OpenArgs

Gruß, Manfred

1 Like

Hi again, Manfred :smile:

Wildschwein à la creme…

ich hoffe es war lecker :wink:

Das geht auch. UNION kann allerings nicht der Entwurf, sondern
wirklich nur SQL. Du kannst aber die „Einzelabfragen“ über die
Entwurfsansicht zusammenbasteln, kopieren und dann per UNION
verbinden. Zu der zusätzlichen Spalte: Klar geht das:

SELECT 2003 AS Jahr, Feld1, Feld2, Feld3
FROM Tabelle2003 WHERE Feld1 LIKE ‚*moin*‘
UNION
SELECT 2004 AS Jahr, Feld1, Feld2, Feld3
FROM Tabelle2004 WHERE Feld1 LIKE ‚*moin*‘

ergibt z.
B.

Jahr Feld1 Feld2 Feld3
2003 moin,tach 1 blubb
2003 tach,moin 1 hugo
2004 moinmoin 2 hundert

ich hab das gerade mal probiert… das Problem dabei ist, dass das Ergebnis dabei auch gleich Gruppiert wird… so verschwinden mir manche Einträge und das ist ein wenig ungünstig…

wenn ich dieses Union Dings verwenden kann dürfte es nicht
mehr relevant sein denke ich. Die Idee war in einer Tabelle
den Tabellennamen der Quelle für die Abfrage zu hinterlegen
und wie man dann sagen soll dass dieser Tabellenname für die
Abfragen gebraucht wird… (klingt komplex glaub ich ^^)

Ginge auch; dabei dann die Abfrage zur Laufzeit zusammenbauen
mit CreateQueryDef oder dem Zuweisen der SQL-Eigenschaft zu
einer bestehenden Abfrage.

von beidem höre ich gerade das erstemal ^^

Das dauert schon, vor allem, wenn Du dann noch Textkriterien
vergleichen lässt. Musst Du halt mal ausprobieren. Es gibt
dann noch diverse Möglichkeiten, die Abfragen zu optimieren.
Dazu muss man dann aber schon ein wenig weiter in die Materie
einsteigen. Als grober Trend: Selektion (einschränkende
Auswahl) so früh wie möglich in der Abfrage, Zusammenführen
(JOINs und UNION) so spät wie möglich.

ok, also erst die bedingungskriterien und danach erst die verarbeitung… muss ich mal durchgehen ob dabei was kaputt gehen kann vom Ergebnis her…

das klingt so als arbeitest Du fast nur mit den SQLs… ich
bin da aber noch relativ unerfahren :frowning:

Jein. Einfache Abfragen klicke ich mir mit dem
Entwurfsassistenten zusammen, ändere fest eingetragene
Kriterien ggf. durch Variablen per Code und tue dann so, als
wäre der resultierende SQL-String auf meinem eigenen Mist
gewachsen.

kannst Du mir ein Beispiel geben für den Einsatz von Variablen?
In welchem Editor mache ich das dann? Ist das VBA oder doch der SQL-Editor?

ich denke da steckt ne Menge power drin… wenn ichs verstehen
würde was welcher Befehl macht ^^

Das tut es zweifelsohne. Suche mal in der Online-Hilfe nach
allem, was mit SQL zu tun hat. Oder suche so was wie eine
SQL-Referenz. Die meisten Konstrukte gibt es auch unter
Access, ggf. in leichter Dialekt-Abart.

also bisher hab ich nur mit mysql gearbeitet und ich tu mir auch damit öfter mal schwer… aber ich fürchte dass daran kein Weg vorbeiführen wird…

Wie oben. Formular mit Eingabe der Werte, dann bei Klick auf
Schaltfläche den eigens gestrickten SQL-Befehl „nachbauen“ und
mit den Eingaben setzen. Diesen SQL-Befehl kannst Du dann ja
als Datenquelle für ein Formular oder Bericht angeben. Also z.
B.

strSql = „SELECT 2003 AS Jahr, Feld1, Feld2, Feld3“ _
& " FROM Tabelle2003 WHERE Feld1 LIKE ‚*" _
& Me.txtFilter1 &"*‘ UNION " _
&" SELECT 2004 AS Jahr, Feld1, Feld2, Feld3 " _
&" FROM Tabelle2004 WHERE Feld1 LIKE ‚*" _
& Me.txtFilter1 &"*‘"
DoCmd.OpenForm DeinFormular,…,strSql

und dann z. B. im
Formular

Me.RecourdSource = Me.OpenArgs

also Me sagt mir garnichts.
Reco(u?)rdSource und OpenArgs auch nicht… DoCmd klingt einigermassen logisch… aber verstehen tu ich das ganze nicht so recht ^^
muss das strSql davorstehen? klingt eigentlich wie eine Variablenbelegung…?

Grüsse
Munich

Ola, senor!

Wildschwein à la creme…

ich hoffe es war lecker :wink:

Ja. Wie Erdbeeren mit Sahne, nur, dass man statt Erdbeeren Wildsch…

ich hab das gerade mal probiert… das Problem dabei ist, dass
das Ergebnis dabei auch gleich Gruppiert wird… so
verschwinden mir manche Einträge und das ist ein wenig
ungünstig…

Eigentlich kann das nicht sein, wenn Du alle Felder übernimmst und nirgendwo ein DISTINCT drin stehen hast. Falls Access Dupes entfernt, mache das SELECT über alle Felder Deiner Ursprungstabellen.

Ginge auch; dabei dann die Abfrage zur Laufzeit zusammenbauen
mit CreateQueryDef oder dem Zuweisen der SQL-Eigenschaft zu
einer bestehenden Abfrage.

von beidem höre ich gerade das erstemal ^^

Hups. Das ganze geht in VBA. So ganz grob unter dem Database- und QueryDef-Objekt nachzuschlagen.

ok, also erst die bedingungskriterien und danach erst die
verarbeitung… muss ich mal durchgehen ob dabei was kaputt
gehen kann vom Ergebnis her…

Bei SELECTs kann eigentlich nichts kaputt gehen, da nichts geändert wird. Ggf. solltest Du dann das Ändern der Datensätze unterlassen.

das klingt so als arbeitest Du fast nur mit den SQLs… ich
bin da aber noch relativ unerfahren :frowning:

Jein. Einfache Abfragen klicke ich mir mit dem
Entwurfsassistenten zusammen, ändere fest eingetragene
Kriterien ggf. durch Variablen per Code und tue dann so, als
wäre der resultierende SQL-String auf meinem eigenen Mist
gewachsen.

kannst Du mir ein Beispiel geben für den Einsatz von
Variablen?
In welchem Editor mache ich das dann? Ist das VBA oder doch
der SQL-Editor?

Oh, scusi. Das geht dann unter VBA. Du kannst auch Variablen in die Abfragen einbauen, dann musst Du allerdings beim Öffnen der Abfrage die Werte selbst eintragen.

also bisher hab ich nur mit mysql gearbeitet und ich tu mir
auch damit öfter mal schwer… aber ich fürchte dass daran
kein Weg vorbeiführen wird…

Schaden tut das nicht, zumal die Abfrageeditoren sich bei einigen schönen, hilfreichen Geschichten (wie z. B. der UNION-Abfrage) schwertun bis gar nicht anbieten.

also Me sagt mir garnichts.
Reco(u?)rdSource und OpenArgs auch nicht… DoCmd klingt
einigermassen logisch… aber verstehen tu ich das ganze nicht
so recht ^^
muss das strSql davorstehen? klingt eigentlich wie eine
Variablenbelegung…?

Hups. Das ist dann VBA. Das „Me“ ist der Verweis auf das eigene Formular, wenn VBA im Modul des Formulars steht. RecordSource ist die Eigenschaft eines Formulars, die die Datenquelle (also eine Tabelle oder eine Abfrage) definiert. OpenArgs ist ein Öffnungsargument, welches einem zu öffnenden Formular mitgegeben werden kann. Und mein „txtFilter“ da oben wäre der Name eines Textfeldes in dem Formular. Das ganze geht dann aber langsam relativ weit; also ggf. mal ein bisschen in VBA, Formulare und so’n Zeug einarbeiten (z. B. mit der Nordwind-Datenbank, die bei Access dabei ist)…:wink:

Gruß, Manfred

1 Like

ich hab das gerade mal probiert… das Problem dabei ist, dass
das Ergebnis dabei auch gleich Gruppiert wird… so
verschwinden mir manche Einträge und das ist ein wenig
ungünstig…

Eigentlich kann das nicht sein, wenn Du alle Felder übernimmst
und nirgendwo ein DISTINCT drin stehen hast. Falls Access
Dupes entfernt, mache das SELECT über alle Felder Deiner
Ursprungstabellen.

naja - das Problem ist dass ich nicht alle nehmen kann weil 2004 ein paar Spalten dazugekommen sind… :-/
Aber ein Beispiel…
2003 hat 754.983 Datensätze
2004 hat 765.337 Datensätze
mein sql sah so aus:

SELECT 
Company as countrycode, [machine type part 1] as type1, [machine type part 2] as type2, [Cost in Euro] as Costs, [cost code] as cc, [Cost to] as ES, [task code] as tk, [module serial number] as serial, [IW-OW] as IWOW
FROM [2003 History\_TO\_Cost]

UNION SELECT
Company as countrycode, [machine type part 1] as type1, [machine type part 2] as type2, [Cost in Euro] as Costs, [cost code] as cc, [Cost to] as ES, [task code] as tk, [module serial number] as serial, [IW-OW] as IWOW
FROM [2004 History\_TO\_Cost]

Das Ergebnis waren 885.447 Datensätze also knapp 650.000 weniger als ich erwartet hatte - völlig ohne dass ich Filter gesetzt hatte…
dummerweise haben die Tabellen keine id’s… sonst wäre es ja leicht wieder alle zu bekommen…
Im Moment versuche ich noch ein paar Felder dranzuhängen und das Ergebnis zu ermitteln, aber das kann noch ein wenig dauern…
Wo müsste denn dieses DISTINCT zu finden sein?

Ginge auch; dabei dann die Abfrage zur Laufzeit zusammenbauen
mit CreateQueryDef oder dem Zuweisen der SQL-Eigenschaft zu
einer bestehenden Abfrage.

von beidem höre ich gerade das erstemal ^^

Hups. Das ganze geht in VBA. So ganz grob unter dem Database-
und QueryDef-Objekt nachzuschlagen.

ok, das ist mir im Moment noch etwas zu schwer glaub ich

ok, also erst die bedingungskriterien und danach erst die
verarbeitung… muss ich mal durchgehen ob dabei was kaputt
gehen kann vom Ergebnis her…

Bei SELECTs kann eigentlich nichts kaputt gehen, da nichts
geändert wird. Ggf. solltest Du dann das Ändern der Datensätze
unterlassen.

ne, es geht mir mehr um das Resultat der Abfrage - wenn ich zu früh gruppiere kanns sein dass ich die Anzahl Seriennummern auf einen bestimmten code nicht mehr ermitteln kann…

das klingt so als arbeitest Du fast nur mit den SQLs… ich
bin da aber noch relativ unerfahren :frowning:

Jein. Einfache Abfragen klicke ich mir mit dem
Entwurfsassistenten zusammen, ändere fest eingetragene
Kriterien ggf. durch Variablen per Code und tue dann so, als
wäre der resultierende SQL-String auf meinem eigenen Mist
gewachsen.

kannst Du mir ein Beispiel geben für den Einsatz von
Variablen?
In welchem Editor mache ich das dann? Ist das VBA oder doch
der SQL-Editor?

Oh, scusi. Das geht dann unter VBA. Du kannst auch Variablen
in die Abfragen einbauen, dann musst Du allerdings beim Öffnen
der Abfrage die Werte selbst eintragen.

hm… kannst Du mir kurz erklären, wie ich eine sql-abfrage in vba realisieren kann?

also bisher hab ich nur mit mysql gearbeitet und ich tu mir
auch damit öfter mal schwer… aber ich fürchte dass daran
kein Weg vorbeiführen wird…

Schaden tut das nicht, zumal die Abfrageeditoren sich bei
einigen schönen, hilfreichen Geschichten (wie z. B. der
UNION-Abfrage) schwertun bis gar nicht anbieten.

ist das nicht eher ein argument um nach alternativen Lösungsansätzen, die auch in anderen Bereichen angewendet werden können, zu suchen?

also Me sagt mir garnichts.
Reco(u?)rdSource und OpenArgs auch nicht… DoCmd klingt
einigermassen logisch… aber verstehen tu ich das ganze nicht
so recht ^^
muss das strSql davorstehen? klingt eigentlich wie eine
Variablenbelegung…?

Hups. Das ist dann VBA. Das „Me“ ist der Verweis auf das
eigene Formular, wenn VBA im Modul des Formulars steht.
RecordSource ist die Eigenschaft eines Formulars, die die
Datenquelle (also eine Tabelle oder eine Abfrage) definiert.
OpenArgs ist ein Öffnungsargument, welches einem zu öffnenden
Formular mitgegeben werden kann. Und mein „txtFilter“ da oben
wäre der Name eines Textfeldes in dem Formular. Das ganze geht
dann aber langsam relativ weit; also ggf. mal ein bisschen in
VBA, Formulare und so’n Zeug einarbeiten (z. B. mit der
Nordwind-Datenbank, die bei Access dabei ist)…:wink:

naja - mit filtern hab ich teilweise schon gearbeitet… aber so richtig verstanden hab ich die ansteuerung von Textfeldern noch nicht… aber das denk ich krieg ich noch hin…

Ein riesengrosses Dankeschön nomma
Munich