PDA

Vollständige Version anzeigen : Sortieren einer Tabelle mit VBA ???


AndreaSt
03.01.2002, 13:16
Ich wünsche Euch allen ein schönes neues Jahr 2002 !!

Und das neue Jahr verspricht wieder spannend zu werden. Denn ich bin schon wieder auf so ein elendiges Problem gestoßen.

Wie kann ich mit einem VBA Befehl eine Tabelle physisch sortieren ? (Datum aufsteigend)

Online-Hilfe, dickes Access-Buch und das Suchen im Forum konnten mir leider nicht weiterhelfen. Hat bitte jemand einen Tipp für mich !?!?!

Ich will doch einfach nur diese Tabelle sortieren.....

Liebe Grüße

Andrea <img src="confused.gif" border="0">

Kurt aus Kienitz
03.01.2002, 13:32
Hallo Andrea,

Wozu mußt Du denn die Tabelle umsortieren ?

In Berichten, Formularen und Abfragen kannst Du doch jeweils eine Sortierung angeben.
Wenn Du jemanden den direkten Zugriff auf eine Tabelle gewährst, kann dieser Jemand die Sortierung ebenfalls umstellen.

Sascha Trowitzsch
03.01.2002, 14:51
Der einfachste Weg ist eine Tabellenerstellungsabfrage mit den sortierten Daten, also ein Duplikat erstellen und danach die alte Tabelle löschen und die neue umbenennen. Umständlich wird das ganze, wenn dann Beziehungen wiederhergestellt werden müssen.

So einfach physisch umsortieren kann man ansonsten nicht. Du könntest es auch mit einem Recordset auf die gleiche Tabelle machen, so in der Art:

- Ersten DS in Variable zwischenspeichern
- Den alphabetisch ersten DS (z.B. aus Abfrage) in den ersten DS kopierten
- Den DS aus der Variable in den quasi freigewordenen DS speichern
- usw.

Also ein Quicksort auf ein Recordset.

Bloß, wie Kurt schon anmerkt: WOZU?

Ciao, Sascha

AndreaSt
03.01.2002, 17:15
Hallo Ihr Beiden,

vielen Dank für die Antworten. Leider hilft es nicht bei meinem Problem.

Aber ich hoffe, Ihr versteht mich, wenn ich Euch mein WOZU erläutere:

Ich muß die Daten aufsteigend sortieren, da ich einen schnuckeligen kleinen VBS-Code geschrieben habe, der einen "Rückstand" errechnet. Dieser Rückstand errechnet sich mit dem Rückstand des Vortages und dem Rückstand des aktuellen Tages. Dies realisiere ich mit den Move Befehlen. D.h. die Tage müssen entsprechend untereinander stehen. In meiner Ursprungstabelle tun sie das aber trotz aufsteigender Eingabe komischerweise nicht.

Vielen Dank trotzdem :) :)

Andrea

Hondo
03.01.2002, 17:49
Hi,
verstehe dein Problem nicht. Wenn du mit VBA (ich denke das meinst du) arbeitest hast du bestimmt ein Recordset definiert. Du kannst doch mit Order By die logische Sortierung einstellen. Wenn du dann mit rs.moveNext arbeitest funktioniert das doch einwandfrei.
HTH Andreas

AndreaSt
03.01.2002, 18:09
Hallo Andreas,

ja Du hast Recht. Natürlich habe ich eine Recordset definiert, aber gerade mit dem OrderBy bin ich nicht weitergekommen.
Kann man das nicht nur einsetzen wenn man SQL benutzt? Ich will aber doch keine Abfrage generieren, sondern die Tabelle aufsteigende sortieren.

Oder bin ich da völlig auf dem falschen Dampfer. :rolleyes:

Wäre schön, wenn Du mir das mit Order By erläutern könntest.

Vielen Dank im voraus.

Andrea

Hondo
03.01.2002, 19:34
Hallo Andrea,
Order By ist zwar ein Teil einer SQL Anweisung, aber man benötigt dazu kein SQL-Server oder so.

Zitiert aus Acc97 OH:

Syntax

SELECT Feldliste
FROM Tabelle
WHERE Auswahlkriterien
[ORDER BY Feld1 [ASC | DESC ][, Feld2 [ASC | DESC ] ][, ... ]]]

Eine SELECT-Anweisung, die einen ORDER BY-Abschnitt enthält, besteht aus folgenden Teilen:

