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?
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…
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.
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.
Du erstellst eine Abfrage, die als Ausgabe lediglich die ProduktNr. und das MaxDatum hat.
Hast du schon erfolgreich gemacht.
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.
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?
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.
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).
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?
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?
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.
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…
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:
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.
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