Staffelung in Access

  • Sonstige

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Mike.

    Staffelung in Access

    Hallo,
    ich habe in Access folgendes Problem: Ich will in einem Listenfeld Daten einer Tabelle anzeigen lassen. Das ist ja alles schön und gut, nur will ich auch eine Staffelung nach einem Spaltenfeld einfügen.
    So soll man in einem Kombinationsfeld wählen können, ob man nun alle Datensätze sehen will, oder nur diejenigen mit den zehn größten Werten, oder die Plätze 11-20, 21-30 usw. Weiterhin soll man noch nach einer bestimmten Kennziffer filtern können und eine zeitliche Begrenzung vornehmen können. Schließlich soll das in der Tabelle sichtbare auch in Excel exportierbar sein. Ich hatte zwar mal was mit ner Abfrage, allerdings mag Access es nicht, wenn man einem Recordset eine Abfrage zuweist, deren Bedingungen Felder von Formularen beinhalten - da kommt dann one or more required parameters missing...; was zur folge hat, dass ich nichts in Excel exportieren kann.
    Ich hab das Ganze jetzt zwar hingekriegt, aber nur über den Umweg, dass ich Hilfstabellen benutze - und die bei jeder Änderung der Filterkriterien zu leeren und danach wieder zu füllen dauert ewig lange!
    Wäre echt nett, wenn mir irgendwer helfen könnte.
    Hallo abaddon,

    es wird bestimmt auch ohne Hilfstabellen gehen. Was erwartest du denn nun von uns? Soll mal jemand schnell den Quelltext fertig schreiben???

    Evtl. präsentierst du ein wenig (bitte wörtlich nehmen) Quelltext, dann könnte man das Problem unter Umständen Schritt für Schritt lösen.

    All das, was du beschreibst, ist prinzipiell möglich. nur solltest du das eine oder andere viel exakter erläutern.
    Was meinst du mit "in Excel exportierbar" eine Automation oder das Abspeichern als CSV oder...oder?

    Gruß Markus
    okok, ich hab mein Problem wohl wirklich ein wenig "schwammig" beschrieben, ich versuchs nochmal.

    Mein eigentliches Problem ist es eine Staffelung zu erstellen. Ich habe z.B. eine Tabelle mit Kunden, in der drinsteht, was sie bis jetzt alles gekauft haben.
    In einem Listenfeld möchte ich jetzt anzeigen lassen, wieviel welche Kunden bisher insgesamt gekauft haben - bis jetzt kein Problem.

    Jetzt möchte ich aber in einem Kombinationsfeld auswählen können, ob ich alle Kunden anzeigen will oder nur die zehn. die am meisten gekauft haben, oder nur die Plätze 11-20 oder 21-30, ...

    Meine Frage ist jetzt, wie ich eine solche Staffelung möglichst einfach hinkriegen könnte.

    Quelltext kann ich dazu leider nicht präsentieren, da der sich im Geschäft befindet...
    Ich kann nur beschreiben, wie ich es bis jetzt gemacht habe:
    Ich habe eine separate Tabelle. Bei Änderung des Kombinationsfeldes wird eine Abfrage aufgerufen, die alle Kunden mit ihren summierten Ausgaben anzeigt und auch danach sortiert. Dann wird eine Schleife durchlaufen, die je nach vorheriger Wahl der Staffelung den 1. - 10. Datensatz, oder den 11. - 20. Datensatz, ... in die Hilfstabelle einfügt. Danach kann man diese dann als Grundlage für das Listenfeld nutzen.

    Das Problem an der ganzen Sache ist, dass bei jeder Änderung der Filterkrriterien nicht nur die Tabelle neu gefüllt, sondern auch noch vorher geleert werden muss - eine Sache, die ziemlich zeitaufwendig ist.

    Gibt es keine Möglichkeit meiner Abfrage zu sagen, dass sie - nachdem sie Summe gebildet und nach dieser sortiert hat - nur die ersten zehn Datensätze oder nur die Datensätze 11-20, ... anzeigt?

    So, ich hoffe ich habe mein Problem jetzt deutlich genug beschrieben ;)
    Hallo abaddon,

    Quelltext sagt oft mehr als 1000 Worte, man erkennt schnelle Zusammenhänge, erfährt Grundlagen, die der Poster als unwichtig ansah und verschwieg, man kann auf die Kenntnisse Rückschlüsse ziehen und seine Antworten entsprechend anpassen.

    Du kannst mit mehreren Recordsets arbeiten, mit der Filter-Methode könntest du den Inhalt eines Recordsets anpassen.

    Warum denn das:
    Das Problem an der ganzen Sache ist, dass bei jeder Änderung der Filterkrriterien nicht nur die Tabelle neu gefüllt, sondern auch noch vorher geleert werden muss - eine Sache, die ziemlich zeitaufwendig ist.
    Das ist mir ein Rätsel, kann mir nicht vorstellen, dass das nötig ist.

    Ich werde dir ungern jetzt schon Quelltext schreiben, da die Wahrscheinlichkeit zu groß ist, dass du mir antwortest: "ich habe das aber anders gemacht..."

    Leider hast du nicht alle Fragen beantwortet, Access-Version ist sehr wichtig und auch das OS.

    Gruß Markus
    irgendwie glaub ich, dass wir aneinander vorbei reden, deshalb versuch ichs nochmal:

    Quelltext hab ich keinen, weil ich ja keine Ahnung hab, wie ich das Problem lösen soll.

    Mein einziges Problem ist diese Staffelung und deshalb meine ganz konkrete Frage:

    Gibt es eine Möglichkeit, wie ich meinem Recordset sagen kann er soll als Quelle eine Abfrage haben, aber nur die ersten zehn Datensätze davon?

    z.B. staffelung.open "SELECT * FROM Rechnungen ????POSITION 1 TO 10?????" ,.....

    Gibt es sowas?

    Wenn ja, dann versprech ich dir, dass ich den fertigen Quelltext auch präsentieren werde ;)
    Hallo abaddon,

    das mag ja sein, dass wir aneinander vorbeireden, aber:
    Quelltext kann ich dazu leider nicht präsentieren, da der sich im Geschäft befindet...

    Quelltext hab ich keinen, weil ich ja keine Ahnung hab, wie ich das Problem lösen soll.

    Was stimmt denn nun????

    JA , man kann dein Problem lösen, zufrieden?

    Bitte beantworte doch einfach einmal meine Fragen!
    Dazu:
    z.B. staffelung.open "SELECT * FROM Rechnungen ????POSITION 1 TO 10?????" ,.....
    Lies dazu doch einfach in einer Schleife Position 1 - 10 des Recordsets aus.

    Gruß Markus
    Ich kenne mich mit dem Syntax von SQL-Abfragen
    leider nicht so gut aus, sonst würde ich dir genauere Informationen
    liefern aber meines Wissens nach kann man so etwas wie
    OPTION (FAST <Anzahl>) angeben.
    Damit werden nur soviele Datensätze wie bei <Anzahl>
    angegeben zurückgeliefert.
    In SQL gibt es doch die Limit-Funktion, da kann man festlegen, dass er z.B. nur die ersten 10 anzeigt, etwa so:
    <pre>Select * from Table ORDER BY ID LIMIT 10;</pre>
    wie ich meinem Recordset sagen kann er soll als Quelle eine Abfrage haben

    dann nehm doch nicht Select * sondern den genauen SQL-Befehl der Abfrage mit ner bestimmten Where-Klausel... ;)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    Hallo zusammen,

    wenn ich abaddon richtig verstanden habe möchte er nicht immer nur die ersten 10, sondern auch mal die Positionen 31-40 usw. auslesen, geht das mit der LIMIT auch? Ich habe das bisher noch nie bei einer SQL-Abfrage verwendet.

    Gruß Markus
    ...nicht immer nur die ersten 10, sondern auch mal die Positionen 31-40 usw. auslesen, geht das mit der LIMIT auch?

    Das geht auch, dann schreibt man zwei Zahlen hinter dem LIMIT (Anfang und Anzahl):
    <pre>Select * from Table ORDER BY ID LIMIT 31,10;</pre>
    Die 31 bedeutet, dass er beim 31. Datensatz anfängt, die 10 sagt, dass er nur 10 Datensätze übergibt (31. eingeschlossen), also 31 bis 40.
    Das ganze setzt aber vorraus, dass die Daten richtig mit "ORDER BY" sortiert werden. ID ist nur ein Beispiel. Da muss dann halt was anderes hin ;)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Ist der Befehl "LIMIT" denn Standard SQL? Ich kenne z.B. Interbase, da gibt es diesen Befehl nicht. Ich habe so ein Problem mit einer Stored Procedure gelöst. Ich brauchte das für ein Gästebuch mit mehreren Seiten.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    jetzt muss ich doch nochmal nerven

    LIMIT funktioniert nicht, weder bei einer SQL-Anweisung für ein recordset, noch in der Abfragen-Erstellung von Access...

    Muss ich dafür noch irgendeine Bibliothek einfügen, oder irgendwas andres beachten?
    Hi,

    @Marcus
    an Access kann es nicht liegen. Der SQL String wird im Ganzen an den SQL Server übertragen. Erst dort
    wird er ausgewertet. Es kann allerdings sein, das der SQL Server den abaddon installiert hat diese Funktion
    nicht unterstützt.

    @abaddon
    Mein Tip: aktualisiere auf die neueste Version !!!

    EDIT:
    Sorry Marcus, hab überlesen das er gar keinen SQL Server nutzt. Dann kann es natürlich an Access
    liegen. In dem Fall wertet Access den String ja selbst aus.
    (Wer lesen kann ist klar im Vorteil :rolleyes: )


    bye ...

    LaMa5.
    Die Wissenschaft wird nie ein besseres Kommunikationssystem in den Büros erfinden können als die Kaffeepause.
    (Autor: Earl Wilson, amerik. Schriftsteller)

    https://www.serviceteam-md.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    So, ich hab mich mal informiert. LIMIT gibt es bei Access nicht, warum auch immer ?( .
    Dann musst du wohl doch per Quelltext an die Sache ran...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    ok, die sache hat sich erledigt; ich habs jetzt einfach mit ein paar tabellenerstellungsabfragen gelöst, die ich bei änderung der filterkriterien mit deleteObject lösche. das ganze dauert hat zwar einigen denkaufwand gekostet, es bringt meine abfragen aber in sehr kurzer zeit zu stande.
    das problem, dass sich die datenbank durch dauerndes ändern heftig aufbläht hab ich einfach dadurch gelöst, dass ich eine zusätzliche mdb vorgeschaltet hab, die jeden monat via prozeduraufruf die datenbank automatisch komprimiert.

    trotzdem danke für die unterstützung, ich werd mal anregen, dass ein sql-server beschafft wird ;)

    gruß
    abaddon
    Hallo allerseits,

    ist zwar anscheinend schon zu spät aber ich möchte an dieser Stelle zu dem Thema auch nochmal meinen Senf dazugeben.

    Den Befehl LIMIT gibt es z. B. beim MS SQL Server nicht.
    Es gibt aber TOP (select top 10 * from artikel where artikelnr > 1000) der wie in diesem Beispiel die ersten 10 Datensätze zurückgibt.

    Die ersten 5 Datensätze die auf den Plätzen 11 bis 21 liegen könnte man am SQL Server so lösen:

    select top 5 * from (
    select
    (select count(*) from artikel tmp1 where tmp1.id < ast.id) as rank, *
    from artikel ast where Kundennummer = '007') as tmp2 where rank between 11 and 21

    Die innerste Abfrage erzeugt einen fortlaufenden Zähler, in der äusseren sind die Begrenzungen auf die ersten 5 Datensätze aus dem Bereich 11 bis 21 des voher erzeugten Zählers (Rank).

    gruß

    Mike