Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1700to1704
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Teilbereich aus Recordset mit ADO GetRows

Teilbereich aus Recordset mit ADO GetRows
19.07.2019 09:52:01
Mikkey
Hallo zusammen,
ich bin ratlos und muss deshalb wieder mal auf Eure geschätzte Hilfe hoffen.
Ich versuche aus einer Access-Datenbank verschiedene Reports zu erstellen. Dazu rufe ich die Daten per ADO ab. Da die Anordnung des Reports sehr dynamisch ist (inkl. Kalkulationsspalten, die in der Datenbank natürlich nicht vorhanden sind) und grundsätzlich die Ausführungszeit sekundär wichtig ist, möchte ich den gefundenen Recordset zunächst in ein Array überführen, dieses wie benötigt manipulieren und das Endresultat danach in das Datenblatt ausgeben.
Das funktioniert soweit generell auch ganz gut für kleine Ergebnismengen, nur: Die Ergebnismenge geht je nach Abrufkriterien sehr schnell über die Grenzen hinaus und Excel bricht wegen einem Speicherfehler ab, egal ob ich die Daten per CopyFromRecordset oder mit getRows abrufe. Ich habe versucht, die Daten zunächst mal ins Datenblatt zu schreiben, aber auch dann kein Erfolg.
Meine Idee: Mit GetRows kann ja mittels Parameter ein Teilbereich aus einem Recordset abgerufen werden. Nun wollte ich Teil für Teil das Recordset auslesen und laufend an ein Array anhängen (im Code durch Aufruf der Funktion Copy_Array, diese funktioniert auch) oder alternativ schlimmstenfalls zumindest fortlaufend in das Datenblatt kopieren. Leider scheine ich aber die Parameter irgendwie falsch zu interpretieren. Der erste Aufruf mit Parameter 0, dh. ab erstem resp. aktuellem Record, funktioniert, bei der 2. Schleife gibt es leider einen Fehler.
Sieht einer von Euch gleich, was mein Denkfehler ist? Habe ich was grundsätzlich nicht verstanden? Danke im Voraus für Eure Hilfe!
Lg Mikkey
Info zur Funktion: Aufruf mittels Parameter rs = Recordset und MaxImport = Anzahl der gleichzeitig zu importierenden Records.
Public Function Recordset_to_Array(rs As Object, MaxImport As Long) As Variant
Dim Start               As Long
Dim TotalRows           As Long
Dim arrTemp             As Variant
Dim arrTemp2            As Variant
ReDim arrTemp2(0, 0)
rs.movefirst
Start = 0
TotalRows = rs.RecordCount
Do While TotalRows - Start > MaxImport
arrTemp = rs.GetRows(MaxImport, Start)
Start = Start + MaxImport
arrTemp2 = Copy_Array(arrTemp, arrTemp2)
Loop
arrTemp = rs.GetRows(-1, Start)
arrTemp2 = Copy_Array(arrTemp, arrTemp2)
Recordset_to_Array = arrTemp2
Erase arrTemp
Erase arrTemp2
End Function

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Teilbereich aus Recordset mit ADO GetRows
19.07.2019 10:57:57
Luschi
Hallo Mikkey,
ich mache das ein bischen anders:
- in der Access-DB gibt es eine Dummy-Abfrage
- in diese schreibe ich von Excel aus per ADOX den SQL-Abfrage-Code
  einschließlich den erforderlichen JOINS, wenn mehrere Access-Tabellen beteiligt sind
  und natürlich den Bedingungen (WHERE) usw.
