Tabellenfilter bei Access

Hallo Boardmitglieder,

aktuell sitze ich an einem Access-Problem. Und zwar folgendermaßen:
Ich habe eine große Datenbank mit ca 30 Spalten. Markant sind zwei Spalten: einmal Nummer und Datum. Zu jeder Nummer gibt es mehrere Datum. Demzufolge taucht eine bestimmte Nummer mehrmals auf. Ich will jetzt aber eine Nummer mit dem aktuellsten Datum verbinden. Das habe ich auch geschafft. Dadurch hat sich die Anzahl der Datensätze von 200000 auf 70000 reduziert.

Ich möchte nun, dass in der Ursprungsdatenbank nur die Datensätze angezeigt werden, bei denen eine Nummer mit dem dazugehörigen, neusten Datum steht. Das habe ich leider noch nicht geschafft. Hat jemand eine Idee, wie das gehen könnte?

Viele Grüße Nesta

Hallo Nesta,

Ich würde hierfür eine Abfrage mit Gruppierungsfunktion erstellen und als Filterkriterium MAX (von Datum) einstellen.

Hallo Nesta,

Ich würde hierfür eine Abfrage mit Gruppierungsfunktion
erstellen und als Filterkriterium MAX (von Datum) einstellen.

Hallo, danke für deine schnelle Antwort. Also wenn ich die gesamte Tabelle auswähle und das beim Datum auf Max stelle, dann gibt er mir trotzdem alle 200000 Datensätze aus. Wenn ich aber nur Nummer und Datum (mit MAX) eingebe, kommen die gewünschten 70000. Die gesamte Tabelle lässt sich nicht auf die 70000 reduzieren…

Hast du noch nen weiteren Vorschlag?

Hallo Nesta,

leider konnte ich deinen letzten Absatz nicht ganz verstehen. Du scheinst es geschafft zu haben, die Daten entsprechend deinem Wunsch zu filtern… wohl über eine Abfrage. Willst du jetz mit einem Formular auf die gefilterten Daten zugreifen? Willst du nur diese gefilterten Daten anderen zur Verfügung stellen, ohne das die orginal Daten in der gleichen DB sind?
Leider kann ich nicht nachvollziehen, wo das Problem liegt.

Sorry.

Gruß
Özhan

Danke für die Antwort!. Also: ich habe mir aus der Ursprungstabelle die zwei Spalten rausgezogen, nach denen gefiltert werden soll: Nummer und Datum. Für diese beiden Spalten alleine funktioniert das auch. Leider lässt sich der Filter aber nicht auf die ganze Tabelle übertragen.

Man kann sich das so vorstellen: Es werden verschiedene Produkte (Nummern) zu unterschiedlichen Tagen im Jahr (Datum) gekauft. Demzufolge kommen manche Nummern mehrmals vor, aber zu unterschiedlichen Datum (weiß jetzt net genau, was da die Mehrzahl ist…). Jetzt habe ich aber neben Nummer und Datum noch weitere Infos (Spalten) ind meiner Tabelle stehen. Will ich jetzt wissen, wann ich welches Produkt als letztes gekauft habe, kann ich über MAXDatum mir das ausgeben lassen. Gut! Will ich mir jetzt aber darüberhinaus alle zusätzlichen Infos der gefilterten Werte ebenfalls ausgeben lassen, dann schreibt Access mir wieder alle Datensätze hin. Also auch die mit dem nicht aktuellen Datum.

Ist das so ein wenig verständlicher?

Viele Grüße Kerim

Ok… jetzt habe ich es verstanden.

  1. Du erstellst eine Abfrage, die als Ausgabe lediglich die ProduktNr. und das MaxDatum hat.
    Hast du schon erfolgreich gemacht.

  2. Danach erstellst du eine zweite Abfrage und fügst die Basis-Tabelle mit allen ProduktNr und Daten und die 1. Abfrage hinzu. Danach verknüpfst du die 1.Abfrage mit der Basis-Tabelle. Also Prod.Nr und MaxDatum der 1. Abfrage mit Prod.Nr und Datum der Basis-Tabelle. Dazu einfach im Abfrage-Designer jeweils eines der Felder der 1.Abfrage anklicken und zum entsprechenden Feld in der Basis-Tabelle ziehen. Es entsteht automatisch eine Linien-Verbindung zwischen den beiden.

