Tabelle "richtig" sortieren, ORDER BY greift nicht

  • Access

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von dwt73.

    Tabelle "richtig" sortieren, ORDER BY greift nicht

    Moin,

    meine Arbeitstabellen sollen nach dem Befüllen nach einem bestimmten Feld sortiert (Referenzname) werden. Aber nicht nur als View, sondern "richtig".
    Also benutze ich eine Puffertabelle identischer Struktur, schiebe den Inhalt von A nach B, sortiere dabei und schiebe das dann wieder zurück.
    Soweit die Idee. Funzt aber nicht, es bleibt die ursprüngliche Sortierung (nämlich in der Reihenfolge, wie die Tabelle urspünglich Satz für Satz aus einem Recordset aufgebaut wurde) erhalten. Hier der Code, welcher problemlos durchläuft.

    Visual Basic-Quellcode

    1. ' Puffer leeren
    2. SQLstr = "DELETE FROM " & c_TabAT3
    3. CurrentDb.Execute (SQLstr)
    4. ' Puffer füllen
    5. SQLstr = "INSERT INTO " & c_TabAT3 & " SELECT * FROM " & v_Tabname & _
    6. " ORDER BY (Referenzname)"
    7. CurrentDb.Execute (SQLstr)
    8. ' AT leeren
    9. SQLstr = "DELETE FROM " & v_Tabname
    10. CurrentDb.Execute (SQLstr)
    11. ' AT neu füllen
    12. SQLstr = "INSERT INTO " & v_Tabname & " SELECT * FROM " & c_TabAT3 & _
    13. " ORDER BY (Referenzname)"
    14. CurrentDb.Execute (SQLstr)
    15. ' Puffer leeren
    16. SQLstr = "DELETE FROM " & c_TabAT3
    17. CurrentDb.Execute (SQLstr)


    Ganz merkwürdig auch: es macht keinen Unterschied, wie ich die Spalte referenziere

    Visual Basic-Quellcode

    1. " ORDER BY (Referenzname)"
    2. " ORDER BY 'Referenzname'"
    3. " ORDER BY Referenzname"

    Läuft alles durch, funzt aber inhaltlich nicht.

    Besten Dank schonmal für sachdienliche Hinweise...

    Timo
    Warum muss denn die Datentabelle umsortiert werden? Dies wiederspricht eigentlich jeder relationalen Datenbank (wir befinden uns hier nicht in Excel). Das schöne ist doch, dass ich durch Ansichten, Views oder Abfragen die Daten zur Laufzeit so aufbereitet bekomme, wie ich sie benötige und nicht iommer den ganzen Datenbestand bewegen muss. Lös dich mal von 100 Datensätzen sondern überlege mal, was Du bei großen Datenmengen machen müsstest, so über 20.000 Datensätze.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Da gebe ich Dir grundsätzlich Recht. Mit einer sortierten Tabelle kann ich mir aber die Analyse erleichtern und habe gleich die Extra-View - also Abfrage - gespart.

    Ändert aber nichts daran, daß man doch irgendwie eine sortierte Tabelle per SQl aufbauen können sollte (also ohne Einzelverarbeitung per Recordset).

    Mit eckigen Klammern [Referenzname] funktioniert übrigens auch nicht, hatte ich noch vergessen zu erwähnen...

    Gruß
    Timo

    dwt73 schrieb:

    Ändert aber nichts daran, daß man doch irgendwie eine sortierte Tabelle per SQl aufbauen können sollte

    Warum sollte man das machen können?
    Du weißt doch gar nicht, wie die Tabelle intern im DB-Server gespeichert wird. Das ist Sache der DB-Engine und grundsätzlich eine "Blackbox". Wenn du einen schnellen Zugriff haben willst, legst du halt einen Index an. Indizes sind ja für sowas da (kosten Speicher aber bringen Performance).
    Warum ich das will, habe ich ja schon beschrieben. Performance ist nicht das Problem, es sind maximal ein paar Hundert Sätze.
    Nenn es von mir aus ästhetische Gründe.

    Ich will meine Datenbanken aufgeräumt und übersichtlich haben, das hat auch was mit Effizienz zu tun.
    Beispiel: Ein Kollege von mir legt erstmal für jedes der acht Einzelunternehmen eine Eingangstabelle an, dann eine Arbeitstabelle und entsprechend viele Abfragen (natürlich mat views). Sein Code sieht genau so aus. Wenn man da einen Fehler findet oder was ändern will, muß man immer gleich an 8, 16 oder gar 24 verschiedenen Stellen anfassen, falls man die in dem Wust aus Hunderten Elementen überhaupt noch findet. Und nach dem Schließen und Komprimieren ist das Teil dann mal eben 120 MB groß, weil die ganzen temporären Tabellen nicht gelöscht werden.
    Und sowas mag ich in meinen Datenbanken nicht haben...

    Ich hoffe, Ihr versteht mich! 8-)

    dwt73 schrieb:

    Ich will meine Datenbanken aufgeräumt und übersichtlich haben

    Das erreichst du aber nicht dadurch, dass du Datensätze "sortiert speicherst". Alleine schon aus dem Grund, weil das grundsätzlich gar nicht möglich ist. Immer wenn du eine "Tabelle" siehst (Ergebnis eines SQL Befehls!), ist das nur das, was dir die Engine zeigt. Wie das ganze intern gespeichert ist, hat damit nichts zu tun.
    Was du vermutlich meinst ist die Normalisierung der Datenbank und eine Frage des Designs.

    Ein Kollege von mir legt erstmal für jedes der acht Einzelunternehmen eine Eingangstabelle an

    Ist zB hochgradig schwachsinnig und "schlechtes" Design.
    Was die Engine macht, ist mir tatsächlich egal, aber wenn ich die Tabelle mit einem Doppelklick öffne oder einen Recordset aus der Tabelle befülle, möchte ich "defaultmäßig" eine bestimmte Sortierung haben. Nicht mehr, und nicht weniger.

    Normalisierung ist meines Wissens was ganz anderes...

    Naja, und wegen der Qualität besagter Datenbank des (externen) Kollegen gab's ne ganze Menge Ärger, als ich (Interner) die übernehmen sollte und fast vom Glauben abgefallen bin, als ich gesehen habe, was da alles drin war. Nicht komplilierbarer Code, SQL-Statements mit über 5.000 Zeichen, Variablen, Prozeduren, Module, Tabellen usw. unsinnig benannt, Redundanzen ohne Ende, keine einzige Annahme wurde abgesichert, kein Logging, kein Fehlerhandling, völlig unwartbarer Code!
    Wenigstens konnte ich das Management davon überzeugen, daß es kosteneffizienter ist, wenn ich das Teil ganz neu aufbaue, anstatt die Trümmer zu reparieren. :thumbup:

    dwt73 schrieb:

    möchte ich "defaultmäßig" eine bestimmte Sortierung haben

    Und genau hier sitzt dein Denkfehler. Du hast den Glauben, dass das "Anklicken" (in einem beliebigen Designer) irgendetwas mit der "Realität" zu tun hat.
    Nimm Access. Du klickst die Sortierung an und beim Schließen der Ansicht fragt Access dich, ob es die Änderung (!) übernehmen soll. Heißt das jetzt, dass die Datensätze anders sortiert wurden? Nein! Access merkt sich lediglich, dass du diese Sortierung verwenden willst, wenn du die Tabelle öffnest. Manche Frontends für Datenbanken geben ähnliche Möglichgkeiten, andere nicht. Wenn du also eine bestimmte Sortierung sehen willst, such dir ein frontend, dass eine Speicherung der letzten Ansicht bietet. Alles andere bringt dich nämlich nicht wirklich weiter, sondern sorgt nur dafür, dass du dich mit Nebensächlichkeiten aufhältst und ggfs die wichtigen Sachen aus den Augen verlierst.
    BTW: Eine stark normalisierte Datenbank ist grundsätzlich sehr unübersichtlich (!) und in den meisten Fällen auch nicht sehr performant.

    Wie bereits oben ausgeführt: Lös dich davon, Datenbanken wie Excel-Tabellen zu betrachten.

    INOPIAE schrieb:

    Hast Du denn einen Primärindex auf der Tabelle, dann kannst Du umspeichern wie Du willst, da die Tabelle immer danach angezeigt wird.

    Es gibt eine Spalte ID mit einem AutoWert. Die Spalte ist PK. Hatte auch schon vermutet, daß das vielleicht hinderlich ist, aber noch nicht ohne ausprobiert.
    Danke für Dein Engagement.

    Gruß
    Timo