Feldliste: Die Namen von Feldern, die zusammen mit Alias-Bezeichnungen für Feldnamen, SQL-Aggregatfunktionen, Auswahlprädikaten (ALL, DISTINCT, DISTINCTROW oder TOP) oder anderen Optionen für die SELECT-Anweisung abgerufen werden sollen.
Tabelle: Der Name der Tabelle, aus der Datensätze abgerufen werden. Weitere Informationen finden Sie in der Beschreibung zur FROM.
Auswahlkriterien: Auswahlkriterien. Wenn die Anweisung einen WHERE-Abschnitt enthält, sortiert das Microsoft Jet-Datenbankmodul Werte, nachdem die WHERE-Bedingungen für die Datensätze überprüft wurden.
Feld1, Feld2: Die Namen der Felder, nach denen Datensätze sortiert werden sollen.
Bemerkungen

ORDER BY ist optional. Wenn Sie jedoch möchten, daß Ihre Daten in sortierter Reihenfolge angezeigt werden, müssen Sie ORDER BY verwenden.
Die Standardeinstellung für die Sortierreihenfolge ist aufsteigend (A bis Z, 0 bis 9). In den beiden folgenden Beispielen werden die Namen der Angestellten nach ihren Nachnamen sortiert:

SELECT Nachname, Vorname
FROM Personal
ORDER BY Nachname;

SELECT Nachname, Vorname
FROM Personal
ORDER BY Nachname ASC;

Sie können die Daten in absteigender Reihenfolge (Z bis A, 9 bis 0) sortieren, indem Sie am Ende jedes Feldes, nach dem in absteigender Reihenfolge sortiert werden soll, das reservierte Wort DESC angeben. Das folgende Beispiel wählt Gehälter aus und sortiert sie in absteigender Reihenfolge:

SELECT Nachname, Gehalt
FROM Personal
ORDER BY Gehalt DESC, Nachname;

Wenn Sie ein Feld mit Memo oder OLE-Objekt-Daten im ORDER BY-Abschnitt angeben, tritt ein Fehler auf. Das Microsoft Jet-Datenbankmodul kann Felder dieses Typs nicht sortieren.

ORDER BY ist normalerweise der letzte Eintrag in einer SQL-Anweisung.

Sie können im ORDER BY-Abschnitt noch weitere Felder angeben. Die Datensätze werden zuerst nach dem ersten im Anschluß an ORDER BY angegebenen Feld sortiert. Datensätze, die in diesem Feld denselben Wert haben, werden dann nach dem Wert im zweiten aufgeführten Feld sortiert usw.

Zitat Ende

HTH Andreas

[ 03. Januar 2002: Beitrag editiert von: RBBE-avogt ]</p>

AndreaSt
04.01.2002, 15:07
Hallo !

Was man angefangen hat, soll man auch beenden. Das mit dem Order By habe ich zwar immer noch nicht verstanden, aber ich habe eine andere Lösung gefunden:

Sub Bespiel()
Dim db As Database
Dim rs_unsort As Recordset
Dim rs_sort As Recordset
Set db = CurrentDb
Set rs_unsort = db.OpenRecordset("T_Tabelle", dbOpenDynaset)

'Sortiertes Dynaset öffnen
rs_unsort.Sort = "[datum]"
Set rs_sort = rs_unsort.OpenRecordset()


'jetzt kann man an dieser Stelle mit rs_sort tun was man tun muß und die Tabelle ist aufsteigend sortiert.

End Sub

Viel Spaß noch weiterhin und vielen Dank für's Mitdenken.

Andrea

Hondo
04.01.2002, 17:13
Hi Andrea,
warum änderst du nicht Set rs_unsort = db.OpenRecordset("T_Tabelle", dbOpenDynaset)
in Set rs_unsort = db.OpenRecordset("Select * From T_Tabelle Order By Datum", OpenDynaset) ab?
Hätte m.E. den gleichen Effekt.
Gruß Andreas

AndreaSt
07.01.2002, 09:09
Hallo Andreas,

habe leider erst heute wieder Zeit gehabt vorbeizuschauen. Aber als ich Dein Beispiel gesehen habe, ist mir ein Kronleuchter aufgegangen. Ja so geht es. Und noch so viel nett kürzer.
Ich präsentiere das Ergebnis eines langen Denkprozesses:

Sub Rueckst()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Select * From T_Tabelle Order By Datum", dbOpenDynaset)
Dim stand, n, i

n = DCount("[Infom_eingang]", "T_Tabelle")
stand = 0


rs.MoveFirst
For i = 1 To n
rs.Edit
stand = (rs![Infom_eingang] - rs![Infom_ausgang_insg]) + stand
rs!Infom_Rückstand = stand
rs.Update
rs.MoveNext
Next
rs.Close

End Sub

Liebe Grüße

Andrea

Hondo
07.01.2002, 09:15
Hallo Andrea,
schön daß ich dir Helfen konnte.
Aber ein Schönheitsfehler habe ich noch gesehen:
"Dim stand, n, i" sind aut. vom Typ Variant.
Besser wäre: Dim stand%, n%, i% als z.B. Integer
oder wenn der Zahlenbereich nicht ausreicht als Long: Dim stand As long, n As long, i As long

HTH Andreas