Danach musst du auf die Verknüpfungslinien klicken und die Verknüpfung so einstellen, dass alle Daten aus der 1.Abfrage angezeigt werden, aber nur die aus der Basis, wo die Daten gleich sind. Dadurch ändert sich die Verknüpfung zu einem Pfeil von der 1.Abfrage zur Basis-Tabelle.

Danach ziehst du alle Felder der Basis-Tabelle die du anzeigen willst unten in die Felder-Auswahl.

Hoffe mal das ich es gut beschrieben habe. :o)

Gruß
Özhan

Servus, genau an der Stelle war ich gestern schon, was mich dann heute dazu bewogen hat, meine Hilfeschrei hier reinzustellen. Wenn ich das mache, wie oben beschrieben, dann kommt in einer MsgBox: Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige äußere Verknüpfungen enthält. Damit eine der Verknüpfungen zuerst ausgeführt wird, müssen sie eine separate Abfrage erstellen, die die erste Verknüpfung ausführt, und dann die se Abfrage in die SQL-Anweisung einschließen.

Also genauso, wie du es beschrieben hast, will ich das auch machen. Nur klappt es nicht. Hast du noch ne Idee?

Hallo Nesta,

bin nicht sicher ob ich die Anfrage richtig verstanden habe und auf welchem Wissensstand bezogen auf Access eine Lösung sein soll. Um das Ergebnis „Nur neuester Datensatz zu einer Nummer soll ermittelt werden“ auf einfachem Weg zu erhalten, schlage ich folgende Vorgehensweise vor:

  • Tabellenerstellungsabfrage erstellen, die aus der Ursprungstabelle nur die zwei Felder Nummer und Datum übernimmt.
  • In dieser Abfrage die Funktionen einschalten und für Nummer ‚Gruppieren‘ und für Datum ‚Max‘ wählen.

=> Accessintern ist Datum ja auch nur ein Zahlenwert und der ‚maximale‘ Wert des Datums zu einer Nummer ist halt das neueste Datum. Also:

  • Abfrage ausführen und du hast eine Tabelle mit den Feldern Nummer und Datum die deine Kriterien erfüllt.

  • Anschließend kann man dann über eine weitere Abfrage diese neue Tabelle mit der Ursprungstabelle verknüpfen.

=> Wichtig: Jeweils beide Felder aus den Tabellen miteinander verknüpfen, denn nur das jeweilige Paar aus Nummer und Datum ist ja eindeutig.

Das Ergebnis der zweiten Abfrage sollte das von dir Gewünschte darstellen.

Hoffe, das hat geholfen :wink:

Gruß
Kalle

Guten Morgen,

ich könnte mir vorstellen, dass man dies über einen Top-Wert im Datum lösen könnte - leider komme ich mit den einfachen Mittel von AC auch nicht dazu.
Es wird bestimmt nur eine Lösung mit VBA geben (kann ich aber nicht so gut).

mfg
Harald

Hmm…

ich denke nicht da es ein Problem ergeben sollte, da es bei mir ja auch klappt.

Also folgendes Beispiel:

Tabelle1
ID Datum Wert
1 03.12.2010 11:30:00 111
1 03.12.2010 12:00:00 222
2 05.12.2010 10:00:00 555
2 05.12.2010 12:00:00 666

Abfrage1
SQL: SELECT tab.ID, Max(tab.datum) AS Maxvondatum
FROM tab GROUP BY tab.ID;

Aufbau:
ID wird gruppiert und Datum auf Max gesetzt.

Abfrage2
SQL:SELECT Tabelle1.ID, Tabelle1.datum, Tabelle1.wert
FROM Abfrage1 LEFT JOIN Tabelle1 ON (Abfrage1.Maxvondatum = Tabelle1.datum) AND (Abfrage1.ID = Tabelle1.ID);

Aufbau:
ID, Datum, Wert aus der Tabelle1 reinziehen

Verknüpfung:
Abfrage1 Tabelle1
ID —> ID
MaxDatum —> Datum

Verknüpfungsoption:
2: Beinhaltet ALLE Datensätze aus ‚Abfrage1‘ und nur die Datensätze aus ‚Tabelle1‘, bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.

Hast du diese Verknüpfungsoption den auch eingestellt?

Gruß
Özhan

Vielen Dank für deine Unterstützung. Ich merke, wir kommen der Sache näher. Sind aber noch nicht angekommen. Soweit klappt die Abfrage.

Aber!!!

