Wie kann ich den Zugriff auf die ausgewählten Zeilen in Access?
Ich habe ein Formular, das enthält eine Daten-Blatt. Ich möchte es für einen Benutzer möglich, mehrere Zeilen auszuwählen, klicken Sie auf eine Schaltfläche, und einige sql-Abfrage ausführen und führen Sie einige arbeiten für diese Zeilen.
Blick durch mein VBA-code, ich sehe, wie kann ich den Zugriff auf die zuletzt gewählten Datensatz über die CurrentRecord-Eigenschaft. Noch sehe ich nicht, wie kann ich wissen, welche Zeilen ausgewählt wurden in einer Mehrfachauswahl. (Ich hoffe, ich bin klar...)
Was ist der standard-Weg, dies zu tun? Access-VBA-Dokumentation ist etwas dunkler im Netz...
Dank!
InformationsquelleAutor karlipoppins | 2009-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der code, es zu tun, aber es gibt einen Haken.
Hier ist der Haken:
Wenn der code Hinzugefügt, um eine Taste, sobald der Benutzer auf diese Schaltfläche klickt, wird die Auswahl verloren im Netz (selheight wird null sein). So müssen Sie erfassen diese Informationen, und speichern Sie es zu einem Modul Ebene-variable entweder mit einem timer oder sonstige Ereignisse, auf die form.
Hier ist ein Artikel, der beschreibt, wie die Arbeit rund um den catch-in einigen Details.
http://www.mvps.org/access/forms/frm0033.htm
Fang 2: Dies funktioniert nur mit zusammenhängenden Auswahl. Sie können nicht wählen Sie mehrere nicht aufeinander folgenden Zeilen im raster.
Update:
Gibt es vielleicht eine bessere Falle zu Falle, aber hier ist eine funktionierende Implementierung mithilfe des Formular.timerinterval-Eigenschaft, die ich getestet habe (zumindest in Access 2k3, aber 2k7 sollte gut funktionieren)
Dieser code wird in das UNTERFORMULAR, verwenden Sie die Eigenschaft, um die selheight-Wert in die master-form.
hmm kann es nicht zu funktionieren... Mit Access 2007, selheight bleibt bei 0...
Der trick ist, greifen Sie den Wert, bevor es den Fokus verliert. In welches Ereignis beziehst du die selheight-Wert? Haben Sie versucht, es in einen timer im Unterformular? Überprüfen Sie den Wert im Direktfenster (Strg-g) und sehen, ob das Problem ist die Auswahl zurücksetzen, nachdem Sie verloren den Fokus.
Wird ein Ereignis registriert, jedes mal, wenn der Benutzer auf ein Element zu wählen? Wenn ja, könnten Sie das Ereignis, um alles aufzuzeichnen, was der Benutzer ausgewählt hat, jedes mal, wenn Sie klicken. Es ist wiederholend, sicher, aber es scheint zu garantieren, dass Sie immer die aktuellste Liste der ausgewählten Elemente, wenn die änderungen den Fokus auf das button-Steuerelement.
Ich habe einen code auf meine Antwort, dass zeigt, wie dies mit der TimerInterval-event. Könnte es ein besseres Ereignis, dass ist mehr eng verbunden mit der Veränderung der Auswahl, aber ich bin mir nicht sicher, offhand, was es ist. Ich habe versucht SelectionChange (das schien am geeignetsten, aber es funktionierte nicht für mich). Möchten Sie vielleicht Experimentieren Sie einfach mit dem verschieben der code, um die Ereignisse, die sehen vielversprechend aus, bis Sie ein gutes Ergebnis erhalten. Schlimmsten Fall die timerinterval-Methode funktioniert.
InformationsquelleAutor JohnFx
Benutzte ich die Technik, ähnlich wie JohnFx
Falle für die Auswahl der Höhe, bevor es wieder verschwindet ich verwendet das Exit-Ereignis des Unterformular-Steuerelements im Hauptformular.
So, in der Main form:
InformationsquelleAutor DJ.
Habe ich versucht, etwas ähnliches vor, aber ich hatte nie Erfolg mit einer Methode erforderlich, dass die Benutzer mehrere Zeilen auswählen, im gleichen Stil wie ein Windows-Datei-Dialog (Strg, Shift, etc.).
Eine Methode, die ich verwendet habe, ist die Verwendung von zwei Listenfelder. Die Benutzer können doppelklicken Sie auf ein Element in dem linken Listenfeld aus, oder klicken Sie auf eine Schaltfläche, wenn ein Element ausgewählt ist, und es wird zu bewegen, um das Rechte Listenfeld.
Andere Möglichkeit ist die Verwendung einer lokalen Tabelle, der gefüllt ist mit deiner Quelle Daten sowie Boolesche Werte dargestellt, die als Checkboxen im Unterformular. Nachdem der Benutzer die Daten, die Sie wollen, indem Sie auf die Checkboxen der Benutzer eine Taste drückt (oder anderen Veranstaltungen), zu welcher Zeit Sie gehen direkt auf die zugrunde liegende Tabelle der Daten und der Abfrage nur die Zeilen, die geprüft wurden. Ich denke, diese option ist die beste, obwohl es erfordert ein wenig code, um richtig zu arbeiten.
Sogar in Access, ich finde manchmal ist es einfacher, zur Arbeit mit den Tabellen und Abfragen direkt, anstatt zu versuchen, verwenden Sie die integrierten tools in Access-Formulare. Manchmal ist die eingebaute tools nicht genau das tun, was Sie wollen.
Welche Access-version benutzt du? Ich benutze Access 2002 bei der Arbeit. Interessanterweise habe ich gerade blätterte durch die "Access 2002 Developer 's Handbook" (Als Access Developer ' s Bibel), und Sie haben eine Klasse, die Sie erstellt namens MultiPik. Diese Klasse nicht ermöglicht die Auswahl mehrerer Elemente zu einem Zeitpunkt, aber Sie sagen, es ist langsam, wenn Sie haben Tonnen von Elemente (Sie sagen, 300 Elemente langsam ist). Wenn du interessiert bist, kann ich schauen in die Rechtmäßigkeit der Buchung den code für diese Klasse auf Stack Overflow. Lassen Sie es mich wissen.
nun, ich bin mit 2007 und meine Tabelle hat mehr als 10k Einträge, so dass wahrscheinlich nicht gut funktionieren würde..
Zu sehen, wie Fangen 2 von JohnFx Antwort kann verhindern, dass Ihre Lösung von der Arbeit, willst du mir zeigen, wie Sie tun, um die option 2 aus meiner Lösung oben? Es würde mich eine kleine Weile zu geben, den code, so werde ich gerne tun, wenn Sie möchten, um es zu sehen.
Angesichts der Unfähigkeit der Auswahl in einem Unterformular-Steuerelement, um nicht-zusammenhängende, ich denke, eine multiselect-listbox oder ein boolean-Kontrollkästchen in eine temp-Tabelle ist vorzuziehen. Ich benutze immer letzteres, auch von mir. Es ist wirklich einfach zu implementieren und die Nutzer zu verstehen, wie es funktioniert (Sie sind nicht so bequem mit multiselect-Listboxen, auch die "einfache" version, das ist ein Schmerz für die Auswahl mehrerer Elemente (d.h., die SHIFT-Taste, die nichts tut).
InformationsquelleAutor Ben McCormack
Einen workaround, um die Auswahl Verlust, wenn das Unterformular den Fokus verliert ist das speichern der Auswahl in das Exit-Ereignis (wie schon von anderen erwähnt).
Eine schöne Ergänzung ist, um es wieder sofort, mit timer, so dass der Benutzer noch in der Lage, um zu sehen, die Auswahl die er getroffen hat.
Hinweis: Wenn Sie möchten, verwenden Sie die Auswahl in einem button-handler, die Auswahl kann nicht wiederhergestellt werden, schon, wenn es ausgeführt wird. Stellen Sie sicher, dass Sie die gespeicherten Werte aus den Variablen oder fügen Sie ein DoEvents zu Beginn der Ereignishandler der Schaltfläche zu lassen, der timer-handler zuerst ausgeführt.
InformationsquelleAutor prossel
Gibt es eine andere Lösung.
Den code unten zeigen die Anzahl der ausgewählten Zeilen zurückgegeben, sobald Sie die Maustaste loslassen.
Das speichern dieser Wert wird den trick tun.
Dies funktioniert gut, aber beschränkt sich nur auf Maus-Operationen. Die Tastatur kann auch verwendet werden, um markieren Sie mehrere Spalten und Zeilen, aber das wird nicht diejenigen erfassen. Leider, das KeyPress-und KeyUp-Ereignisse scheinen nicht zu erfassen, die Kontrolle und die Pfeiltasten beim navigieren rund um ein Datenblatt. Die anderen Lösungen gepostet unter Einbeziehung der Eltern-Exit-Ereignis sind allgemein und nicht abhängig von der Auswahlmethode.
InformationsquelleAutor user2777544
Verwenden Sie eine Globale variable in der form, dann finden Sie, dass in den code der Schaltfläche.
InformationsquelleAutor larryP
Warum nicht ein array oder recordset und dann jedes mal, wenn der Benutzer klickt auf eine Zeile (entweder zusammenhängend oder nicht, speichern Sie die Zeile oder eine id, die in das recordset. Dann, wenn Sie auf die Schaltfläche in der übergeordneten form, einfach Durchlaufen des Recordsets gespeichert wurde, zu tun, was Sie wollen. Nur vergessen Sie nicht, deaktivieren Sie das array oder recordset, nachdem auf die Schaltfläche geklickt wird.?
InformationsquelleAutor baldguy70
Andere Problemumgehung zu halten, die Selektion, während der Ausführung einer Prozedur - Stattdessen verlassen Sie das Datenblatt zu aktivieren, eine Taste, verwenden Sie einfach die OnKeyDown-event und definieren einen bestimmten keycode und shift-Kombination Ausführung von code.
InformationsquelleAutor Bill Rigley
Den code von JohnFx gut funktioniert. Implementiert habe ich es ohne timer (MS-Access 2003):
1 - Legen Sie das Formular Taste Vorschau, um ja
2 - setzen Sie den code in eine Funktion
3 - legen Sie das Ereignis OnKeyUp und OnMouseUp, um die Funktion aufzurufen.
InformationsquelleAutor Jean-Marc