PDA

Vollständige Version anzeigen : Nach Namen sortieren


Denu
10.05.2004, 19:38
Sortierung in einem Bericht mit Access 2000

Ich habe ein Problem beim sortieren. Ich sollte in einem Access-Bericht Namenssortierungen machen. Wenn z. B. das Geschlecht mit einem grossen „Von“ beginnt, muss ich anders sortieren, als wenn „von“ klein beginnt.

Wenn „Von“ gross geschrieben ist, dann muss die Sortierung nach „V“ erfolgen.
z. B. "Von Matt" nach dem Buchstaben „V“ sortieren
"Von Euw" nach dem Buchstaben „V“ sortieren

Wenn von klein geschrieben, dann muss Sortierung nach dem Hauptwort erfolgen.

z. B. "von Ah" nach dem Buchstaben „A“ sortieren
"von Holzen" nach dem Buchstaben „H“ sortieren
"de Bettin" nach dem Buchstaben „B“ sortieren

Nun hoffe ich, dass mir jemand helfen kann.

Jetzt schon vielen herzlichen Dank.

Denu

Johnny Loser
10.05.2004, 20:23
SELECT NAME FROM Namen
ORDER BY IIf((Asc(Left(Trim([NAME]),1))>96) And (Asc(Left(Trim([NAME]),1))<123),
IIf(InStr([NAME]," ")>0,Mid([NAME],InStr([NAME]," ")+1) & ", " & Left([NAME],
InStr([NAME]," ")),[NAME]),[NAME]);

ohne Berücksichtigung von ä, ö, ü und 3 Wörtern, wie z.B. "op de Eck"

jmc
10.05.2004, 22:22
Hi Denu

was machst du mit solchen namen wie d'Artagnan oder D'Hondt:

D'Hondt Rafael
Zimmermann
Stahlstr. 5
9000 St. Gallen

d'Hondt Steven D.
Keltenweg 24
4148 Pfeffingen

beide aus tel.search.ch ...

oder eben dann auch van der Velde etc. - Wie sollen die dann sortiert sein ?

Johnny Loser
11.05.2004, 06:00
@Jean

bliebe natürlich noch die Möglichkeit, falls der erste Buchstabe des Namens nicht "Groß" ist, eine Funktion aufzurufen.

SELECT Namen.NAME FROM Namen
ORDER BY IIf((Asc(Left([NAME],1))>64 And Asc(Left([NAME],1))<91) Or
Asc(Left([NAME],1))=196 Or Asc(Left([NAME],1))=214 Or
Asc(Left([NAME],1))=220,[NAME],fncsortname([NAME]));

Public Function fncSortName(ByVal n As String) As String
Dim i As Integer
Dim s As Integer
For i = 1 To Len(n)
s = Asc(Mid(n, i, 1))
Select Case s
Case 65 To 90, 196, 214, 220
fncSortName = Mid(n, i) & ", " & Left(n, i - 1)
Exit Function
Case Else
End Select
Next i
fncSortName = UCase(Left(n, 1)) & Mid(n, 2)
End Function

jmc
11.05.2004, 07:11
Hi zusammen

vermutlich müsste man das GANZE in einer Funktion lösen, denn ich denke es gibt noch einige andere Spezialfälle.

Allerdings frage ich mich, was das überhaupt bringen soll. Will Denu denn das Telefonbuch nachbilden ? Dort ist es tatsächlich so gelöst, dass bei solchen Konstrukten die Gross- oder Kleinschreibung des "Vorwortes" darüber entscheidet, wo man den Namen findet.

Übrigens: wer hat's erfunden ? Die Schweizer ??

Ich frage mich allerdings, wie geschickt solche Sortiererei ist, man stelle sich nur vor ich suche den Namen 'Aufderhalden', der kann ja auf 3 Arten geschrieben sein und erschiene dann ja nachdem an 3 Orten

auf der Halden
Auf der Halden
Aufderhalden

(dasselbe Spiel ginge auch z.B. mit 'Von Lanthen' ...)

Für eine Suche müsste IMHO die Schreibweise überhaupt keine Rolle spielen, denn ich kann das ja nicht wissen, wenn ich es nicht irgendwo ablese ...

Nouba
11.05.2004, 07:12
Egal ob die Lösung paßt oder nicht, langsam wird die Sortierung bei einem größeren Datenbestand immer ausfallen, weil keine Indizes dabei verwendet werden können. Vielleicht käme eine Lösung mit zwei Feldern in der Tabelle in Betracht, wobei nach dem zweiten Feld (ich nenne es mal Namensstamm) zuerst und anschließend nach einem optionalen Präfix-Feld sortiert werden würde.

Bei der manuellen Dateneingabe bräuchte man natürlich eine Funktion, um den Feldinhalt zu trennen, falls die bisherige Darstellungsform auch als Eingabeform beibehalten werden soll - einfacher wäre es, den Benutzer vom Gegenteil zu überzeugen und ihn zwei Felder ausfüllen zu lassen. Zum Schreiben der Daten könnte man die Split-Funktion im BeforeUpdate Event des Formulars nutzen und das resultierende Array parsen, ähnlich wie das Johnny auch in seiner Routine zeigt. Das Zusammensetzen beider Feldinhalte zur Darstellung im Current Event dürfte keine großen Kopfschmerzen bereiten.

Denu
21.05.2004, 16:36
Hallo Leute

Besten Danke für Eure sehr schnellen Antworten! Mein Kollege und ich brauchen die Sortierung für einen Sportanlass. Da wird nach dritter Stelle nach Namen sortiert. Johnny Loser hat uns auf die Spur gebracht. Wir haben in der Tabelle ein Feld SortGanzerName eingefügt. GanzerName ist Namen und Vornamen zusammen. Die Ä, Ö, Ü HAätten wir glatt vergessen.
Folgende Lösung funktioniert bei uns einwandfrei:

RSTabK!GanzerName = Mat(7)
' Kontrolle der Vorsilbe (RSTabK!SortGanzerName)
For X = Len(Mat(7)) To 1 Step -1
Y = Asc(Left(Mat(7), 1))
Select Case Y
Case 65 To 90, 196, 214, 220
' Grossbuchstabe oder Ä, Ö, Ü gefunden
Exit For
Case Else
' kein Grossbuchstabe gefunden, erster Buchstabe abtrennen
Mat(7) = Right(Mat(7), X)
End Select
Next X
RSTabK!SortGanzerName = Mat(7)

für Eure Hilfe nochmals besten Dank.

Denu