In meiner Abfrage1-Tabelle habe ich genau 98717 Werte. In der neuen Abfrage, habe ich 90356. Müssten das nicht gleich viele Werte sein?

Außerdem sehe ich auf anhieb, dass die 0 mehrmals vergeben wurde, was ja eigentlich nicht sein darf…oder?

Grüße Nesta

Hmm… es ist echt schwierig dir so aus der Ferne zu helfen. Da ich ja die Tabellen von dir nicht vor mir habe, kann ich dir nicht genau sagen woran es liegen könnte. Wenn du in der 1. Abfrage mehr Datenstäze hast als in der 2. Abfrage, dann stimmt da was nicht.

Kannst du mir die SQL Befehle mal zeigen?!
Ist die 0 für die ID vergeben?

Gruß
Özhan

Klar, is schwierig das aus der Ferne zu beurteilen, deshalb mein Code (Anmerkungen im Anschluss):

SELECT [Tabelle1].ID, [Tabelle1].GOGNR, [Tabelle1].GOVONDT
FROM Abfrage1 INNER JOIN [Tabelle1] ON (Abfrage1.MaxvonGOVONDT = [Tabelle1].GOVONDT) AND (Abfrage1.GOGNR = [Tabelle1].GOGNR);

Legende:
GOGNR - Kundennummer (kommt in Tabelle1 mehrmals vor. Das liegt daran, wenn die Datensätze geändert werden, werden die alten beibehalten und die neuen Datensätze bekommen das zu dem Zeitpunkt aktuelle Änderungsdatum)

GOVONDT - Änderungsdatum (hab ich ja oben quasi miterklärt)

ID - Nummeriert alle Datensätze, ob aktuell oder alt, durch.

OK, falls du noch weitere Daten brauchst, lass es mich wissen.

Grüße Nesta

Da haben wir das Problem lieber Nesta. Du hast meine Antwort nicht richtig umgesetzt :o(

Du hast ein InnerJoin, was heißst, dass du im Entwurfsmodus der Abfrage die Tabelle und Abfr.1 nur einfach verbunden hast. Dabei musst du aber auf die Verbindungslinie klicken und in den Eigenschaften der Verbindung die richte Einstellung treffen. Dann hast du am Ende ein Left Join.

Siehe Re^5

SELECT [Tabelle1].ID, [Tabelle1].GOGNR, [Tabelle1].GOVONDT
FROM Abfrage1 LEFT JOIN [Tabelle1] ON (Abfrage1.MaxvonGOVONDT = [Tabelle1].GOVONDT) AND (Abfrage1.GOGNR = [Tabelle1].GOGNR);

Hallo, stimmt. Hab ich nicht berücksichtigt. Aber es kommt das gleiche Ergebnis, wenn ich den LEFT Join einbaue… Wieder mehr Daten in Abfrage1 als in Abfrage2 (90356) und die 0 ist bei GOGNR dreimal vergeben. Danke für die Hilfe, aber die Abfrage sträubt sich aus irgendwelchen Gründen…

Grüße Nesta

Tut mir leid, das weiß ich auch nicht. Es gibt zwar die Funktion „MAX“, wo und wie man diese verwenden kann, hab ich jedoch nicht rausgekriegt.

mfG
Gaby

Hallo,

ich verstehe die Problematik nicht und
kann daher nicht weiter helfen.

Gruß
Horst Müller

Schade, dann kommen wir wohl so nicht weiter. Hätte dir gern geholfen, aber aus der Ferne ist es immer etwas schwierig.

Viel Glück noch und schöne Feiertage!

Gruß
Özhan

Hallo Nesta,

habe Deine Frage erst heute gelesen. Verstehe ich richtig: Du möchtest zu jeder Nummer jene anzeigen lassen, deren Datum das jüngste ist?
Um dies zu erzielern, gib in einer Abfrage zum Feld Datum als Kriterium ein:

DomMax(„Datum“;„Name_Deiner_Tabelle“;„Nr=“ & [Nr])

Dabei ist angenommen, daß Dein Nummern-Feld den Namen Nr trägt. Die Abfrage gibt für jede Nr das jüngste Datum an. Übrigens solltest Du das Datumsfeld nicht ‚Datum‘ nennen, da Datum ein von Access reserviertes Wort ist.

Liebe Grüße
g.s.

Hallo Nesta
leider war es mir in der letzten Zeit nicht möglich auf Fragen zu antworten. Wenn Dein Problem immer noch besteht, dann schreibe nochmal.
Mfg
Last_Knight