Duplikate-jüngsten Eintrag anzeigen

In einer Access-Tabelle (Bücherliste) stehen mehrere Einträge mit gleichem Autor, gleichem Titel aber unterschiedlichem Erscheinungdatum.
Ich möchte immer nur das Buch mit dem jüngsten Erscheinungsdatum angezeigt bekommen.
Wer weiss Rat???

Hallo Ansim

Gerne antworte ich Ihnen. Und zwar gibt SmartTools Access Weekly wöchentlich einen Newsletter heraus mit Tips zu Access. Darunter auch der für Sie hier explicit brauchbare. Sie müssen vermutlich einige Anpassungen vornehmen. Also hier der genaue Wortlaut:

+++ ACCESS-TIPP DER WOCHE +++

Aktuellen Preis automatisch ermitteln

Versionen: Access 2007, 2003, 2002/XP, 2000 und 97

In einer Artikel- oder Lagerverwaltung werden haeufig
mehrere Datensaetze mit unterschiedlichen Preisinformationen
zu einem Artikel verwendet, um beispielsweise den Verlauf
von Preiserhoehungen nachvollziehen oder den zu einem bestimmten Datum gueltigen Preis ermittelt zu koennen. Sie muessen also zum Beispiel fuer eine Einkaufsuebersicht aus mehreren Datensaetzen den Datensatz auswaehlen, der die aktuellsten Preisinformationen enthaelt oder in einer Rechnung vom 14.8.2007 den Preis verwenden, der vor einer Preiserhoehung zum 1.9.2007 gueltig ist.

So enthaelt eine Datenbank zum Beispiel die Tabelle
„Artikel“ mit den Basisdaten der einzelnen Artikel. Eine weitere Tabelle „Artikel/Preise“, die mit der Tabelle „Artikel“ ueber das Feld „Artikel-Nr“ verknuepft ist, beinhaltet einen oder mehrere Datensaetze mit Preisinformationen. Im Einzelnen sind das beispielsweise die Felder „ErfasstAm“ (Wann wurde die Preisaenderung erfasst?), „Einzelpreis“ (neuer Einkaufspreis des Artikels), „VK“ (neuer Verkaufspreis des Artikels) und „GiltAb“ (Ab wann gilt der neue EK/VK?). Aus dieser Tabelle liefert nun eine Abfrage nach dem Feld „ErfasstAm“ aufsteigend sortierte Datensaetze - der aktuellste Preis ist somit immer dem ersten Datensatz zu entnehmen.

Diese Abfrage liegt wiederum einem Unterformular zugrunde,
das im Hauptformular „Artikel“ eingebunden und in den Eigenschaften „Verknuepfen von“ und „Verknuepfen nach“ ueber die Felder „Artikel-Nr“ mit den Hauptdatensaetzen verknuepft ist. Im Unterformular werden also fuer jeden Artikel die zugehoerigen Preisinformationen mit dem aktuellsten Datensatz ganz oben angezeigt.

Um nun den jeweils aktuellsten Datensatz mit
Preisinformationen fuer jeden einzelnen Artikel zu
selektieren, werden die beiden Tabellen „Artikel“ und „Artikel/Preise“ in die Abfrage aufgenommen und ueber das Feld „Artikel-Nr“ mit der Verknuepfungseigenschaft „2: Alle Datensaetze aus ‚Artikel‘…“ (Left Join) verknuepft. Als Ergebnis erhalten Sie eine Datensatzgruppe, die alle Datensaetze aus „Artikel“ zuzueglich aller Datensaetze aus „Artikel/Preise“ beinhaltet. Sie benoetigen also noch einen Filter, der Datensaetze mit aelteren Preisinformationen
ignoriert:

Feld: ErfasstAm
Kriterium: DomMax("[ErfasstAm]"; „[Artikel/Preise]“; „[Artikel/Preise].[Artikel-Nr]=“ & [Artikel].[Artikel-Nr])

Durch die Verknuepfungseigenschaft geht die Abfrage alle Datensaetze aus „Artikel“ durch und prueft dazu die Datensaetze aus „Artikel/Preise“, bei denen das Feld „Artikel-Nr“ gleich ist. Der gezeigte Ausdruck ermittelt fuer den jeweiligen Artikel ueber „DomMax()“ den Datensatz in „Artikel/Preise“, der der Artikelnummer entspricht und der das aktuellste Datum aufweist. Damit das Kriterium erfuellt ist, muss dieses Datum mit dem Datum des in der Abfrage bearbeiteten Datensatzes aus „Artikel/Preise“ uebereinstimmen. Als Ergebnis erhalten Sie wie gewuenscht zu jedem Artikel einen Datensatz mit den aktuellsten Preisinformationen.