- und speichere dann diese Dummy-Abfrage
- per ADODB hole ich dann die Daten dieser Abfrage in 1 ADODB-Recordset und
- mit CopyFromRecordset schreibe ich die Daten in eine Excel-Tabelle
Gruß von Luschi
aus klein-Paris
AW: Teilbereich aus Recordset mit ADO GetRows
19.07.2019 11:23:31
Mikkey
Hallo Luschi,
zunächst danke für Deine Antwort. Diese ist sehr interessant (neuer Gedankenansatz), ich bin aber nicht sicher, ob sie mein Problem löst.
Auch mit Deiner Vorgehensweise überträgst Du ja schlussendlich ein ADODB-Recordset an Excel und trägst die Daten ins Sheet ein, richtig? Wenn dann dein Recordset sehr gross ist (wie leider in meinem Fall), dann wird Excel diesen doch auch so nicht verarbeiten können (weil ja eben schlicht zu gross), oder sehe ich das falsch?
Lg Marc
Anzeige
AW: Teilbereich aus Recordset mit ADO GetRows
19.07.2019 11:39:53
Luschi
Hallo Marc,
bei Massendaten mache ich es dann so:
- per ADOX die Access-Abfrage formulieren und speichern
- per PowerQuery (PQ) diese Access-Abfrage in das Datenmodell einlesen
- und weitere SChritte in PQ organisieren
- und zum Schluß die Enddaten in Exel übernehmen
Da hinter dem Datenmodell ein entschlackter SQL-Server steht, sollte der PC nicht gerade von vor-vor-gestern sein.
Wenn Deine Excelversion (Office 2010) stimmt, muß dieses Excel-COM-AddIn nachträglich installiert werden (gibt es kostenlos auf den M$-Seiten). Alles Andere ist tot-organisieren mit Vba-Code.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Teilbereich aus Recordset mit ADO GetRows
19.07.2019 13:01:13
Mikkey
Hey Luschi,
danke für die Rückmeldung. Solche Antworten lassen mich immer wieder bezweifeln, ob ich mein eigenes Können betreffend VBA wirklich als gut bezeichnen sollte;-)
Das ADOX eine Erweiterung von ADO ist, glaube ich bereits verstanden zu haben. Du steuerst damit quasi Access fern, lässt die Abfrage durch Access ausführen und rufst das Ergebnis danach ab, kann man das grob so sagen?
Frage: Du hast nicht per Zufall einen Beispielcode anhand dessen ich mich an das Thema rantasten könnte?
AW: Teilbereich aus Recordset mit ADO GetRows
21.07.2019 07:46:04
Luschi
Hallo Marc,
hier mal ein Testbeispiel. Entpacke die Zip-Datei in ein leeres Verzeichnis und starte die xlsm-Datei.
Erklärungen findest Du in den Kommentaren des Vba-Codes.
https://www.herber.de/bbs/user/131010.zip
Gruß von Luschi
aus klein-Paris
Anzeige
HERZLICHEN DANK!
21.07.2019 09:16:53
Marc
Hallo Luschi,
ganz herzlichen Dank, es ist nicht selbstverständlich, dass Du Dir die Zeit genommen hast, mir diese Datei zukommen zu lassen. Ich weiss das sehr zu schätzen! Ich frage mich gerade, ob Du für alle Probleme gleich Beispieldateien rumliegen hast, oder ob Du Dir effektiv die Zeit genommen hast, das für mich zusammenzustiefeln...
Darin enthalten ist effektiv alles, damit ich das nachvollziehen kann, verständlich dokumentiert, sogar mit Alternativen (z.B. Early/Late Binding, das war z.B. für mich ne Frage, ich arbeite bevorzugt mit Late Binding). Auch die Erklärung, dass Access die WHERE-Bedingungen nicht auswertet, ist für mich hilfreich.
Anhand dieses Beispiels sollte ich effektiv bei meinem Problem einen guten Schritt weiterkommen.
Ich wünsche Dir einen ganz schönen Sonntag
Lg Marc
Anzeige
AW: Teilbereich aus Recordset mit ADO GetRows
22.07.2019 20:05:04
Mikkey
Dank der Hilfe von Luschi habe ich das Problem anders praktisch gelöst, habe aber zu meiner ursprünglichen Frage trotzdem noch die Antwort gefunden. Vielleicht sucht ja sonst mal jemand nach einer ähnlichen Lösung, deshalb here we go:
Public Function Recordset_to_Array(rs As Object, MaxImport As Long) As Variant
Dim arrTemp             As Variant
Dim arrTemp2            As Variant
ReDim arrTemp2(0, 0)
rs.movefirst
Do While Not rs.EOF
arrTemp = rs.GetRows(MaxImport, rs.bookmark)
arrTemp2 = Copy_Array(arrTemp, arrTemp2)
'-> Hiermit hänge ich arrTemp mit einer separaten Funktion an arrTemp2 an
Loop
Recordset_to_Array = arrTemp2
Erase arrTemp
Erase arrTemp2
End Function

Anzeige
AW: Teilbereich aus Recordset mit ADO GetRows
22.07.2019 21:01:40
Luschi
Hallo Marc,
die ursprüngliche Herangehensweise doch noch zu retten ist zwar löblich, aber eben nicht produktiv:
- Select-Abfragen an Access werden zwar realisiert
- aber die Where-Bedingung in der Abfrage wird erst auf dem Zielrechner ausgewertet
- solche Sammel-Container-Access-Dateien liegen meistens im Netzwerk
- und so kommen Mengen an ungefilterten Recordsets am Zielrechner an
- und erst hier wird der Filter ausgewertet
- Access ist eben einfacher gestrickt und kein SQL-Server
- der ja die Aufgabe hat: Entgegennehmen - Verarbeiten - Ergebnissen weiterleiten
- die Datenflut hinterher einzudämmen ist eindeutig zu spät
Gruß von Luschi
aus klein-Paris
PS: Dieses Problem habe ich in einem vor 5 Jahren zurückliegenden Versuch mit Studenten der Materialwirtschaft in einem Seminar durchexerziert
und dem SQL-Server konnte keiner das Wasser reichen
aber die erarbeitete ADOX-Variante konnte sich auch sehen lassen.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige