ich komme mit einem Problem auf Sie zu, welches mich seit geraumer Zeit beschäftigt.
Ich möchte in einer Access Tabelle (Adressen) drei Spalten gruppieren (Land/Stadt/Strasse) und in einer weiteren Spalte(SortNr) alle Einträge hochzählen. Dieses Hochzählen soll anhand folgender Sortierreihenfolge geschehen:
-Land
-Stadt
-Strasse
-Nachname
-Vorname
Nicht zu verwechseln mit einer Abfrage, in der die entsprechenden Spalten gruppiert und dann die Funktion „Anzahl“ aktiviert wird, da diese nur die gruppierten Spalten und den höchsten Wert der Gruppe anzeigt.
Es soll also sprichwörtlich jeder Datensatz um eins hochgezählt werden und der entsprechende Wert in das Feld der Spalte „SortNr“ eingetragen werden.
Vorschlag 1: eine Tabellenerstellungsabfrage machen und als zusätzliches Feld SortNr. als ID vergeben als Autowert.
Ansonsten geht es ins Eingemachte: VBA-Programmierung
(z.B. wenn Sie pro PLZ neu zählen wollen)
Hier das von mir verwendete Skript:
Public Function CountUp(MKZ As Variant) As Integer
Static iCount As Integer
Static LastMKZ As Variant
If LastMKZ MKZ Then
iCount = 0
LastMKZ = MKZ
End If
iCount = iCount + 1
CountUp = iCount
mir ist nicht klar was genau Du möchtest.
Um Dir helfen zu können, poste doch bitte ein Beispiel mit 10-20 unsotierten Datensätzen und den gruppierten Ziel Datensätzen mit einer manuell befüllten Spalte SortNr.
Dann kann ich Dir bestimmt eine Lösung anbieten.
ich fürchte, das bekommt man nicht mit einem einfachen SQL-Statement hin.
Man müsste es vielleicht durch das Auslesen eines RecordSets, wobei ein Zähler mitläuft, realisieren.
Innerhalb dieser Schleife müsste dann ein UPDATE mit dem aktuellen Zählerwert erfolgen.
Bin leider nicht vertraut mit Access, weiß also nicht detailliert, wie es zu machen wäre.
Andererseits kann ich mir nicht vorstellen, wozu diese Nummerierung gut sein soll: zum einen muss man bei jedem neuen Record neu durchnummerieren und zum anderen braucht man ja nur in einem sortierten RecordSet eine Zähler mit laufen lassen.
mir eröffnet sich einfach der Sinn und Zweck dieser Aktion nicht.
Deshalb rein formal folgender Gedanke:
Zähler 0 setzen
Tabelle sortiert nach den Sortierkriterien einlesen
Zähler um 1 erhöhen
Datensatz editieren(SortNr=Zähler)
Datensatz speichern
Damit sind dann alle Datensätze durchnummeriert. Das Problem dabei ist, dass jedesmal beim Hinzufügen oder Löschen von Datensätzen diese Aktion wiederholt werden muss.
Hallo,
ich würde dafür die „DCount“-Funktion verwenden, um die Anzahl der Datensätze zu ermitteln, die in einer bestimmten Gruppe von Datensätzen (einer Domäne) enthalten sind. Sie können die DCount-Funktion in einem VBA-Modul, einem Makro, einem Abfrageausdruck oder einem berechneten Steuerelement verwenden.
Erstellen Sie eine Abfrage mit den 5 Feldern + SortNr, die 5 Felder aufsteigend sortieren. (Ich habe sie mal qrySortNr genannt). Kopieren Sie den folgenden Code in ein Modul:
Public Sub Numerieren()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim lgZähler As Long
lgZähler = 0
Set db = CurrentDb
Set rs = db.OpenRecordset(„qrySortNr“)
rs.MoveFirst
Do While Not rs.EOF
lgZähler = lgZähler + 1
rs.Edit
rs!sortnr = lgZähler
rs.Update
rs.MoveNext
Loop
Set rs = Nothing
Set db = Nothing
End Sub
ich habe es mal in DAO programmiert. Lassen Sie es mich wissen, falls sie es auf ADO benötigen.
herzlichen Dank für die Antwort. Habe das mal durchgespielt. Funktioniert soweit ganz gut. Allerdings fehlt der wichtigste Aspekt: Die Gruppierung. Es sollte ja innerhalb der Gruppierungs „Land/Stadt/Straße“ hochgezählt werden.
Kann man das nich einbauen?
Es ist mir leider nicht möglich eine Beispiel-Datenbank zu hinterlegen, oder geht das iregndwie…?
herzlichen Dank für die Antwort. Diese Funktion hatte ich auch schon im Visier. Allerdings liefert sie nicht das Ergebnis, welches ich gerne hätte, da sie nicht in die Spalte „SortNr“ jeden hochgezählten Wert einträgt.
herzlichen Dank für die Antwort. So ähnlich hatte ich mir das von der Logik her auch vorgestellt. Allerdings hapert es bei mir mit der Umsetzung. Mir ist noch nicht einmal klar, ob das mit einer SQL-Abfrage geht oder mit einem Modul. Zudem dürfen wir ja auch nicht die Gruppierung vergessen…
herzlichen Dank für die Antwort. Vorschlag 1 wäre zwar prinzipiell möglich, sieht aber unschön aus, da alles einfach durchnummeriert wird. Vorschlag 2 berücksichtigt anscheinend auch die Tatsache nicht, dass nur innerhalb der Gruppierung „Land/Stadt/Straße“ hochgezählt werden soll…
Wir haben also 3 Gruppierungsstufen und 5 Sortierungsstufen („Land/Stadt/Straße/Nachname/Vorname“).
herzlichen Dank für die Anrwort. Eine Beispiel-Datenbank leigt hier bereit. Aber es entzieht sich meines Wissens, wie diese anständig hochladen wird oder dargestellt werden soll. Wie geht das…?
Dann würde ich eine neue Spalte in der Abfrage erstellen die da lautet:
Land&Stadt&Strasse: Das wäre dann eindeutig - diese Spalte dann z.B. als MKZ benennen - dann passt es auch mit dem VBA.
In der letzten Spalte „SortNr“ soll jetzt ein Wert hochgezählt werden, solange die Einträge für die Gruppierung gleich bleiben und unter Berücksichtigung der Sortierung.
Solange also in den ersten drei Spalten „Deutschland“, „Düsseldorf“ und „Hansa-Allee“ steht, soll hochgezählt werden, der Schmidt-Anton vor dem Schmidt-Egon.
Danach wieder bei „0“ anfangen, usw.
Zu schade, dass man keine Dateien hochladen kann. Ich habe nämlich eine Beispiel-Datei vorbereitet…
Public Sub Numerieren()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim lgZähler As Long
Dim strLand, strStadt, strStrasse As String
lgZähler = 0
Set db = CurrentDb
Set rs = db.OpenRecordset(„qrySortNr“)
rs.MoveFirst
strLand = rs!land
strStadt = rs!stadt
strStrasse = rs!strasse
Do While Not rs.EOF
If strLand = rs!land _
And strStadt = rs!stadt _
And strStrasse = rs!strasse _
Then GoTo zählen
’ Gruppenbruch festgestellt
lgZähler = 0
strLand = rs!land
strStadt = rs!stadt
strStrasse = rs!strasse
lgZähler = 0
’ kein Gruppenbruch
zählen:
lgZähler = lgZähler + 1
rs.Edit
rs!sortnr = lgZähler
rs.Update
rs.MoveNext
Loop
Set rs = Nothing
Set db = Nothing
End Sub
Falls nicht gebe ich Ihnen meine e-Mail Adresse für die Muster-DB