Ein weiteres Problem bei der Verwaltung mehrerer Datensaetze mit Preisinformationen ist die Ermittlung des Preises, der zu einem bestimmten Zeitpunkt gueltig war. Dazu setzen Sie am besten eine VBA-Funktion ein:

Function VKFuerArtikel(lngArtNum As Long, _
dtStichtag As Variant) As Currency
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strFindDate As String

strFindDate = „#“ & Month(dtStichtag) & „/“ & _
Day(dtStichtag) & „/“ & _
Year(dtStichtag) & _
„#“

strSQL = "select * from [Artikel/Preise] " & _
„where [Artikel-Nr]= " & _
CStr(lngArtNum) & " order by [GiltAb]“

Set rs = CurrentDb.OpenRecordset(strSQL, _
dbOpenDynaset)

If rs.RecordCount > 1 Then
rs.FindFirst "[GiltAb] > " & strFindDate
If rs.NoMatch Then
rs.MoveLast
ElseIf rs.AbsolutePosition > 0 Then
rs.MovePrevious
End If
End If

VKFuerArtikel = rs(„VK“)
rs.Close

End Function

Fuer die Suche und Vergleiche erwartet Access ein Datum
immer im amerikanischen Format „#MM/DD/YYYY#“, so dass zunaechst eine entsprechende Zeichenkette zusammengesetzt werden muss. Ueber ein Recordset selektieren wir dann alle Datensaetze mit Preisinformationen zum gewuenschten Artikel und lassen das Ergebnis nach dem Feld „GiltAb“ sortieren. Wenn es mehr als einen Datensatz gibt, suchen wir im Recordset nach dem ersten Datensatz, bei dem das Datum gemaess Feld „GiltAb“ groesser ist, als der Stichtag. Wurde kein Datensatz gefunden, liegt der Stichtag hinter der zuletzt erfassten Preisaenderung - wir positionieren dann auf den letzten Datensatz mit der letzten, nun gueltigen Preisaenderung. Wenn ein Datensatz gefunden wurde, der ein Aenderungsdatum groesser als den Stichtag aufweist, pruefen wir, ob es sich um den ersten Datensatz im Recordset handelt. Ist das nicht der Fall, gehen wir einen Datensatz zurueck und positionieren so auf den Datensatz mit der letzten vor dem Stichtag liegenden Aenderung. Abschliessend weisen wir der Funktion den Inhalt des Feldes „VK“ aus dem aktuellen Datensatz zu und liefern so den jeweils zum Stichtag gueltigen Preis als Ergebnis.

Die Funktion koennen Sie zur Ermittlung eines aktuellen
Preises wahlweise in VBA, aber auch in einem ungebundenen Textfeld in einem Formular oder Bericht mit einer Formel beispielsweise wie folgt einsetzen:

=VKFuerArtikel([Artikel-Nr];[RGDatum])
_________________________
Es klappt vorzüglich. Viel Spass beim Ausprobieren.
Freundlich grüsst Frau Heinz

trage diesen code in eine Abfrage ein. Passe den tabellenname und attribute an.

SELECT tblBücher.Autor, tblBücher.Titel, Max(tblBücher.Erscheinungsdatum) AS MaxvonErscheinungsdatum
FROM tblBücher
GROUP BY tblBücher.Autor, tblBücher.Titel;

Kurz beschrieben:

die Abfrage auf das Erscheinungsdatum muss mittels der Funktion „Max“ erfolgen. Dabei müssen die anderen Attribute Autor und Titel auch mit in die Abfrage rein.

Herzlichen Dank für die schnelle und kompetente Antwort! Das funktioniert wirklich super! Vielen Dank.

Vielen Dank!
Genau das habe ich gesucht!

Sehr gern geschehen. Ich denke, Sie haben SmartTools im Internet gefunden. http://www.add-in-world.com/katalog/
Da können Sie die Newsletter abonnieren.

Herzlichen Dank für die schnelle und kompetente Antwort! Das
funktioniert wirklich super! Vielen Dank.

Hi!

Das geht über eine SQL-Abfrage. Schreibst du ein VBA-Skript oder willst du nur die Tabelle sehen? Falls Letzteres der Fall sein sollte kannst du dem Formular entweder direkt die SQL-Anweisung übergeben oder (meine Empfehlung) eine Abfrage schreiben und diese übergeben.
„SELECT TOP 1 [Auswahl der Felder] FROM [TABELLE] WHERE [FILTERBEDINGUNG] ORDER BY Erscheinungsdatum“

Top 1 ist soweit ich weiß kein Std-SQL-Befehl. Teste mal ob der 1 zu 1 in Access funktioniert (MSSQL welches auch von MS ist benutzt diesen). Wenn nicht melde dich nochmal und ich such dir den passenden Befehl raus.

Viele Grüße,
Kai